Hvad er CodeQL?
CodeQL er det analyseprogram, der bruges af udviklere til at automatisere sikkerhedskontroller og af sikkerhedsforskere til at udføre variantanalyse.
I CodeQL behandles kode som data. Sikkerhedsrisici, fejl og andre fejl udformes som forespørgsler, der kan udføres på databaser, der er udtrukket fra kode. Du kan køre Standard CodeQL-forespørgsler, der er skrevet af GitHub-forskere og communitybidragydere, eller skrive dine egne til brug i brugerdefinerede analyser. Forespørgsler, der finder potentielle fejl, fremhæver resultatet direkte i kildefilen.
I dette undermodul får du mere at vide om værktøjet til statisk analyse af CodeQL, og hvordan det bruger databaser, forespørgselspakker og sprogpakker til forespørgsler til at udføre variantanalyse.
Variantanalyse
Variantanalyse er processen med at bruge en kendt sikkerhedsrisiko som seed til at finde lignende problemer i din kode. Det er en teknik, som sikkerhedsteknikere bruger til at identificere potentielle sårbarheder og sikre, at disse trusler er korrekt rettet på tværs af flere kodebaser.
Forespørgselskode ved hjælp af CodeQL er den mest effektive måde at udføre variantanalyse på. Du kan bruge Standard CodeQL-forespørgsler til at identificere frøsårbarheder eller finde nye sikkerhedsrisici ved at skrive dine egne brugerdefinerede CodeQL-forespørgsler. Derefter kan du udvikle eller gentage forespørgslen for automatisk at finde logiske varianter af den samme fejl, der kan gå glip af ved hjælp af traditionelle manuelle teknikker.
CodeQL-databaser
CodeQL-databaser indeholder data, der kan forespørges om, og som er udtrukket fra en kodebase for et enkelt sprog på et bestemt tidspunkt. Databasen indeholder en komplet hierarkisk repræsentation af koden, herunder en repræsentation af det abstrakte syntakstræ, dataflowdiagrammet og control-flow-grafen.
Hvert sprog har sit eget entydige databaseskema, der definerer de relationer, der bruges til at oprette en database. Skemaet indeholder en grænseflade mellem den indledende leksikalske analyse, der udføres under udtrækningsprocessen, og den faktiske komplekse analyse af CodeQL-forespørgsels evaluatoren. Skemaet angiver f.eks., at der er en tabel for hver sprogkonstruktør.
For hvert sprog definerer CodeQL-bibliotekerne klasser for at give et abstraktionslag over databasetabellerne. Dette giver en objektorienteret visning af dataene, hvilket gør det nemmere at skrive forespørgsler.
I en CodeQL-database til et Java-program er to nøgletabeller f.eks.:
- Den
expressionstabel, der indeholder en række for hvert enkelt udtryk i kildekoden, der blev analyseret under buildprocessen. - Den
statementstabel, der indeholder en række for hver enkelt sætning i kildekoden, der blev analyseret under oprettelsesprocessen.
CodeQL-biblioteket definerer klasser, der giver et abstraktionslag over hver af disse tabeller (og de relaterede hjælpetabeller): Expr og Stmt.
Forespørgselspakker
CodeQL-forespørgselspakker gør det muligt at vælge forespørgsler baseret på deres filnavn, metadataegenskaber eller placering på disken eller i en QL-pakke. Opret forespørgselspakker til de forespørgsler, du ofte vil bruge i dine CodeQL-analyser.
Med forespørgselspakker kan du overføre flere forespørgsler til CodeQL uden at skulle angive stien til hver forespørgselsfil enkeltvist. Definitioner af forespørgselspakker gemmes i YAML-filer med filtypenavnet .qls. En pakkedefinition er en sekvens af instruktioner, hvor hver instruktion er en YAML-tilknytning med (normalt) en enkelt nøgle. Instruktionerne udføres i den rækkefølge, de vises i definitionen af forespørgselspakken. Når alle instruktionerne i pakkedefinitionen er udført, er resultatet et sæt valgte forespørgsler.
Standardforespørgselspakker
Der er to indbyggede forespørgselspakker til CodeQL:
-
default: Dette er de forespørgsler, der kører som standard i CodeQL-kodescanning på GitHub, som er tilgængelig med standardkonfigurationen af kodescanning. Forespørgslerne i denne forespørgselspakke er meget præcise og returnerer få falske positive kodescanningsresultater. I forhold til densecurity-extendedforespørgselspakke returnerer standardpakken færre resultater af kodescanning med lav genkendelsessikkerhed. -
security-extended: Denne pakke indeholder alle forespørgsler fradefault-pakken samt ekstra sikkerhedsforespørgsler med lidt lavere præcision og alvorsgrad. Den er tilgængelig med standardkonfigurationen af kodescanning og er angivet som indstillingen "Udvidet" på rullelisten forespørgselspakker. I forhold til dendefaultforespørgselspakke kan denne pakke returnere et større antal falske positive kodescanningsresultater.
Standardkonfigurationen af kodescanning bruger forespørgselspakken default. Dette kan ændres ved at vælge overløbsikonet for at få vist CodeQL-konfigurationen og derefter vælge til knappen Rediger. Under "Scanningsindstillinger" kan du vælge en af de to indstillinger, der er beskrevet som forespørgselspakken.
CodeQL-pakker
CodedQL-pakker bruges til at organisere de filer, der bruges i CodeQL-analyser, så du nemt kan oprette, dele, være afhængige af og køre CodeQL-forespørgsler og -biblioteker. De indeholder forespørgsler, biblioteksfiler, forespørgselspakker og vigtige metadata. Med CodeQL-pakker og kommandoerne til pakkeadministration i CodeQL-kommandolinjegrænsefladen kan du publicere dine brugerdefinerede forespørgsler og integrere dem i din codebase-analyse.
Der er tre typer CodeQL-pakker: forespørgselspakker, bibliotekspakker og modelpakker.
- Forespørgselspakker er designet til at blive kørt. Når en forespørgselspakke udgives, indeholder pakken alle transitive afhængigheder og forudkompilerede repræsentationer af hver forespørgsel ud over forespørgselskilderne. Dette sikrer ensartet og effektiv udførelse af forespørgslerne i pakken.
- Bibliotekspakker er designet til at blive brugt af forespørgselspakker (eller andre bibliotekspakker) og indeholder ikke selve forespørgslerne. Bibliotekerne kompileres ikke separat.
- Modelpakker kan bruges til at udvide analyse af kodescanning, så de omfatter afhængigheder, der ikke understøttes som standard. Modelpakker er i øjeblikket i betaversion og kan ændres. Under betaversionen er modelpakker tilgængelige til Java-analyse på lagerniveau. Du kan finde flere oplysninger om, hvordan du opretter dine egne modelpakker, under "Oprettelse af en CodeQL-modelpakke".
CodeQL-pakkestruktur
CodeQL-kommandolinjegrænsefladen kan bruges til at udvikle og udgive en pakke ved hjælp af pack init kommandoen . Denne kommando opretter den mappestruktur og de filer, der kræves, herunder den primære fil, der kaldes qlpack.yml i rodmappen. Metadataene i hver qlpack.yml fil fortæller CodeQL, hvordan du kompilerer forespørgsler i pakken, hvilke biblioteker pakken afhænger af, og hvor du kan finde definitioner af forespørgselspakker.
Indholdet af CodeQL-pakken (forespørgsler eller biblioteker, der bruges i CodeQL-analysen) er inkluderet i den samme mappe som qlpack.ymleller dens undermapper.
Den mappe, der indeholder filen qlpack.yml, fungerer som rodmappen for indholdet af CodeQL-pakken. For alle .ql og .qlls-filer i pakken vil CodeQL løse alle importsætninger i forhold til den mappe, der indeholder den qlpack.yml fil i pakkens rod.
Her er et eksempel qlpack.yml fil:
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: "*"
Du kan finde flere oplysninger om, hvordan du opretter og publicerer dine egne CodeQL-pakker, under "Publicering og brug af CodeQL-pakker"[1]