Kamis, grup imchecker, hubungi kami di [email protected]
Perpustakaan menawarkan fungsionalitas yang dapat digunakan kembali melalui aplikasi pemrograman aplikasi (API) dengan kendala penggunaan, seperti kondisi panggilan atau pesanan. Pelanggaran kendala, yaitu, API menyalahgunakan, biasanya menyebabkan bug dan masalah keamanan. Meskipun para peneliti telah mengembangkan berbagai detektor API-misuse dalam beberapa dekade terakhir, penelitian terbaru menunjukkan bahwa penyalahgunaan API lazim dalam proyek dunia nyata. Pendekatan yang ada baik menderita masalah penggunaan yang jarang (yaitu, bug yang jarang terjadi) atau melaporkan alarm palsu karena semantik yang tidak akurat. Untuk mengatasi keterbatasan ini, kami memperkenalkan Imchecker untuk secara efektif mendeteksi bug misuse API. Wawasan utama di balik Imchecker adalah teknik analisis statis yang diarahkan pada kendala yang ditenagai oleh bahasa khusus domain (DSL) untuk menentukan batasan penggunaan API. Melalui mempelajari bug misuse-API dunia nyata, kami mengusulkan IMSPEC DSL, yang mencakup sebagian besar jenis kendala penggunaan API dan memungkinkan spesifikasi yang sederhana namun tepat. Selain itu, kami merancang dan mengimplementasikan iMchecker untuk secara otomatis menguraikan IMSPEC ke dalam memeriksa target dan menggunakan mesin analisis statis untuk mengidentifikasi potensi penyalahgunaan API dan memangkas positif palsu dengan semantik yang kaya. Kami telah instantiated iMchecker untuk program C dan mengevaluasinya pada tolok ukur yang banyak digunakan dan program dunia nyata skala besar.
Saat ini, 75 bug yang sebelumnya tidak diketahui telah ditemukan dan 61 telah dikonfirmasi dan diperbaiki dalam kernel Linux, OpenSSL dan paket di Ubuntu 16.04. Kami mencoba yang terbaik untuk menerapkan Imchecker ke lebih banyak program. Kami mengunggah detail dalam evaluasi_data/new_bugs
Naskah penelitian dan naskah alat kami sedang dalam proses peninjauan ICSE'19. Kami akan mengunggahnya segera setelah proses peninjauan selesai. (Nah, Anda dapat mengirim email kepada kami untuk mengaksesnya hanya dengan tujuan akademik.)
Video demonstrasi alat kami tersedia di Versi Bahasa Inggris: https://youtu.be/ygdxeyoevim Versi Cina: https://www.youtube.com/watch?v=3zanegtwuto https:/pan.baidu.com/s/1digq0r6wk5shm
Penggunaan alat kami di Tools/Readme.md
Imchecker masih sedang dikembangkan, dan berisi banyak bug dan daftar TODO. Bug atau permintaan fitur apa pun, jangan ragu untuk mengirim email kepada kami di [email protected] atau masalah terbuka.
Untuk lebih memahami jenis bug yang mencabut API apa yang terjadi dalam proyek C nyata dan bagaimana pengembang memperbaikinya dalam praktik, kami secara manual mempelajari sejarah versi dua tahun dari tiga proyek open-source dan setengah tahun Linux-Kernel pada tahun 2017, seperti yang ditunjukkan pada tabel berikut. Sejarah ini dipilih karena perkembangan yang sedang berlangsung dan karena mereka sering disebutkan dalam beragam pekerjaan deteksi bug. Secara total, kami telah mempelajari sekitar 13,57m LOC dan 51.1k berkomitmen.
| Proyek | Loc | Periode yang dipelajari | Total komitmen | Perbaikan bug | API menyalahgunakan |
|---|---|---|---|---|---|
| Keriting | 112.8k | 20160101-20171231 | 2613 | 135 | 38 |
| Gnutls | 35.8k | 20160101-20171231 | 2769 | 86 | 30 |
| Openssl | 454.2k | 20160101-20171231 | 6487 | 344 | 115 |
| Linux | 12.96m | 20170701-20171231 | 39295 | 995 | 362 |
| Total | 15.57m | Dua tahun | 51.1k | 1560 | 509 |
Untuk membantu pembaca mengekstrak pesan komit, mengubah file dan patch file, kami membuka sumber alat gitgrabber kami. Kami juga mengunggah semua komitmen yang terkait dengan bug misuse API dalam subjek yang diteliti untuk digunakan lebih lanjut.
Pembaca dapat menemukannya di folder empiris_study. Masalah apa pun di gitgrabber, jangan ragu untuk menghubungi kami!
Kami memilih tolok ukur yang banyak digunakan, yaitu, Juliet Test Suite v1.3, dan dua program dunia nyata dalam versi terbaru mereka: Linux Kernel-4.18-RC4 dirilis pada 2018-7-9 dan OpenSSL-1-1-1-Pre8 yang dirilis pada 2018-6-20 untuk mengevaluasi pendekatan kami. Kami mengevaluasi pendekatan kami dari dua perspektif.
Kami juga menguji kasus-kasus ini tentang alat deteksi penggunaan API sanitasi melalui periksa silang semantik dan clang-SA Alat analisis statis open-source.
Kami mengunggah API-Misuse-Benchmark dan hasil asli di Evaluation_Data.
Motivasi utama Imchecker adalah untuk mendeteksi bug misuse API dalam program dunia nyata, yaitu, untuk menentukan apakah Imchecker dapat menemukan bug yang sebelumnya tidak diketahui. Oleh karena itu, kami menerapkan Imchecker ke versi terbaru dari dua program open-source yang terkenal: Linux Kernel-4.18-RC4 dan OpenSSL-1-1-1-Pre8, dan paket dalam Ubuntu 16.04. API target dipilih dari yang disalahgunakan dari studi empiris.
Hingga saat ini, 56 bug yang sebelumnya tidak diketahui telah ditemukan dan 36 telah dikonfirmasi oleh pengembang.
| Proyek | Bug (Tanggapan Menunggu/Dikonfirmasi/Memperbaiki) |
|---|---|
| Openssl | 17 (0/5/12) |
| Linux | 30 (5/20/5) |
| DMA | 1 (0/0/1) |
| exim | 2 (0/0/2) |
| hexchat | 2 (1/1/0) |
| httping | 1 (0/1/0) |
| ipmitool | 1 (0/1/0) |
| Open-VM-Tools | 2 (0/0/2) |
| irssi | 2 (1/1/0) |
| Keepalive | 2 (0/0/2) |
| THC-IPV6 | 2 (0/0/2) |
| Freeradius-Server | 2 (0/0/2) |
| Trafficserver | 3 (3/0/0) |
| tinc | 2 (0/0/2) |
| sslplit | 2 (0/0/2) |
| rdesktop | 2 (2/0/0) |
| Proxytunnel | 2 (2/0/0) |
| Total | 75 (16/29/32) |
Kami mengunggah detail dalam evaluasi_data/new_bugs
Spesifikasi perilaku yang menggambarkan kendala penggunaan API telah terbukti berguna bagi pengembang untuk secara efektif memanfaatkan API serta untuk mengatasi masalah penggunaan yang jarang dengan memastikan validasi penggunaan API target. Sebagai contoh, Bodden menghadirkan cysl untuk menjembatani kesenjangan kognitif antara para ahli kriptografi dan pengembang. Namun, bahasa spesifikasi saat ini dirancang untuk properti program penuh, seperti BLAST, JML atau terlalu spesifik untuk diterapkan pada deteksi penggunaan API generik, seperti SLIC. Kami memperkenalkan bahasa khusus domain ringan untuk kendala penggunaan API bernama IMSPEC. IMSPEC secara bersamaan memastikan bahwa API target divalidasi, bahkan dengan sedikit penggunaan, dan memandu deteksi penyalahgunaan. Sebuah contoh IMSPEC adalah pola yang diisi dengan serangkaian kendala untuk menggunakan API dengan benar, dan setiap pelanggaran akan menghasilkan bug misuse API.
Kami mengunggah instance IMSPEC ke folder IMPSEC, kami akan secara bertahap memperbarui folder ini untuk lebih banyak API. Selain itu, IMSPEC dapat digunakan untuk tujuan lain, seperti menghasilkan kasus pengujian, verifikasi dan sebagainya. Selain itu, kami menyediakan penulis IMSPEC GUI di Tools.
Saat ini, IMSPEC dibuat dengan penulisan manual. Namun, kami memastikan bahwa itu dapat dihasilkan secara otomatis dari teknik penambangan spesifikasi. Kami berusaha sebaik mungkin untuk melakukan eksperimen dan mengimplementasikan parser untuk menerjemahkan hasil dari alat pertambangan ke IMSPEC, seperti Apex. Tetapi, alat -alat ini tidak dapat menyelesaikan semua kendala penggunaan. Kami juga ingin mengundang pengembang untuk membantu kami memperbaiki contoh IMSPEC yang dihasilkan sesuai dengan manual pengguna, seperti OpenSSL.
Penggunaan API yang benar harus memenuhi serangkaian kendala penggunaan, yaitu, pelanggaran kendala dapat mengakibatkan bug misuse API. Imchecker secara otomatis mendeteksi bug ini dalam kode sumber menggunakan spesifikasi IMSPEC. Untuk memproses program yang kompleks dan dunia nyata, mekanisme mendasar Imchecker harus dapat diukur sambil mengorbankan jumlah akurasi minimal. Kami menguraikan rincian desain Imchecker, termasuk eksekusi simbolik yang kurang dibatasi dengan teknik analisis statis untuk membangun konteks analisis, metodologi untuk mendeteksi bug misuse API dalam konteks analisis dan metode untuk memfilter positif palsu menggunakan informasi semantik dan statistik penggunaan.
Kami menggunakan contoh yang memotivasi untuk menggambarkan alur kerja Imchecker. Ini adalah bug misuse API di OpenSSL yang dilaporkan dalam CVE-2015-0288. Pemeriksaan kode kesalahan yang hilang dari X509_get_pubkey() menghasilkan bug Dereference pointer null di baris-4.
1 // Location: crypto/x509/x509_req.c: 70 2 X509_REQ *X509_to_X509_REQ(...){
3 ...
4 pktmp = X509 get pubkey ( x );
5 // missing error code check of pktmp
6 + if ( pktmp == NULL )
7 + goto err ;
8 i = X509_REQ_set_pubkey ( ret , pktmp ); 9 EVP_PKEY_free ( pktmp );
10 ...
11 }
12
13 // Location: /crypto/x509/x509_cmp.c: 390
14 int X509_chain_check_suiteb (...){
15 ...
16 // check error value in usage
17 pk = X509 get pubkey ( x );
18 rv = check_suite_b ( pk , -1 , & tflags );
19 ...
20 }
21 // Location: /crypto/x509/x509_cmp.c: 359
22 static int check_suite_b ( EVP_PKEY * pkey ,...){ 23 ...
24 // ensure pkey not NULL
25 if ( pkey && pkey -> type == EVP PKEY EC )
26 ... // usage of pkey
27 }Inilah alur kerja Imchecker:

