Menjelajahi CodeQL di GitHub

Selesai

Apa itu CodeQL

CodeQL adalah mesin analisis kode semantik yang dikembangkan oleh GitHub yang memperlakukan kode sebagai data. Alih-alih hanya mencari pola teks, CodeQL memahami struktur dan arti kode Anda, memungkinkan keamanan canggih dan analisis kualitas.

Alat analisis statis tradisional sering menghasilkan positif palsu karena menggunakan pencocokan pola sederhana. Pendekatan semantik CodeQL memahami konteks kode, hubungan antara elemen kode, dan aliran data melalui aplikasi, menghasilkan deteksi kerentanan yang lebih akurat.

Karakteristik utama CodeQL

CodeQL memperlakukan kode sebagai database:

  • Representasi struktural: Mengonversi kode sumber menjadi database yang menangkap pohon sintaksis, grafik alur kontrol, dan jalur aliran data.
  • Format yang dapat dikueri: Membuat kode dapat dikueri menggunakan bahasa kueri khusus, mirip dengan mengkueri database tradisional.
  • Pendekatan bahasa-agnostik: Mendukung beberapa bahasa pemrograman termasuk C/C++, C#, Java, JavaScript/TypeScript, Python, Ruby, Go, dan Swift.
  • Cakupan komprehensif: Menganalisis bukan hanya file individual tetapi seluruh basis kode dengan semua interkoneksinya.

CodeQL memungkinkan analisis keamanan yang tepat:

  • Analisis varian: Setelah mengidentifikasi satu kerentanan, Anda dapat menulis kueri untuk menemukan masalah serupa di seluruh basis kode Anda.
  • Analisis aliran data: Melacak bagaimana data bergerak melalui aplikasi Anda dari sumber (input pengguna) ke sink (operasi sensitif).
  • Pelacakan taint: Mengidentifikasi kapan data yang tidak tepercaya mencapai operasi sensitif tanpa validasi atau sanitasi yang tepat.
  • Analisis alur kontrol: Memahami jalur eksekusi dan logika kondisional untuk menemukan kerentanan yang hanya terjadi dalam kondisi tertentu.

Cara kerja CodeQL

Analisis CodeQL melibatkan tiga fase berbeda yang mengubah kode sumber menjadi temuan keamanan yang dapat ditindaklanjuti:

Fase 1: Membuat database CodeQL

Langkah pertama mengekstrak representasi terstruktur dari kode Anda:

  • Ekstraksi kode: Menganalisis file sumber Anda selama kompilasi atau melalui analisis statis.
  • Pembuatan database: Membangun database komprehensif yang mewakili struktur kode Anda, termasuk pohon sintaks abstrak, grafik alur kontrol, dan dependensi data.
  • Pengambilan metadata: Merekam lokasi file, nomor baris, cakupan variabel, panggilan fungsi, dan hierarki kelas.
  • Optimasi: Mengindeks database untuk kueri yang efisien, bahkan pada basis kode besar.

Database ini menjadi fondasi untuk semua analisis berikutnya. Ini dibuat sekali dan dapat dikueri beberapa kali, membuat analisis keamanan berulang menjadi efisien.

Fase 2: Menjalankan kueri CodeQL

Setelah database ada, Anda menjalankan kueri untuk menemukan masalah keamanan:

  • Paket kueri standar: GitHub menyediakan kumpulan kueri yang dikumpulkan untuk kerentanan umum (standar OWASP Top 10, CWE).
  • Kueri kustom: Tulis kueri Anda sendiri untuk menemukan pola keamanan khusus organisasi atau pelanggaran standar pengkodean.
  • Eksekusi kueri: Mesin CodeQL menjalankan kueri terhadap database, mencari pola kode yang cocok dengan tanda tangan kerentanan.
  • Performa: Kueri dijalankan dengan cepat karena beroperasi pada database terindeks daripada file sumber mentah.

Contoh kategori kueri meliputi:

  • Kerentanan injeksi: Injeksi SQL, injeksi perintah, pembuatan skrip lintas situs.
  • Masalah autentikasi: Kebijakan kata sandi yang lemah, pemeriksaan autentikasi yang hilang, manajemen sesi yang tidak aman.
  • Masalah kriptografi: Algoritma lemah, kredensial yang dikodekan secara permanen, keacakan yang tidak mencukupi.
  • Manajemen sumber daya: Kebocoran memori, kelelahan sumber daya, konsumsi sumber daya yang tidak terkendali.

Fase 3: Menginterpretasikan hasil

Fase akhir menyajikan temuan dalam format yang dapat ditindakkan:

  • Peringkat hasil: CodeQL memprioritaskan temuan berdasarkan tingkat keparahan, tingkat keyakinan, dan eksploitasi.
  • Informasi kontekstual: Setiap temuan mencakup lokasi file, nomor baris, cuplikan kode yang terpengaruh, dan jalur aliran data.
  • Panduan remediasi: Hasilnya termasuk penjelasan tentang kerentanan dan rekomendasi untuk memperbaikinya.
  • Integrasi: Hasil terintegrasi dengan tab GitHub Security, anotasi permintaan pull, dan file SARIF untuk alat eksternal.

