it-swarm-id.com

Bagaimana cara memindai Javascript untuk kode berbahaya?

Kami berencana untuk memberikan kemungkinan untuk menulis ekstensi berbasis komunitas dalam javascript untuk webapp publik kami dan memungkinkan orang untuk menyesuaikan instans aplikasi mereka. Masalahnya adalah memantau kualitas ekstensi.

Apa yang akan Anda sarankan untuk mengotomatiskan proses ini?

Atau bagaimana cara memindai Javascript untuk kode berbahaya?

Dalam beberapa kata kami ingin memiliki beberapa layanan seperti antivirus yang akan memindai ekstensi yang diunggah dalam waktu nyata untuk menjadi jahat. Dan jika mendeteksi kode yang dicurigai akan menghasilkan peringatan.

Semua saran/saran diterima! Terima kasih.

22
Igor

Salah satu pendekatan adalah mendefinisikan API aman untuk ekstensi yang akan digunakan, dengan mendeklarasikan objek yang mengimplementasikan API itu dalam lingkup eksekusi untuk ekstensi. Kemudian memerlukan kode ekstensi untuk ditulis dalam versi Javascript kotak pasir, sehingga kode ekstensi hanya dapat memanggil metode API aman yang Anda tetapkan dan tidak lebih.

Jadi, jika API Anda terdiri dari objek yang disimpan dalam variabel api, maka kode:

var x = api.frob();
x.bar();

akan diizinkan kode ekstensi, karena api adalah bagian dari API Anda yang aman, dan varian Javascript yang aman memungkinkan Anda untuk memohon API yang terbuka ke kode ekstensi.

Namun, kodenya:

document.createElement("img");

tidak akan diizinkan, karena document bukan bagian dari API aman Anda.

Dalam mendesain API, pastikan bahwa tidak ada objek terbuka yang memiliki properti yang dapat digunakan dengan jahat. Untuk memberikan akses terbatas ke sumber daya, gunakan penutupan untuk membuat fungsi yang merujuk sumber daya secara pribadi.

