Kami mengusulkan alat untuk menganalisis kode JavaScript secara statis. Untuk tujuan ini, kami membangun AST (pohon sintaks abstrak) dari file javascript input. Untuk alasan tentang kondisi yang harus dipenuhi untuk jalur eksekusi tertentu yang akan diambil, kami kemudian menambahkan tepi aliran kontrol ke AST. Kami merujuk pada grafik yang dihasilkan sebagai CFG (grafik aliran kontrol). Selanjutnya, untuk bernalar tentang dependensi variabel, kami menambahkan tepi aliran data ke CFG. Akhirnya, untuk menghitung nilai variabel, kami melakukan analisis pointer. Kami merujuk pada grafik yang dihasilkan sebagai PDG (Grafik Ketergantungan Program).
Harap perhatikan bahwa dalam keadaan saat ini, kode tersebut adalah POC dan bukan API siap-produksi yang sepenuhnya.
Kami mengadopsi definisi CFG yang sedikit berbeda dari Allen saat kami meningkatkan AST kami dengan tepi aliran kontrol. Dengan cara ini, kami membangun struktur gabungan yang menggabungkan informasi aliran kontrol dengan node dan tepi AST berbutir halus. PDG kami juga sedikit berbeda dari definisi Ferrante et al. karena kami memilih untuk menambahkan tepi aliran data ke CFG kami. Dengan cara ini, kami menyimpan informasi mengenai urutan pernyataan dan memiliki representasi berbutir data yang mengalir langsung di tingkat variabel (karena kami membangun CFG di atas AST).
Detail tambahan dapat ditemukan di disertasi saya.
Kode ini telah digunakan untuk menganalisis ekstensi browser secara statis. Lihat Kertas & Kode Doublex.
Versi awal kode ini juga digunakan untuk mendeteksi sampel JavaScript berbahaya: Hidenoseek Paper & Code dan JSTAP Paper & Code.
Dan untuk mempelajari teknik transformasi kode javascript: kertas & kode.
install python3 # (tested with 3.7.3 and 3.7.4)
install nodejs
install npm
cd src
npm install esprima # (tested with 4.0.1)
npm install escodegen # (tested with 1.14.2 and 2.0.0)
Untuk menginstal GraphViz (hanya untuk grafik menggambar, belum didokumentasikan, silakan buka masalah jika tertarik)
pip3 install graphviz
On MacOS: install brew and then brew install graphviz
On Linux: sudo apt-get install graphviz
Untuk menghasilkan PDG file *.js tertentu, luncurkan perintah python3 berikut dari lokasi folder src :
>>> from build_pdg import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict())
Per default, PDG yang sesuai tidak akan disimpan. Untuk menyimpannya di folder PDG_Path yang ada , hubungi:
$ python3 -c "from build_pdg import get_data_flow; get_data_flow('INPUT_FILE', benchmarks=dict(), store_pdgs='PDG_PATH')"
Perhatikan bahwa kami menambahkan batas waktu 10 menit untuk analisis aliran/pointer data (lih. Baris 149 dari src/build_pdg.py ), dan batas memori 20GB (lih. Baris 115 dari src/build_pdg.py ).
Mari kita pertimbangkan direktori DIR yang berisi beberapa file JavaScript untuk dianalisis. Untuk menghasilkan PDG (= ASTS yang ditingkatkan dengan kontrol dan aliran data, dan analisis pointer) dari semua file ini, luncurkan perintah shell berikut dari lokasi folder src :
$ python3 -c "from build_pdg import store_pdg_folder; store_pdg_folder('DIR')"
PDG yang sesuai akan disimpan dalam DIR/PDG .
Saat ini, kami menggunakan 1 CPU, tetapi Anda dapat mengubahnya dengan memodifikasi num_workers variabel dari src/utility_df.py (satu baris 51 ).
Proyek ini dilisensikan berdasarkan ketentuan lisensi AGPL3, yang dapat Anda temukan dalam LICENSE .