Bahasa kueri CodeQL

Kueri CodeQL ditulis dalam bahasa deklaratif yang dirancang khusus untuk menganalisis kode:

Struktur dan sintaks kueri

CodeQL menggunakan pemrograman logika berorientasi objek:

  • Kelas dan predikat: Tentukan apa yang Anda cari menggunakan kelas yang mewakili elemen kode (fungsi, variabel, ekspresi).
  • Pendekatan deklaratif: Jelaskan apa yang ingin Anda temukan daripada cara menemukannya.
  • Pencocokan pola: Gunakan predikat untuk mencocokkan pola kode dan hubungan.
  • Komposabilitas: Buat kueri kompleks dengan menggabungkan predikat yang lebih sederhana.

Contoh struktur kueri:

import javascript

from SqlExecution sql, Source source
where source.flowsTo(sql.getAnArgument())
select sql, "SQL query vulnerable to injection from $@.", source, "user input"

Kueri ini menemukan kerentanan injeksi SQL dengan:

  • Mengidentifikasi titik eksekusi SQL.
  • Menemukan sumber input pengguna.
  • Melacak aliran data dari input ke eksekusi SQL.
  • Melaporkan kerentanan dengan konteks.

Pustaka kueri standar

GitHub menyediakan pustaka kueri yang luas:

  • Kueri keamanan: Deteksi kerentanan OWASP Top 10, kategori CWE, dan masalah keamanan khusus bahasa.
  • Kueri kualitas kode: Temukan bau kode, masalah pemeliharaan, masalah performa, dan pelanggaran praktik terbaik.
  • Kontribusi komunitas: Ribuan kueri disumbangkan oleh peneliti dan pengembang keamanan.
  • Pembaruan reguler: GitHub Security Lab terus menambahkan kueri baru untuk kerentanan yang muncul.

Anda dapat menggunakan kueri ini as-is atau menyesuaikannya untuk kebutuhan spesifik Anda.

CodeQL dalam keamanan GitHub

CodeQL terintegrasi secara mendalam dengan fitur keamanan GitHub:

Pemindaian kode dengan CodeQL

Analisis keamanan otomatis:

  • Penyiapan default: Aktifkan pemindaian CodeQL dengan satu klik di pengaturan repositori.
  • Pemindaian terjadwal: Pindai secara otomatis pada setiap push, pull request, atau sesuai jadwal.
  • Dukungan multi-bahasa: Secara otomatis mendeteksi bahasa di repositori Anda dan menjalankan kueri yang sesuai.
  • Presentasi hasil: Temuan keamanan muncul di tab Keamanan dengan penjelasan terperinci.

Integrasi permintaan pull:

  • Anotasi sebaris: Temuan keamanan muncul sebagai komentar langsung pada baris kode yang rentan dalam permintaan pull.
  • Pemeriksaan pemblokiran: Konfigurasikan CodeQL sebagai pemeriksaan wajib yang harus lulus sebelum penggabungan.
  • Pemindaian diferensial: Hanya melaporkan kerentanan baru yang diperkenalkan oleh permintaan pull, mengurangi kebisingan.
  • Umpan balik pengembang: Pengembang melihat masalah keamanan segera saat kode segar dalam pikiran mereka.

GitHub Advanced Security

Untuk organisasi, GitHub Advanced Security menyediakan kemampuan tambahan:

  • Pemindaian repositori privat: Jalankan CodeQL pada repositori privat.
  • Eksekusi kueri kustom: Unggah dan jalankan kueri khusus organisasi.
  • Gambaran umum keamanan: Dasbor memperlihatkan postur keamanan di semua repositori.
  • Manajemen peringatan: Lakukan triase, tetapkan, dan lacak temuan keamanan di seluruh tim.

Menggunakan CodeQL dalam alur CI/CD

CodeQL memperluas di luar GitHub untuk berintegrasi dengan berbagai sistem CI/CD:

Pendekatan integrasi

Integrasi GitHub Actions:

- name: Initialize CodeQL
  uses: github/codeql-action/init@v2
  with:
    languages: javascript, python

- name: Perform CodeQL Analysis
  uses: github/codeql-action/analyze@v2

Alur kerja ini:

  • Menginisialisasi CodeQL untuk bahasa tertentu.
  • Membangun aplikasi Anda (atau menganalisis tanpa membangun).
  • Menjalankan kueri keamanan.
  • Mengunggah hasil ke tab GitHub Security.

Integrasi dengan Azure Pipelines:

CodeQL dapat berjalan di Azure Pipelines menggunakan antarmuka baris perintah:

  • Instal CodeQL CLI: Unduh dan instal bundel CodeQL di alur Anda.
  • Buat database: Jalankan codeql database create selama build Anda.
  • Menganalisis database: Jalankan codeql database analyze dengan paket kueri yang dipilih.
  • Ekspor hasil: Hasilkan file SARIF untuk visualisasi di Azure DevOps.

Sistem CI/CD lainnya:

CodeQL CLI mendukung platform CI/CD apa pun:

  • Jenkins: Jalankan analisis CodeQL sebagai langkah build.
  • GitLab CI/CD: Jalankan CodeQL di alur GitLab dengan output SARIF.
  • CircleCI: Mengintegrasikan pemindaian CodeQL ke dalam alur kerja CircleCI.
  • Sistem kustom: Gunakan CodeQL CLI dari lingkungan apa pun yang dapat menjalankan alat baris perintah.

Gerbang keamanan

Gunakan hasil CodeQL sebagai gerbang kualitas:

  • Gagal membangun: Konfigurasikan alur untuk gagal saat CodeQL menemukan kerentanan tingkat keparahan tinggi.
  • Analisis tren: Lacak metrik keamanan dari waktu ke waktu untuk mengukur peningkatan.
  • Persyaratan kepatuhan: Hasilkan bukti pemindaian keamanan untuk audit dan sertifikasi kepatuhan.
  • Remediasi otomatis: Memicu alur kerja otomatis saat kerentanan tertentu terdeteksi.

Alat pengembangan CodeQL

CodeQL menyediakan alat untuk membuat dan menguji kueri:

Ekstensi Visual Studio Code

Ekstensi resmi CodeQL untuk VS Code menawarkan:

  • Pengembangan kueri: Tulis dan uji kueri CodeQL dengan penyorotan sintaksis, lengkapi otomatis, dan dokumentasi sebaris.
  • Analisis database lokal: Jalankan kueri terhadap database yang dibuat dari basis kode lokal.
  • Visualisasi hasil: Lihat hasil kueri dengan navigasi kode sumber dan jalur aliran data.
  • Dukungan debugging: Langkah-langkah eksekusi kueri untuk memahami hasil dan mengoptimalkan performa.

Antarmuka baris perintah

CodeQL CLI memungkinkan analisis yang dapat ditulis:

  • Pembuatan database:codeql database create mengekstrak kode ke dalam format yang dapat dikueri.
  • Eksekusi kueri:codeql database analyze menjalankan kueri dan menghasilkan hasil.
  • Kueri pengujian:codeql test run memvalidasi kueri terhadap kasus pengujian.
  • Manajemen paket: Mengunduh dan mengelola paket kueri standar.

Manfaat CodeQL untuk otomatisasi keamanan

Mengintegrasikan CodeQL ke dalam proses DevSecOps Anda memberikan keuntungan signifikan:

Produktivitas pengembang

Deteksi dini:

  • Keamanan shift-left: Temukan kerentanan selama pengembangan dibandingkan dengan dalam produksi.
  • Remediasi yang lebih cepat: Perbaiki masalah saat kode baru dan perubahan masih kecil.
  • Peluang pembelajaran: Pengembang mempelajari praktik pengkodian yang aman dari umpan balik langsung.
  • Pengurangan pengalihan konteks: Temuan keamanan muncul di alat pengembangan yang sudah tidak asing lagi.

Hasil yang akurat:

  • Jumlah positif palsu rendah: Analisis semantik menghasilkan temuan yang lebih akurat daripada pencocokan pola.
  • Informasi kontekstual: Hasilnya termasuk jalur aliran data yang menunjukkan dengan tepat bagaimana kerentanan terjadi.
  • Temuan yang diprioritaskan: Fokus pada masalah yang dapat dieksploitasi daripada masalah teoritis.
  • Penemuan varian: Temukan semua instans pola kerentanan, bukan hanya contoh yang tampak jelas.

Keamanan organisasi

Cakupan komprehensif:

  • Seluruh basis kode: Analisis semua kode, termasuk dependensi pihak ketiga dan komponen warisan.
  • Beberapa bahasa: Analisis keamanan seragam di seluruh aplikasi poliglot.
  • Standar yang konsisten: Terapkan aturan keamanan yang sama di semua repositori.
  • Analisis historis: Pindai kode yang ada untuk menetapkan tolok ukur keamanan.

Keamanan yang dapat diskalakan:

  • Pemindaian otomatis: Tidak ada tinjauan keamanan manual yang diperlukan untuk setiap penerapan.
  • Pemantauan berkelanjutan: Pemindaian reguler mendeteksi kerentanan yang baru diungkapkan.
  • Keamanan sebagai kode: Mengkodifikasi persyaratan keamanan sebagai kueri yang disimpan dalam kontrol versi.
  • Berbagi pengetahuan: Pustaka kueri menangkap pengetahuan keamanan institusi.

Kepatuhan dan tata kelola

Jejak audit:

  • Riwayat pemindaian: Rekam semua pemindaian keamanan dengan tanda waktu dan hasil.
  • Menemukan siklus hidup: Lacak kerentanan dari deteksi melalui remediasi.
  • Penegakan kebijakan: Menunjukkan bahwa pemindaian keamanan terjadi untuk setiap rilis.
  • Pembuatan bukti: Membuat laporan untuk auditor dan kerangka kerja kepatuhan.

Untuk informasi selengkapnya tentang CodeQL, lihat Gambaran Umum CodeQL.

Untuk alat yang tersedia, lihat Alat CodeQL.