Ada sejumlah proyek di luar sana yang telah mendefinisikan versi Javascript kotak pasir yang dapat Anda gunakan untuk tujuan ini: SES , Caja , ADsafe , [~ # ~] fbjs [~ # ~]) , dan lainnya. SES dan Caja memungkinkan pengembang menulis kode dengan batasan paling sedikit: rasanya seperti menulis Javascript, dengan beberapa batasan kecil (mis., Tidak ada eval, no with). ADsafe dan FBJS mengharuskan pengembang untuk mempelajari varian Javascript. SES, ADsafe, dan FBJS memiliki kinerja terbaik. SES memerlukan dukungan dari mesin Javascript terbaru, dan karenanya tidak kompatibel dengan beberapa browser web yang lebih lama. Jika kode ekstensi akan dieksekusi di sisi server, maka SES mungkin merupakan taruhan terbaik, karena Anda dapat memastikan bahwa mesin Javascript Anda mutakhir. Jika ekstensi akan dieksekusi pada browser pengguna, Anda dapat mempertimbangkan Caja jika ekstensi tidak kritis terhadap kinerja, atau ADsafe/FBJS jika ekstensi.

9
JGWeissman

Tidak ada cara yang baik untuk memindai Javascript untuk kode berbahaya. Kamu tidak bisa melakukannya Masalahnya adalah ada terlalu banyak cara pengembang jahat/jahat dapat menyembunyikan hal-hal jahat dalam kode mereka, dan Anda tidak akan pernah bisa mendeteksi semuanya.

Anti-virus tidak membantu di sini. Anda perlu memahami sedikit tentang cara kerja perangkat lunak anti-virus dan batasannya. Secara kasar, inilah cara kerjanya. Jika perusahaan anti-virus mendeteksi virus yang menginfeksi banyak mesin, maka mereka menganalisis virus, mengidentifikasi tanda tangan virus (mis., Kutipan kodenya), dan membuatnya menjadi mesin mereka. Setelah itu, jika mesin Anda terinfeksi oleh salinan salinan tertentu itu (sama persis dengan yang mereka analisis), maka perangkat lunak anti-virus akan mendeteksi keberadaannya melalui tanda tangan ini. Akibatnya, perangkat lunak anti-virus hanya berguna terutama terhadap virus yang telah menyebar luas. Perangkat lunak anti-virus yang ada tidak akan mendeteksi kode berbahaya dalam ekstensi jahat untuk aplikasi web Anda. Perangkat lunak anti-virus memiliki beberapa kegunaan, tetapi pada dasarnya tidak berguna untuk skenario khusus Anda.

Anda harus menerima bahwa ini bukan masalah yang dapat Anda pecahkan dengan memindai kode. Jadi, Anda perlu mempertimbangkan beberapa pendekatan lain. Apa saja pilihanmu? Ada beberapa:

  • Anda bisa menyerah dan menerima kekacauan. Anda dapat membuat situs publik untuk ekstensi, memungkinkan pengguna untuk menilai ekstensi, dan mengirim/melihat ulasan. Dengan cara ini, jika pengembang memposting ekstensi berkualitas rendah yang bermasalah atau macet, pengguna yang memperhatikannya dapat memposting ulasan negatif. (Tentu saja, jika pengembang jahat dan memposting ekstensi jahat, tidak ada jaminan bahwa siapa pun akan pernah melihat - jika Anda beruntung, mungkin beberapa pengguna akan melihat kode berbahaya entah bagaimana dan melaporkannya kepada Anda, tetapi itu adalah kemungkinan besar tidak ada yang akan menyadarinya. Itulah risiko yang Anda ambil.)

    Ini dikenal sebagai memiliki sistem ekstensi terbuka. Lihat, misalnya, Android Market atau Google Chrome Galeri Ekstensi atau Userscripts.org (situs ekstensi Greasemonkey).

  • Anda dapat melembagakan semacam sistem peninjauan, di mana para ahli meninjau setiap ekstensi sebelum diposting (atau segera setelah diposting) di situs ekstensi publik. Jika Anda hanya ingin menangkap masalah kualitas, mungkin cukup untuk meminta para ahli menginstal ekstensi dan mengujinya, dan mungkin menjalankan alat pencarian bug kualitas kode untuk memindai masalah umum. Jika Anda juga ingin menangkap ekstensi jahat, peninjau haruslah seorang pengembang yang mampu membaca kode dan yang membaca baris demi baris ekstensi; ini sangat membosankan dan memakan waktu, tetapi sebenarnya tidak ada pilihan yang lebih baik.

    Ini dikenal memiliki sistem ekstensi yang dikuratori. Lihat, misalnya, Apple iOS App Store atau situs ekstensi Firefox (addons.mozilla.org) untuk beberapa contoh, meskipun saya percaya mereka hanya fokus pada kualitas kode dan bukan pada mendeteksi niat jahat.

Apa pun pendekatan yang Anda lakukan, ada keuntungan signifikan untuk ekstensi yang dilayani dari satu situs ekstensi publik, yang menampung versi ekstensi yang resmi. Anda mungkin ingin mengambil berbagai langkah untuk mendorong pengguna memasang ekstensi dari situs itu dan mencegah mereka memasang ekstensi dari situs lain (misalnya, secara default menonaktifkan pemasangan ekstensi dari sumber lain dan mengharuskan pengguna mengklik untuk mengotorisasi domain lain yang mereka inginkan. instal dari, seperti Firefox). Apa untungnya? Keuntungannya adalah ini memastikan bahwa semua pengguna Anda mendapatkan salinan ekstensi yang sama. Ini mencegah serangan, misalnya, di mana situs web jahat menggunakan beberapa skrip untuk memeriksa apakah versi browser pengguna dan dari mana pengguna berasal, dan berdasarkan itu, memutuskan apakah akan menyajikan kode berbahaya atau kode yang sah - jenis serangan itu membuat lebih sulit untuk mendeteksi kebencian, jadi menghentikan mereka adalah hal yang baik. Ini juga memastikan bahwa pengguna mendapatkan manfaat ulasan dan peringkat.

Anda juga harus mempertimbangkan dengan hati-hati API mana yang terbuka ke ekstensi dan mana yang tidak. Anda dapat mempertimbangkan untuk mengekspos hanya sebagian dari API ke ekstensi, sehingga ekstensi secara inheren terbatas dalam apa yang dapat mereka lakukan, sebagai cara untuk membatasi kerusakan. Misalnya, browser Chrome memungkinkan ekstensi untuk berinteraksi dengan DOM halaman web dan situs web, tetapi ekstensi tidak diizinkan untuk mengeksekusi kode asli (mis., Instal dan jalankan .exe). semacam itu membantu keamanan. Atau, Anda dapat menyediakan API dasar yang menghindari API berisiko tinggi, dan kemudian memerlukan ekstensi apa pun yang memerlukan akses ke lebih dari API dasar harus mendapatkan persetujuan dari moderator terlebih dahulu sebelum dapat diposting di situs publik.

Kemungkinan pertahanan lain terhadap ekstensi jahat adalah memperkenalkan sistem izin. Anda mengidentifikasi serangkaian izin. Ekstensi wajib menyertakan manifes, yang menentukan sekumpulan izin yang diperlukan. Ketika pengguna menginstal izin, sistem harus menunjukkan kepada pengguna seperangkat izin yang diminta ekstensi dan apa yang diimplikasikan oleh izin tersebut (misalnya, risiko keamanan/privasi apa yang ditimbulkannya, akses apa yang mereka berikan pada ekstensi), yang memungkinkan pengguna untuk baik menyetujui izin dan melanjutkan instalasi atau untuk menolak izin dan membatalkan instalasi. Ini memberi pengguna lebih banyak kontrol dan visibilitas ekstensi, mengurangi risiko ekstensi kereta (karena konsekuensi kerentanan keamanan dalam ekstensi sekarang terbatas hanya pada izin yang diminta, bukan semua izin), dan dapat membuat ekstensi jahat lebih terlihat jelas ( karena mereka perlu meminta izin tertentu untuk melukai). Lihat, mis., Android aplikasi atau Google Chrome ekstensi untuk contoh hal semacam ini.

6
D.W.

(Jangan mencoba untuk meluncurkan skema sanitasi Anda sendiri. Mengingat kompleksitas JavaScipt, sanitasi buatan rumah mungkin tidak aman. Gunakan solusi yang sudah ada yang telah diperiksa dengan baik.)

Google Caja Compiler adalah alat untuk membuat HTML pihak ketiga, CSS dan JavaScript aman untuk disematkan di situs web Anda.

Jika saya ingat dengan benar, ini digunakan untuk iGoogle, karena hanya memisahkan kode yang tidak tepercaya menjadi iframes masih memiliki kekurangan.

6
Bryan Field

Saya tidak tahu apakah ini dapat diotomatisasi dengan mudah, dan saya setuju dengan @ jfriend00 dan @slhck mengenai kesulitan umum untuk berhasil menyaring Javascript ini. Yang sedang berkata, setidaknya ada satu alat yang saya tahu tentang upaya untuk mendeteksi skrip berbahaya.

Alat ini Wepawet , yang dioperasikan oleh University of California di Santa Barbara. Dijelaskan sebagai berikut:

Wepawet adalah kerangka kerja untuk analisis ancaman berbasis web. Wepawet dapat menentukan apakah mengunjungi halaman web akan mengarah pada upaya untuk mengkompromikan lingkungan pengunjung.

2
Andrew Lambert

IBM Appscan memiliki modul analisis kode statis yang disebut " JavaScript Security Analyzer (JSA) ". Ini jelas TIDAK gratis, tetapi memberikan umpan balik tentang implikasi keamanan kode Javascript.

Selain dari JSA, saya tidak mengetahui adanya alat analisis kode statis lainnya untuk mencari masalah keamanan, tetapi saya ingin mempelajari lebih lanjut. Mungkin jika JLint/JHint menambahkan beberapa fungsi keamanan?

0
schroeder