Explorați CodeQL în GitHub

Finalizat

Ce este CodeQL

CodeQL este un motor de analiză semantică a codului dezvoltat de GitHub care tratează codul ca date. În loc să caute pur și simplu modele de text, CodeQL înțelege structura și semnificația codului dvs., permițând o analiză sofisticată a securității și a calității.

Instrumentele tradiționale de analiză statică produc adesea fals pozitive, deoarece folosesc potrivirea simplă a modelelor. Abordarea semantică a CodeQL înțelege contextul codului, relațiile dintre elementele de cod și fluxul de date prin aplicații, rezultând o detectare mai precisă a vulnerabilităților.

Caracteristici cheie ale CodeQL

CodeQL tratează codul ca pe o bază de date:

  • Reprezentare structurală: Convertește codul sursă într-o bază de date care captează arbori de sintaxă, grafice de flux de control și căi de flux de date.
  • Format interogabil: Face codul interogabil folosind un limbaj de interogare specializat, similar cu interogarea unei baze de date tradiționale.
  • Abordare agnostică limbajului: Suportă mai multe limbaje de programare, inclusiv C/C++, C#, Java, JavaScript/TypeScript, Python, Ruby, Go și Swift.
  • Acoperire cuprinzătoare: Analizează nu doar fișiere individuale, ci baze de cod întregi cu toate interconexiunile lor.

CodeQL permite o analiză precisă a securității:

  • Analiza variantelor: După ce identificați o vulnerabilitate, puteți scrie interogări pentru a găsi probleme similare în întreaga bază de cod.
  • Analiza fluxului de date: Urmărește modul în care datele se deplasează prin aplicație de la surse (intrare utilizator) la absorbante (operațiuni sensibile).
  • Urmărirea petelor: Identifică când datele care nu sunt de încredere ajung la operațiuni sensibile fără validare sau igienizare adecvată.
  • Analiza debitului de control: Înțelege căile de execuție și logica condiționată pentru a găsi vulnerabilități care apar doar în condiții specifice.

Cum funcționează CodeQL

Analiza CodeQL implică trei faze distincte care transformă codul sursă în constatări de securitate acționabile:

Faza 1: Creați o bază de date CodeQL

Primul pas extrage o reprezentare structurată a codului dvs.:

  • Extragerea codului: Analizează fișierele sursă în timpul compilării sau prin analiză statică.
  • Crearea bazei de date: Construiește o bază de date cuprinzătoare care reprezintă structura codului, inclusiv arbori de sintaxă abstracti, grafice de flux de control și dependențe de date.
  • Captură metadate: Înregistrează locațiile fișierelor, numerele de linie, domeniile variabile, apelurile de funcții și ierarhiile de clasă.
  • Optimizare: Indexează baza de date pentru interogări eficiente, chiar și pe baze de cod mari.

Această bază de date devine baza pentru toate analizele ulterioare. Este creat o singură dată și poate fi interogat de mai multe ori, făcând eficientă analiza iterativă de securitate.

Faza 2: Rulați interogări CodeQL

Odată ce baza de date există, executați interogări pentru a găsi probleme de securitate:

  • Pachete de interogări standard: GitHub oferă seturi de interogări organizate pentru vulnerabilități comune (OWASP Top 10, standarde CWE).
  • Interogări personalizate: Scrieți propriile interogări pentru a găsi modele de securitate specifice organizației sau încălcări ale standardelor de codare.
  • Executarea interogării: Motorul CodeQL rulează interogări în baza de date, căutând modele de cod care se potrivesc cu semnăturile de vulnerabilitate.
  • Performanță: Interogările se execută rapid, deoarece operează pe baza de date indexată, mai degrabă decât pe fișierele sursă brute.

Exemple de categorii de interogări includ:

  • Vulnerabilități de injecție: Injecție SQL, injecție de comenzi, scripting între site-uri.
  • Probleme de autentificare: Politici de parole slabe, verificări de autentificare lipsă, gestionare nesigură a sesiunii.
  • Probleme de criptografie: Algoritmi slabi, acreditări codificate, aleatoriu insuficient.
  • Managementul resurselor: Scurgeri de memorie, epuizare a resurselor, consum necontrolat de resurse.

Faza 3: Interpretarea rezultatelor

Faza finală prezintă constatările în formate acționabile:

  • Clasamentul rezultatelor: CodeQL prioritizează constatările în funcție de severitate, nivel de încredere și exploatabilitate.
  • Informații contextuale: Fiecare constatare include locații de fișiere, numere de linie, fragmente de cod afectate și căi de flux de date.
  • Îndrumări de remediere: Rezultatele includ explicații ale vulnerabilității și recomandări pentru remedierea acesteia.
  • Integrare: Rezultatele se integrează cu fila GitHub Security, adnotările de solicitare pull și fișierele SARIF pentru instrumente externe.

