Aplikasi Python menggunakan banyak skrip. Inilah yang digunakan penjahat dunia maya untuk menaruh "babi" pada kita - tempat yang paling tidak kita duga.
Salah satu kelebihan Python adalah kemudahan penggunaannya: untuk menjalankan skrip, Anda hanya perlu menyimpannya dalam
.pyfile dan menjalankan perintah python (, python my_file.py). Juga mudah untuk memecah file kita, seperti modul my_app.pydan my_lib.pyterus menghubungkan modul menggunakan desain import...from: import my_lib from my_app.py.
Namun, kesederhanaan dan kemudahan ini memiliki sisi negatif: semakin mudah bagi Anda untuk mengeksekusi kode dari lokasi yang berbeda, semakin banyak peluang bagi penyerang untuk ikut campur.
Tempatkan kode Python di tempat yang aman
Model keamanan Python didasarkan pada tiga prinsip:
- , sys.path , .
- , (main), sys.path.
-
python,-c-m.
Misalkan Anda ingin menjalankan aplikasi Python yang telah diinstal "dengan benar" di mesin Anda. Dalam kasus ini, satu-satunya lokasi (selain folder dengan Python diinstal) yang akan secara otomatis ditambahkan ke sys.path Anda secara default adalah folder dengan skrip utama atau file yang dapat dieksekusi.
Misalnya, jika
pipsudah masuk /usr/bin, dan Anda menjalankan /usr/bin/pip, maka sys.pathhanya akan ditambahkan /usr/bin. Hanya root yang dapat menulis file ke / usr / bin, jadi lokasi ini dianggap aman.
Namun demikian, perjanjian mengharuskan kita untuk melakukannya:
/path/to/python -m pip. Ini menghindari masalah dengan $PATHdan konflik dengan dokumentasi Windows.
Secara umum, semuanya akan baik-baik saja, jika hanya Anda sendiri yang memiliki otoritas untuk menambah dan mengedit file di direktori tempat Python mengambil modul untuk diimpor.
Folder unduhan - lokasi rentan
Ada banyak cara untuk memaksa browser (dan terkadang perangkat lunak lain) untuk menempatkan file dengan nama sewenang-wenang di folder Unduhan tanpa sepengetahuan pengguna. Kerentanan ini dimanfaatkan oleh serangan yang disebut DLL Spoofing. Dalam kasus kami, kami akan berbicara tentang skrip Python, tetapi idenya sama.
Peramban menjadi lebih serius tentang hal ini dan secara bertahap mencoba memastikan bahwa situs yang dikunjungi oleh pengguna tidak dapat secara diam-diam memasukkan file ke dalam folder Unduhan.
Akan tetapi, masalah ini akan sangat sulit untuk diselesaikan sepenuhnya: misalnya, masih tersedia opsi
Content-Disposition HTTP header’s filename*yang memungkinkan situs memilih direktori untuk menempatkan file yang diunduh.
Bagaimana serangan itu bekerja
Anda menjalankan instalasi:
python -m pip. Anda mengunduh paket Python dari situs web yang sepenuhnya tepercaya, yang karena alasan tertentu, bagaimanapun, menawarkan unduhan langsung daripada PyPI. Mungkin ini semacam versi internal, mungkin ini rilis pendahuluan - tidak ada perbedaan. Jadi itu untuk Anda totally-legit-package.whl:
~$ cd Downloads
~/Downloads$ python -m pip install ./totally-legit-package.whl
Tampaknya tidak apa-apa, tetapi ternyata dua minggu lalu di situs yang sama sekali berbeda yang Anda kunjungi, beberapa XSS JavaScript mengunduh pip.py dengan perangkat lunak jahat ke dalam folder Unduhan Anda tanpa sepengetahuan Anda.
Ledakan!
Jatuh!
~$ mkdir attacker_dir
~$ cd attacker_dir
~/attacker_dir$ echo 'print("lol ur pwnt")' > pip.py
~/attacker_dir$ python -m pip install requests
lol ur pwnt
Perilaku aneh PYTHONPATH
Beberapa paragraf di atas, saya tulis:
satu-satunya lokasi (selain folder yang diinstal Python) yang secara otomatis akan ditambahkan ke sys.path Anda secara default adalah skrip utama atau folder yang dapat dieksekusi.
Jadi, apa yang dilakukan "default" di sini? Lokasi lain apa yang dapat Anda tambahkan?
Pada dasarnya,
$PYTHONPATHAnda dapat menulis apa saja ke variabel lingkungan . Tapi Anda tidak akan menulis lokasi Anda saat ini $PYTHONPATH, bukan?
Sayangnya, ada situasi di mana Anda mungkin tidak sengaja melakukan ini.
Mari membuat sketsa aplikasi Python yang "rentan" untuk ilustrasi:
# tool.py
try:
import optional_extra
except ImportError:
print("extra not found, that's fine")
Mari buat 2 direktori:
install_dirdan attacker_dir. Mari kita gagal install_dir, lalu jalankan cd attacker_dirdan tempatkan kode berbahaya kita di sana dengan nama tool.py:
# optional_extra.py
print("lol ur pwnt")
Yang tersisa hanyalah menjalankannya:
~/attacker_dir$ python ../install_dir/tool.py
extra not found, that's fine
Sejauh ini, semuanya berjalan dengan baik.
Tapi sekarang kita akan melihat kesalahan umum. Banyak orang merekomendasikan menambahkan satu hal
$PYTHONPATH lagi :
export PYTHONPATH="/new/useful/stuff:$PYTHONPATH";
Sekilas, ini masuk akal: jika Anda menambahkan proyek X ke
$PYTHONPATH, mungkin, menurut proyek Y, ada sesuatu yang ditambahkan di sana juga, atau mungkin tidak; bagaimanapun juga, Anda tidak ingin menimpa perubahan yang terkait dengan proyek lain. Ini sangat penting terutama saat Anda menulis dokumentasi yang akan digunakan banyak orang.
Dan sekarang kita dihadapkan pada perilaku "aneh"
$PYTHONPATH. Jika $PYTHONPATHkosong atau tidak diinstal sebelum peluncuran pertama , baris kosong akan muncul di dalamnya, yang akan dikenali sebagai direktori saat ini. Mari kita periksa:
~/attacker_dir$ export PYTHONPATH="/a/perfectly/safe/place:$PYTHONPATH";
~/attacker_dir$ python ../install_dir/tool.py
lol ur pwnt
Untuk keamanan tambahan, biarkan
$PYTHONPATHkosong dan coba lagi:
~/attacker_dir$ export PYTHONPATH="";
~/attacker_dir$ python ../install_dir/tool.py
lol ur pwnt
Tepat sekali, itu tidak aman sama sekali!
Dan satu hal lagi: ternyata situasi ketika variabel
$PYTHONPATHkosong dan ketika variabel $PYTHONPATHtidak disetel adalah dua cerita yang berbeda:
os.environ.get("PYTHONPATH") == ""</code> <code>os.environ.get("PYTHONPATH") == None.
Jika Anda ingin memastikan untuk membersihkan
$PYTHONPATH, gunakan perintah unset:
~/attacker_dir$ python ../install_dir/tool.py
extra not found, that's fine
Secara umum, menulis ke variabel
$PYTHONPATHadalah cara paling umum untuk menyiapkan lingkungan untuk menjalankan aplikasi Python. Untungnya, itu keluar dari gaya dengan munculnya lingkungan virtual dan virtualenv. Jika Anda memiliki konfigurasi lama yang menulis sesuatu $PYTHONPATH, tetapi Anda dapat melakukannya tanpanya, maka sekaranglah waktunya untuk menghapusnya.
Jika karena alasan tertentu Anda tidak dapat melakukan ini, gunakan life hack :
export PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}new_entry_1"
export PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}new_entry_2"
Di bash dan zsh, ini akan menghasilkan keluaran:
$ echo "${PYTHONPATH}"
new_entry_1:new_entry_2
Nah, sekarang tidak ada titik dua tambahan dan entri kosong.
Terakhir, jika Anda masih bekerja
$PYTHONPATH, gunakan jalur absolut. Selalu!
Masalahnya jauh lebih serius
Ada beberapa opsi untuk perkembangan berbahaya dari peristiwa yang terkait dengan peluncuran file Python dari folder Downloads:
- Menjalankan python
~/Downloads/anything.py(meskipun itu sendirianything.pyaman). Folder Unduhan Anda akan ditambahkan kesys.path. - Setelah diluncurkan,
jupyter notebook ~/Downloads/anything.ipynbfolder Unduhan juga akan ditambahkan kesys.path.
Oleh karena itu, lebih baik hapus file .py dan .ipynb dari folder ini sebelum dijalankan.
Eksekusi
cd Downloadsdan peluncuran berikutnya python -cdengan instruksi importdi dalam atau peluncuran interaktif pythondengan impor berikutnya tidak sepenuhnya menyelesaikan masalah jika file yang diimpor ada di folder Unduhan.
Sayangnya, ini
~/Downloads/bukan satu-satunya lokasi yang dapat berisi file berbahaya. Misalnya, jika Anda mengelola server tempat pengguna dapat mengunggah file, pastikan tidak ada yang dapat memulai cd public_uploadssebelum menjalankan perintah python.
Dalam kasus ini, mungkin perlu dipertimbangkan bahwa kode yang menangani file yang diunggah ditambahkan ke namanya
.uploaded. Ini akan membantu menghindari eksekusi skrip yang tidak direncanakan .py.
Perhatian
Jika Anda memiliki aplikasi yang ditulis dengan Python yang ingin Anda gunakan saat berada di folder Downloads Anda, buatlah aturan untuk memasukkan path ke script (
/ path / to / venv / bin / pip), bukan module ( / path / to / venv / bin / python -m pip).
Secara umum, hindari menggunakan Downloads sebagai direktori kerja Anda saat ini dan pindahkan skrip apa pun yang ingin Anda gunakan ke lokasi yang lebih sesuai sebelum memulai.
Penting untuk memahami dari mana Python mendapatkan kode yang akan dieksekusi. Membiarkan seseorang mengeksekusi bahkan satu baris saja dari skrip Python kiri sama saja dengan memberikan kendali penuh atas komputer Anda!
Dengan kebutuhan
Membaca artikel semacam itu dengan "tips dan retasan hidup" tentang keamanan, sangat mudah untuk berasumsi bahwa penulis sangat cerdas, mengetahui banyak hal kecil yang harus diketahui orang lain dan terus-menerus memikirkannya. Namun nyatanya, hal tersebut tidak sepenuhnya benar. Saya akan menjelaskan.
Selama bertahun-tahun, saya telah mengamati dengan frekuensi yang membuat iri bagaimana pengguna tidak memahami dari mana Python mengunduh kode. Misalnya, orang meletakkan program pertama mereka menggunakan Twisted dalam file bernama twisted.py. Tetapi dalam kasus ini, impor perpustakaan tidak mungkin dilakukan!
Penjahat dunia maya lebih senang jika mereka berhasil menyerang administrator atau pengembang sistem. Jika Anda meretas pengguna, Anda akan mendapatkan data pengguna tersebut. Tetapi jika Anda meretas administrator atau pengembang dan melakukannya dengan benar, maka Anda dapat memperoleh akses ke ribuan pengguna yang sistemnya berada di bawah kendali administrator, atau bahkan jutaan pengguna yang menggunakan perangkat lunak pengembang.
Oleh karena itu, “berhati-hatilah sepanjang waktu” bukanlah resep yang dapat diandalkan. Para profesional TI yang bertanggung jawab atas produk dengan jumlah pengguna yang banyak benar-benar perlu lebih berhati-hati. Paling tidak, mereka harus diberi tahu tentang kekhasan pekerjaan alat pengembangan tertentu.
Bug atau fitur ...
Tak satu pun dari apa yang saya jelaskan di atas sebenarnya adalah "bug" atau "kerentanan" yang nyata. Saya tidak berpikir pengembang Python atau Jupyter melakukan sesuatu karena kesalahan. Sistem bekerja dengan cara yang dirancang dan itu mungkin bisa dijelaskan. Secara pribadi, saya tidak tahu bagaimana sesuatu dapat diubah di dalamnya tanpa membatasi kekuatan Python yang sangat kami hargai.
Salah satu penemuan favorit saya adalah SawStop, sistem keamanan unik untuk gergaji meja. Ini memungkinkan Anda untuk menghentikan rotasi mata gergaji dalam 5 milidetik - setelah bersentuhan dengan tubuh manusia. Sebelum penemuan sistem ini, gergaji meja adalah alat yang sangat berbahaya, tetapi mereka melakukan fungsi produksi yang penting. Banyak hal yang sangat berguna dan penting telah dilakukan pada gergaji meja. Namun, juga benar bahwa gergaji meja menyumbang sebagian besar kecelakaan di toko-toko pertukangan. SawStop sekarang menghemat banyak jari setiap tahun.
Jadi, dengan merinci kompleksitas skrip Python, saya juga berharap dapat memberikan beberapa pemikiran kepada beberapa insinyur keamanan. Dapatkah SawStop dibuat untuk mengeksekusi kode arbitrer untuk interpreter interaktif? Solusi apa yang dapat mencegah beberapa masalah di atas?
Tetap aman berteman.
Periklanan
VDSina menawarkan server aman di Linux atau Windows - pilih salah satu OS yang sudah diinstal sebelumnya, atau instal dari gambar Anda.
