Apa itu CodeQL?
CodeQL adalah mesin analisis yang digunakan oleh pengembang untuk mengotomatiskan pemeriksaan keamanan, dan oleh peneliti keamanan untuk melakukan analisis varian.
Di CodeQL, kode diperlakukan seperti data. Kerentanan keamanan, bug, dan kesalahan lainnya dimodelkan sebagai kueri yang dapat dieksekusi terhadap database yang diekstraksi dari kode. Anda dapat menjalankan kueri CodeQL standar, yang ditulis oleh peneliti GitHub dan kontributor komunitas, atau menulis kueri Anda sendiri untuk digunakan dalam analisis khusus. Kueri yang menemukan potensi bug menyoroti hasilnya langsung di file sumber.
Dalam unit ini, Anda akan mempelajari tentang alat analisis statis CodeQL dan cara menggunakan database, suite kueri, dan paket bahasa kueri untuk melakukan analisis varian.
Analisis varian
Analisis varian adalah proses menggunakan kerentanan keamanan yang diketahui sebagai benih untuk menemukan masalah serupa dalam kode Anda. Ini adalah teknik yang digunakan teknisi keamanan untuk mengidentifikasi potensi kerentanan dan memastikan ancaman ini diperbaiki dengan benar di beberapa basis kode.
Meminta kode menggunakan CodeQL adalah cara paling efisien untuk melakukan analisis varian. Anda dapat menggunakan kueri CodeQL standar untuk mengidentifikasi kerentanan benih, atau menemukan kerentanan baru dengan menulis kueri CodeQL kustom Anda sendiri. Kemudian, Anda dapat mengembangkan atau melakukan iterasi atas kueri untuk secara otomatis menemukan varian logis dari bug yang sama yang dapat dilewatkan menggunakan teknik manual tradisional.
Database CodeQL
Database CodeQL berisi data yang dapat dikueri yang diekstrak dari basis kode untuk satu bahasa pada titik waktu tertentu. Database berisi representasi lengkap kode hierarkis, termasuk representasi pohon sintaks abstrak, grafik aliran data, dan grafik aliran kontrol.
Setiap bahasa memiliki skema database uniknya sendiri yang mendefinisikan hubungan yang digunakan untuk membuat database. Skema ini menyediakan antarmuka antara analisis leksikal awal yang dilakukan selama proses ekstraksi dan analisis kompleks aktual dari evaluator kueri CodeQL. Skema menentukan, misalnya, bahwa ada tabel untuk setiap konstruksi bahasa.
Untuk setiap bahasa, perpustakaan CodeQL mendefinisikan kelas untuk menyediakan lapisan abstraksi di atas tabel database. Ini menyediakan tampilan data yang berorientasi objek, yang memudahkan untuk menulis kueri.
Misalnya, dalam database CodeQL untuk program Java, dua tabel kunci adalah:
- Tabel
expressions, berisi baris untuk setiap ekspresi tunggal dalam kode sumber yang dianalisis selama proses build. - Tabel
statements, berisi baris untuk setiap pernyataan tunggal dalam kode sumber yang dianalisis selama proses build.
Pustaka CodeQL mendefinisikan kelas untuk menyediakan lapisan abstraksi di setiap tabel ini (dan tabel bantu terkait): Expr dan Stmt.
Suite kueri
Suite kueri CodeQL menyediakan cara memilih kueri berdasarkan nama file, properti metadata, atau lokasinya di disk atau dalam paket QL. Buat suite kueri untuk kueri yang ingin sering Anda gunakan dalam analisis CodeQL Anda.
Suite kueri memungkinkan Anda meneruskan beberapa kueri ke CodeQL tanpa harus menentukan jalur ke setiap file kueri satu per satu. Definisi suite kueri disimpan dalam file YAML dengan ekstensi .qls. Definisi suite adalah urutan instruksi di mana setiap instruksi adalah pemetaan YAML dengan (biasanya) satu kunci. Instruksi dieksekusi dalam urutan yang muncul dalam definisi suite kueri. Setelah semua instruksi dalam definisi suite dieksekusi, hasilnya adalah serangkaian kueri yang dipilih.
Suite kueri default
Ada dua suite kueri bawaan untuk CodeQL:
-
default: Ini adalah kueri yang dijalankan secara default dalam pemindaian kode CodeQL di GitHub, tersedia dengan pengaturan default pemindaian kode. Kueri dalam rangkaian kueri ini sangat tepat dan mengembalikan sedikit hasil pemindaian kode positif palsu. Relatif terhadapsecurity-extendedrangkaian kueri, rangkaian default mengembalikan lebih sedikit hasil pemindaian kode keyakinan rendah. -
security-extended: Suite ini berisi semua kueri daridefaultsuite, ditambah kueri keamanan ekstra dengan presisi dan tingkat keparahan yang sedikit lebih rendah. Ini tersedia dengan pengaturan bawaan pemindaian kode dan dicantumkan sebagai opsi "Diperluas" di menu dropdown suite kueri. Relatif terhadapdefaultrangkaian kueri, rangkaian ini dapat mengembalikan lebih banyak hasil pemindaian kode positif palsu.
Penyiapan default pemindaian kode akan menggunakan default rangkaian kueri. Ini dapat diubah dengan memilih ikon luapan untuk melihat konfigurasi CodeQL, lalu memilih tombol edit. Di bagian "Pengaturan pemindaian", Anda dapat memilih salah satu dari dua opsi yang dijelaskan sebagai rangkaian kueri.
Paket CodeQL
Paket CodedQL digunakan untuk mengatur file yang digunakan dalam analisis CodeQL sehingga Anda dapat membuat, berbagi, bergantung pada, dan menjalankan kueri dan pustaka CodeQL dengan mudah. Mereka berisi kueri, file pustaka, suite kueri, dan metadata penting. Dengan paket CodeQL dan perintah manajemen paket di CodeQL CLI, Anda dapat menerbitkan kueri kustom dan mengintegrasikannya ke dalam analisis basis kode Anda.
Ada tiga jenis paket CodeQL: paket kueri, paket pustaka, dan paket model.
- Paket kueri dirancang untuk dijalankan. Saat paket kueri diterbitkan, bundel menyertakan semua dependensi transitif dan representasi yang telah dikompilasi sebelumnya dari setiap kueri, selain sumber kueri. Ini memastikan eksekusi kueri yang konsisten dan efisien dalam kumpulan.
- Paket pustaka dirancang untuk digunakan oleh paket kueri (atau paket pustaka lainnya) dan tidak berisi kueri itu sendiri. Perpustakaan tidak dikompilasi secara terpisah.
- Paket model dapat digunakan untuk memperluas analisis pemindaian kode untuk menyertakan dependensi yang tidak didukung secara default. Paket model saat ini dalam versi beta dan dapat berubah. Selama beta, paket model tersedia untuk analisis Java di tingkat repositori. Untuk informasi selengkapnya tentang membuat paket model Anda sendiri, lihat "Membuat paket model CodeQL."
Struktur paket CodeQL
CodeQL CLI dapat digunakan untuk mengembangkan dan menerbitkan paket menggunakan pack init perintah . Perintah ini akan membuat struktur direktori dan file yang diperlukan, termasuk file utama yang disebut qlpack.yml di direktori akarnya. Metadata dalam setiap qlpack.yml file memberi tahu CodeQL cara mengkompilasi kueri apa pun dalam paket, pustaka apa yang bergantung pada paket, dan di mana menemukan definisi rangkaian kueri.
Konten paket CodeQL (kueri atau pustaka yang digunakan dalam analisis CodeQL) disertakan dalam direktori yang sama dengan qlpack.yml, atau subdirektorinya.
Direktori yang berisi file qlpack.yml berfungsi sebagai direktori akar untuk konten paket CodeQL. Artinya, untuk semua .ql file dan .qlldalam paket, CodeQL akan menyelesaikan semua pernyataan impor relatif terhadap direktori yang berisi file qlpack.yml di akar paket.
Berikut adalah contoh qlpack.yml file:
name: codeql/java-queries
version: 0.0.6-dev
groups: java
suites: codeql-suites
extractor: java
defaultSuiteFile: codeql-suites/java-code-scanning.qls
dependencies:
codeql/java-all: "*"
codeql/suite-helpers: "*"
Untuk informasi selengkapnya tentang membuat dan menerbitkan paket CodeQL Anda sendiri, lihat "Menerbitkan dan menggunakan paket CodeQL."[1]