Limbajul de interogare CodeQL

Interogările CodeQL sunt scrise într-un limbaj declarativ special conceput pentru analiza codului:

Structura interogării și sintaxa

CodeQL folosește programarea logică orientată pe obiecte:

  • Clase și predicate: Definiți ceea ce căutați folosind clase care reprezintă elemente de cod (funcții, variabile, expresii).
  • Abordare declarativă: Descrieți ce doriți să găsiți, mai degrabă decât cum să găsiți.
  • Potrivirea modelului: Utilizați predicate pentru a potrivi modelele și relațiile de cod.
  • Componibilitate: Construiți interogări complexe combinând predicate mai simple.

Exemplu de structură de interogare:

import javascript

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

Această interogare găsește vulnerabilități de injecție SQL prin:

  • Identificarea punctelor de execuție SQL.
  • Găsirea surselor de contribuție a utilizatorului.
  • Urmărirea fluxului de date de la intrare la execuția SQL.
  • Raportarea vulnerabilităților cu context.

Biblioteci de interogări standard

GitHub oferă biblioteci extinse de interogări:

  • Întrebări de securitate: Detectați primele 10 vulnerabilități OWASP, categoriile CWE și problemele de securitate specifice limbii.
  • Interogări de calitate a codului: Găsiți mirosuri de cod, probleme de întreținere, probleme de performanță și încălcări ale celor mai bune practici.
  • Contribuții comunitare: Mii de interogări furnizate de cercetători și dezvoltatori de securitate.
  • Actualizări regulate: GitHub Security Lab adaugă continuu noi interogări pentru vulnerabilități emergente.

Puteți utiliza aceste interogări as-is sau le puteți personaliza pentru nevoile dvs. specifice.

CodeQL în securitatea GitHub

CodeQL se integrează profund cu caracteristicile de securitate ale GitHub:

Scanarea codului cu CodeQL

Analiza automată a securității:

  • Configurare implicită: Activați scanarea CodeQL cu un singur clic în setările depozitului.
  • Scanări programate: Scanați automat la fiecare împingere, solicitare de extragere sau după un program.
  • Suport pentru mai multe limbi: Detectează automat limbile din depozit și rulează interogările corespunzătoare.
  • Prezentarea rezultatelor: Constatările de securitate apar în fila Securitate cu explicații detaliate.

Integrarea solicitărilor de extragere:

  • Adnotări în linie: Constatările de securitate apar ca comentarii direct pe liniile de cod vulnerabile din solicitările de extragere.
  • Verificări de blocare: Configurați CodeQL ca o verificare necesară care trebuie să treacă înainte de fuziune.
  • Scanare diferențială: Raportează doar noile vulnerabilități introduse de solicitarea de extragere, reducând zgomotul.
  • Feedback-ul dezvoltatorilor: Dezvoltatorii văd imediat problemele de securitate în timp ce codul este proaspăt în mintea lor.

Securitate avansată GitHub

Pentru organizații, GitHub Advanced Security oferă capabilități suplimentare:

  • Scanarea depozitului privat: Rulați CodeQL pe depozite private.
  • Executarea interogărilor personalizate: Încărcați și rulați interogări specifice organizației.
  • Prezentare generală a securității: Tablou de bord care arată postura de securitate în toate depozitele.
  • Gestionarea alertelor: Triați, atribuiți și urmăriți constatările de securitate între echipe.

Utilizarea CodeQL în conductele CI/CD

CodeQL se extinde dincolo de GitHub pentru a se integra cu diverse sisteme CI/CD:

Abordări de integrare

Integrare 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

Acest flux de lucru:

  • Inițializează CodeQL pentru limbile specificate.
  • Construiește aplicația (sau analizează fără a construi).
  • Rulează interogări de securitate.
  • Încarcă rezultatele în fila Securitate GitHub.

Integrare Azure Pipelines:

CodeQL poate rula în Azure Pipelines utilizând interfața de linie de comandă:

  • Instalați CodeQL CLI: Descărcați și instalați pachetul CodeQL în conducta dvs.
  • Creați o bază de date: Rulați codeql database create în timpul construcției.
  • Analizați baza de date: Executați codeql database analyze cu pachetele de interogări selectate.
  • Rezultatele exportului: Generați fișiere SARIF pentru vizualizare în Azure DevOps.

Alte sisteme CI/CD:

