
Pada 7 Agustus, Facebook memperkenalkan Pysa, penganalisis statis yang berfokus pada keamanan sumber terbuka yang membantu Anda bekerja dengan jutaan string Instagram. Batasan diungkapkan, keputusan desain disentuh dan, tentu saja, cara untuk membantu menghindari kesalahan positif. Situasi ini ditampilkan saat Pysa paling berguna, dan kode di mana penganalisis tidak berlaku. Detail dari blog Rekayasa Facebook sedang dipotong.
Tahun lalu, kami menulis tentang cara kami membuat Zoncolan , alat analisis statis yang menganalisis lebih dari 100 juta baris kode Peretasan dan membantu teknisi mencegah ribuan potensi masalah keamanan. Sukses menginspirasi Pysa - Python Static Analyzer. Parser dibangun di atas Pyre, alat pemeriksa jenis Python Facebook. Pysa bekerja dengan aliran data dalam kode. Analisis aliran data berguna karena seringkali masalah keamanan dan privasi dimodelkan sebagai data yang mengalir ke tempat yang tidak semestinya.
Pysa membantu mengidentifikasi banyak jenis masalah. Penganalisis memeriksa apakah kode tersebut menggunakan struktur internal tertentu dengan benar untuk mencegah akses atau pengungkapan data pengguna berdasarkan kebijakan privasi teknis. Selain itu, penganalisis mendeteksi masalah keamanan aplikasi web umum seperti XSS dan injeksi SQL. Seperti Zoncolan, alat baru ini telah membantu meningkatkan upaya keamanan aplikasi Python. Ini terutama berlaku untuk Instagram.
Pysa di Instagram
Repositori Python terbesar di Facebook adalah jutaan baris di server Instagram. Saat Pysa dijalankan pada perubahan kode yang disarankan pengembang, Pysa memberikan hasil dalam waktu sekitar satu jam, bukan dalam beberapa minggu atau bulan yang mungkin diperlukan untuk memeriksa secara manual. Ini membantu Anda menemukan dan mencegah masalah dengan cukup cepat sehingga tidak masuk ke basis kode Anda. Hasil pemeriksaan dikirim langsung ke pengembang atau teknisi keselamatan, tergantung pada jenis masalah dan rasio signal-to-noise dalam situasi tertentu.
Pysa dan Open Source
Kode sumber Pysa dan banyak definisi masalah terbuka bagi pengembang lain untuk menganalisis kode proyek mereka. Kami bekerja dengan kerangka kerja sisi server sumber terbuka seperti Django dan Tornado , jadi dari peluncuran pertama di dalam Facebook, Pysa menemukan masalah keamanan dalam proyek yang menggunakan kerangka kerja ini. Menggunakan Pysa untuk kerangka kerja yang belum memiliki cakupan biasanya semudah menambahkan beberapa baris konfigurasi. Anda hanya perlu memberi tahu penganalisis dari mana data tersebut berasal ke server.
Pysa telah digunakan untuk mendeteksi masalah seperti CVE-2019-19775 dalam proyek Python open source. Kami juga bekerja dengan proyek Zulip dan memasukkan Pysa dalam basis kodenya.
Bagaimana itu bekerja?
Pysa dirancang dengan pelajaran dari Zoncolan. Ia menggunakan algoritma yang sama untuk melakukan analisis statis dan bahkan berbagi kode dengan Zoncolan. Seperti Zoncolan, Pysa memantau aliran data dalam suatu program. Pengguna menentukan sumber data penting dan tujuan asal data tersebut. Dalam aplikasi keamanan, jenis sumber yang paling umum adalah titik di mana data yang dikontrol pengguna memasuki aplikasi, seperti kamus HttpRequest.GET di Django. Penerima biasanya jauh lebih bervariasi dan dapat menyertakan API yang sedang dijalankan. Misalnya,
evalatauos.open... Pysa secara berulang menjalankan putaran analisis untuk membuat ringkasan guna menentukan fungsi mana yang mengembalikan data dari sumber dan yang memiliki parameter mencapai tujuan. Ketika penganalisis mendeteksi bahwa sumber akhirnya terhubung ke penerima, masalah tersebut akan dilaporkan. Visualisasi proses ini adalah pohon dengan masalah di bagian atas dan sumber dan aliran di daun:
Untuk melakukan penguraian lintas prosedural - untuk mengikuti aliran data di antara panggilan fungsi - Anda harus dapat memetakan panggilan fungsi ke implementasinya. Untuk melakukan ini, Anda perlu menggunakan semua informasi yang tersedia dalam kode, termasuk tipe statis opsional, jika ada. Kami bekerja dengan Pyre untuk mengetahui informasi ini. Meskipun Pysa sangat bergantung pada Pyre dan kedua alat berbagi repositori yang sama, penting untuk dicatat bahwa ini adalah produk terpisah dengan aplikasi terpisah.
Positif palsu
Insinyur Keamanan adalah pengguna utama Pysa di Facebook. Seperti teknisi lainnya yang bekerja dengan alat pendeteksi kesalahan otomatis, kami harus mencari cara untuk menangani positif palsu (tidak ada masalah, tidak ada sinyal) dan negatif (tidak ada masalah, tidak ada sinyal).
Desain Pysa bertujuan untuk menghindari masalah yang diabaikan dan mendeteksi masalah nyata sebanyak mungkin. Namun, mengurangi jumlah alarm palsu dapat memerlukan pengorbanan yang meningkatkan jumlah alarm yang tidak perlu. Terlalu banyak positif palsu menyebabkan kelelahan kecemasan dan risiko masalah nyata terabaikan dalam kebisingan. Pysa memiliki dua alat untuk menghilangkan sinyal yang tidak diinginkan: pembersih dan tanda.
PembersihApakah alat sederhana. Ini memberitahu parser untuk tidak mengikuti aliran data setelah aliran melewati fungsi atau atribut. Sanitizer memungkinkan Anda untuk menyandikan pengetahuan transformasi domain yang selalu menyajikan data dengan cara yang aman dan rahasia.
Tanda -tandanya lebih halus: mereka adalah potongan kecil metadata yang dilampirkan Pysa ke aliran data saat melacaknya. Tidak seperti pembersih, tanda tidak menghilangkan masalah dari hasil analisis. Atribut dan metadata lainnya dapat digunakan untuk memfilter hasil setelah analisis. Filter biasanya ditulis untuk pasangan sumber-tujuan tertentu untuk mengabaikan masalah ketika data telah diproses untuk tipe tertentu (tapi tidak semua tipe) dari sebuah tujuan.
Untuk memahami di situasi mana Pysa paling berguna, bayangkan bahwa kode berikut ini berjalan untuk memuat profil pengguna:
# views/user.py
async def get_profile(request: HttpRequest) -> HttpResponse:
profile = load_profile(request.GET['user_id'])
...
# controller/user.py
async def load_profile(user_id: str):
user = load_user(user_id) # Loads a user safely; no SQL injection
pictures = load_pictures(user.id)
...
# model/media.py
async def load_pictures(user_id: str):
query = f"""
SELECT *
FROM pictures
WHERE user_id = {user_id}
"""
result = run_query(query)
...
# model/shared.py
async def run_query(query: str):
connection = create_sql_connection()
result = await connection.execute(query)
...
Di sinilah potensi injeksi SQL di load_pictures tidak dapat dieksploitasi: fungsi ini selalu valid
user_iddari fungsi load_userdi load_profile. Jika dikonfigurasi dengan benar, Pysa mungkin tidak akan melaporkan masalah. Sekarang bayangkan bahwa seorang insinyur yang giat menulis kode tingkat pengontrol menyadari bahwa mengambil data pengguna dan gambar pada saat yang sama mengembalikan hasil lebih cepat:
# controller/user.py
async def load_profile(user_id: str):
user, pictures = await asyncio.gather(
load_user(user_id),
load_pictures(user_id) # no longer 'user.id'!
)
...
Perubahan tersebut mungkin terlihat tidak berbahaya, tetapi sebenarnya pada akhirnya menggabungkan string yang dikontrol pengguna
user_iddengan masalah injeksi SQL di load_pictures. Dalam aplikasi dengan banyak lapisan antara titik masuk dan kueri database, insinyur mungkin tidak menyadari bahwa data sepenuhnya dikontrol oleh pengguna, atau bahwa masalah injeksi tersembunyi dalam fungsi yang dipanggil. Ini persis situasi dimana penganalisis ditulis. Ketika seorang insinyur mengusulkan perubahan serupa di Instagram, Pysa menemukan bahwa data beralih dari input yang digerakkan oleh pengguna ke kueri SQL dan melaporkan masalahnya.
Batasan penganalisis
Tidak mungkin untuk menulis penganalisis statis yang sempurna . Pysa memiliki keterbatasan dalam ruang lingkup, aliran data dan keputusan desain, mengorbankan kinerja untuk akurasi dan akurasi. Python sebagai bahasa dinamis memiliki karakteristik unik yang mendasari beberapa keputusan desain ini.
Ruang masalah
Pysa dibuat untuk hanya mendeteksi masalah keamanan yang terkait dengan aliran data. Tidak semua masalah keamanan atau privasi dimodelkan sebagai aliran data. Lihat contoh:
def admin_operation(request: HttpRequest):
if not user_is_admin():
return Http404
delete_user(request.GET["user_to_delete"])
Pysa bukanlah alat yang tepat untuk memastikan bahwa pemeriksaan otorisasi
user_is_admindijalankan sebelum operasi dengan hak istimewa delete_user. Penganalisis dapat mendeteksi data dari request.GETdiarahkan ke delete_user, tetapi data tersebut tidak pernah melalui validasi user_is_admin. Kode dapat ditulis ulang untuk membuat masalah menjadi model Pysa, atau Anda dapat membuat pemeriksaan izin ke dalam operasi administratif delete_user. Tetapi kode ini pertama-tama menunjukkan masalah apa yang tidak diselesaikan Pysa.
Batasan sumber daya
Kami membuat keputusan desain tentang batasan sehingga Pysa dapat menyelesaikan analisis sebelum perubahan yang diusulkan membuatnya menjadi basis kode. Saat penganalisis memonitor aliran data di terlalu banyak atribut objek, terkadang Anda harus menyederhanakan dan memperlakukan seluruh objek secara persis berisi data tersebut. Ini dapat menyebabkan positif palsu.
Batasan lain adalah waktu pengembangan. Ini memaksa kompromi tentang fitur apa yang didukung Python. Pysa belum menyertakan dekorator dalam grafik panggilan saat memanggil fungsi dan oleh karena itu mengatasi masalah di dalam dekorator.
Python sebagai bahasa dinamis
Fleksibilitas Python membuat analisis statis menjadi sulit. Sulit untuk melacak aliran data melalui panggilan metode tanpa informasi jenis. Pada kode di bawah ini, tidak mungkin untuk menentukan implementasi
flymana yang dipanggil:
class Bird:
def fly(self): ...
class Airplane:
def fly(self): ...
def take_off(x):
x.fly() # Which function does this call?
Penganalisis bekerja dalam proyek yang benar-benar tidak berjenis. Tapi butuh sedikit usaha untuk menutupi tipe-tipe penting.
Sifat dinamis Python memberlakukan batasan lain. Lihat di bawah:
def secret_eval(request: HttpRequest):
os = importlib.import_module("os")
# Pysa won't know what 'os' is, and thus won't
# catch this remote code execution issue
os.system(request.GET["command"])
Kerentanan eksekusi terlihat jelas di sini, tetapi penganalisis akan melewatkannya. Modul
osdiimpor secara dinamis. Pysa tidak memahami bahwa variabel lokal os merepresentasikan modul dengan tepat os. Python memungkinkan Anda untuk mengimpor hampir semua kode secara dinamis kapan saja. Selain itu, bahasa dapat mengubah perilaku pemanggilan fungsi untuk hampir semua objek. Pysa dapat belajar menganalisis os dan mendeteksi masalah. Tetapi dinamisme Python berarti ada banyak contoh aliran data patologis yang tidak akan dilihat oleh penganalisis.
hasil
Pada paruh pertama tahun 2020, Pysa menyumbang 44 persen dari semua masalah yang terdeteksi di Instagram. Di antara semua jenis kerentanan, 330 masalah unik ditemukan dalam perubahan kode yang diusulkan. 49 (15%) masalah ternyata signifikan, 131 masalah (40%) nyata, tetapi memiliki keadaan yang meringankan. Negatif palsu dicatat dalam 150 (45%) kasus.
Kami secara rutin meninjau masalah yang dilaporkan dengan cara lain. Misalnya melalui program Bug Bounty. Inilah cara kami memastikan bahwa kami mengoreksi semua sinyal negatif palsu. Deteksi setiap jenis kerentanan dapat dikonfigurasi. Melalui penyempurnaan yang konstan, teknisi keselamatan telah beralih ke tipe yang lebih canggih untuk melaporkan masalah aktual 100 persen setiap saat.
Secara keseluruhan, kami senang dengan pengorbanan yang kami buat untuk membantu teknisi keamanan meningkatkan skala. Tetapi selalu ada ruang untuk pengembangan. Kami membuat Pysa untuk terus meningkatkan kualitas kode melalui kolaborasi erat antara teknisi keamanan dan pemrogram. Hal ini memungkinkan kami untuk dengan cepat mengulang dan membuat alat yang memenuhi kebutuhan kami lebih baik daripada solusi out-of-the-box. Kolaborasi para insinyur menyebabkan penambahan dan penyempurnaan pada mesin jam Pysa. Misalnya, cara Anda melihat jejak masalah telah berubah. Sekarang lebih mudah untuk melihat negatif palsu.
Dokumentasi dan tutorial pysa analyzer .
Cari tahu detail tentang cara mendapatkan profesi profil tinggi dari awal atau Naik Level dalam keterampilan dan gaji dengan mengikuti kursus online SkillFactory:
- «Python -» (9 )
- «Python » (2 )
- Python (10 )
E
- Machine Learning (12 )
- «Machine Learning Pro + Deep Learning» (20 )
- « Machine Learning Data Science» (20 )
- Data Science (12 )
- - (8 )
- (9 )
- DevOps (12 )
- Java- (18 )
- JavaScript (12 )