Imchecker mengambil kode sumber dan kendala penggunaan API sebagai input dan menghasilkan laporan bug dengan lokasi dan alasan konkret sebagai output. Pertama, kendala penggunaan API ditulis dalam bahasa khusus domain ringan bernama IMSPEC; Misalnya, "Nilai Pengembalian X509_Get_Pubkey () harus diperiksa dengan NULL" . Dengan menggunakan spesifikasi ini, Imchecker secara langsung memvalidasi penggunaan API target, yang mengurangi masalah penggunaan yang jarang dan memandu proses deteksi bug. Kemudian, kami mendeteksi bug misuse API dalam tiga fase. (1) Dalam fase-1, konteks analisis dibangun dengan membangun grafik aliran kontrol dan membuat jejak jalur program untuk setiap API target yang ditentukan dalam spesifikasi dengan menggunakan eksekusi simbolik yang kurang dibatasi dengan analisis point-to, range dan jalur-sensitif. Dalam contoh ini, dua jejak, T1 dan T2, dihasilkan, seperti yang ditunjukkan pada kotak di atas jejak jalur program. Dengan cara ini, Imchecker dapat berhasil menangkap konteks penggunaan X509_get_pubkey() , EVP_PKEY_free() dan yang ada di antaranya. (2) Dalam Fase-2, Imchecker menggunakan jejak untuk mendeteksi pelanggaran kendala sebagai bug potensial. Forexample, instance Twoapi-Misuse dari X509_get_pubkey() ditemukan untuk pemeriksaan kode kesalahan yang hilang berlabel bug potensial. (3) Dalam fase-3, Imchecker meningkatkan ketepatan deteksi dengan memanfaatkan beberapa instance penggunaan dan informasi semantik. Kemudian, penyalahgunaan kedua disaring untuk cek yang dilakukan di X509_to_X509_REQ() di Line-25.
Penggunaan alat kami dapat ditemukan di sini: alat/readme.md
Saat menyelidiki laporan bug yang dihasilkan oleh Imchecker, kami menemukan beberapa bug yang menarik dan mendapatkan pengalaman yang bermanfaat dalam proses pelaporan bug dengan pengembang sumber terbuka. Kami berbagi pengalaman berikut.
Para penulis ingin mengucapkan terima kasih kepada pengembang Kernel Linux dan Openssl untuk membantu kami memperbaiki IMSPEC dan mengkonfirmasi laporan bug.