Explorați CodeQL în GitHub
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 analyzecu 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 createextrage codul în format interogabil. -
Executarea interogării:
codeql database analyzerulează interogări și generează rezultate. -
Interogări de testare:
codeql test runValidează 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.