CodeQL CLI acceptă orice platformă CI/CD:

  • Jenkins: Executați analiza CodeQL ca pași de construcție.
  • GitLab CI/CD: Rulați CodeQL în conductele GitLab cu ieșire SARIF.
  • CircleCI: Integrați scanările CodeQL în fluxurile de lucru CircleCI.
  • Sisteme personalizate: Utilizați CodeQL CLI din orice mediu care poate rula instrumente de linie de comandă.

Porți de securitate

Utilizați rezultatele CodeQL ca porți de calitate:

  • Compilări eșuate: Configurați conductele pentru a eșua atunci când CodeQL găsește vulnerabilități de mare severitate.
  • Analiza tendințelor: Urmăriți valorile de securitate în timp pentru a măsura îmbunătățirile.
  • Cerințe de conformitate: Generați dovezi de scanare de securitate pentru audituri și certificări de conformitate.
  • Remediere automată: Declanșați fluxuri de lucru automate atunci când sunt detectate vulnerabilități specifice.

Instrumente de dezvoltare CodeQL

CodeQL oferă instrumente pentru crearea și testarea interogărilor:

Extensia Visual Studio Code

Extensia oficială CodeQL pentru VS Code oferă:

  • Dezvoltarea interogărilor: Scrieți și testați interogări CodeQL cu evidențierea sintaxei, completarea automată și documentația în linie.
  • Analiza bazei de date locale: Rulați interogări pe baze de date create din baze de cod locale.
  • Vizualizarea rezultatelor: Vedeți rezultatele interogării cu navigarea în codul sursă și căile fluxului de date.
  • Suport pentru depanare: Parcurgeți execuția interogărilor pentru a înțelege rezultatele și a optimiza performanța.

Interfață de linie de comandă

CodeQL CLI permite analiza scriptabilă:

  • Crearea bazei de date:codeql database create extrage codul în format interogabil.
  • Executarea interogării:codeql database analyze rulează interogări și generează rezultate.
  • Interogări de testare:codeql test run Validează interogările în cazurile de testare.
  • Managementul pachetului: Descărcați și gestionați pachetele de interogări standard.

Beneficiile CodeQL pentru automatizarea securității

Integrarea CodeQL în procesul DevSecOps oferă avantaje semnificative:

Productivitatea dezvoltatorilor

Depistare timpurie:

  • Securitate shift-left: Găsiți vulnerabilități în timpul dezvoltării, mai degrabă decât în producție.
  • Remediere mai rapidă: Remediați problemele atunci când codul este proaspăt și modificările sunt mici.
  • Oportunități de învățare: Dezvoltatorii învață practici de codare securizate din feedback imediat.
  • Comutare contextuală redusă: Constatările de securitate apar în instrumente de dezvoltare familiare.

Rezultate precise:

  • Rezultate fals pozitive scăzute: Analiza semantică produce rezultate mai precise decât potrivirea modelelor.
  • Informații contextuale: Rezultatele includ căi de flux de date care arată exact cum apar vulnerabilitățile.
  • Constatări prioritizate: Concentrați-vă pe probleme exploatabile, mai degrabă decât pe preocupări teoretice.
  • Descoperirea variantelor: Găsiți toate cazurile unui model de vulnerabilitate, nu doar exemplele evidente.

Securitatea organizațională

Acoperire cuprinzătoare:

  • Întreaga bază de cod: Analizați tot codul, inclusiv dependențele terțe și componentele moștenite.
  • Mai multe limbi: Analiză uniformă a securității în aplicațiile poliglote.
  • Standarde consistente: Aplicați aceleași reguli de securitate în toate depozitele.
  • Analiză istorică: Scanați codul existent pentru a stabili linii de bază de securitate.

Securitate scalabilă:

  • Scanare automată: Nu sunt necesare revizuiri manuale de securitate pentru fiecare commit.
  • Monitorizare continuă: Scanările regulate detectează vulnerabilitățile nou dezvăluite.
  • Securitate ca cod: Codificați cerințele de securitate ca interogări stocate în controlul versiunilor.
  • Schimbul de cunoștințe: Bibliotecile de interogare captează cunoștințe de securitate instituțională.

Conformitate și guvernanță

Piste de audit:

  • Istoricul scanării: Înregistrarea tuturor scanărilor de securitate cu marcaje temporale și rezultate.
  • Găsirea ciclului de viață: Urmăriți vulnerabilitățile de la detectare până la remediere.
  • Aplicarea politicii: Demonstrați că scanările de securitate au loc pentru fiecare versiune.
  • Generarea de dovezi: Producerea de rapoarte pentru auditori și cadre de conformitate.

Pentru mai multe informații despre CodeQL, consultați Prezentare generală CodeQL.

Pentru instrumentele disponibile, consultați Instrumente CodeQL.