Code scannen
Met codescans in GitHub Advanced Security voor Azure DevOps kunt u de code in een Azure DevOps-opslagplaats analyseren om beveiligingsproblemen en coderingsfouten te vinden. Eventuele problemen die door de analyse worden geïdentificeerd, worden als waarschuwing gegenereerd. Codescans maken gebruik van CodeQL om beveiligingsproblemen op te sporen.
CodeQL is de codeanalyse-engine die door GitHub is ontwikkeld om beveiligingscontroles te automatiseren. U kunt uw code analyseren met behulp van CodeQL en de resultaten weergeven als waarschuwingen voor codescans. Zie de CodeQL-documentatie voor meer specifieke documentatie over CodeQL.
GitHub Advanced Security voor Azure DevOps werkt met Azure-opslagplaatsen. Als u GitHub Advanced Security wilt gebruiken met GitHub-opslagplaatsen, raadpleegt u GitHub Advanced Security.
Aanvullende configuraties voor codescans
Taal- en queryondersteuning
GitHub-experts, beveiligingsonderzoekers en community-inzenders schrijven en onderhouden de standaard CodeQL-query's die worden gebruikt voor codescans. De query's worden regelmatig bijgewerkt om de analyse te verbeteren en eventuele fout-positieve resultaten te verminderen. De query's zijn open source, zodat u de query's in de github/codeql-opslagplaats kunt bekijken en hieraan kunt bijdragen.
CodeQL ondersteunt en gebruikt de volgende taal-id's:
Taal | Identificatie | Optionele alternatieve id's (indien aanwezig) |
---|---|---|
C/C++ | c-cpp |
c of cpp |
C# | csharp |
|
Go | go |
|
Java/Kotlin | java-kotlin |
|
JavaScript/TypeScript | javascript |
|
Python | python |
|
Ruby | ruby |
|
Swift | swift |
Tip
- Gebruik
c-cpp
deze functie om code te analyseren die is geschreven in C, C++ of beide. - Gebruik
java-kotlin
deze functie om code te analyseren die is geschreven in Java, Kotlin of beide. - Gebruik
javascript
deze functie om code te analyseren die is geschreven in JavaScript, TypeScript of beide.
Zie Ondersteunde talen en frameworks voor meer informatie.
U kunt de specifieke query's en taakdetails bekijken die door CodeQL worden uitgevoerd in het buildlogboek.
Aanpassing van de buildmodus voor codescans
Codescan ondersteunt twee buildmodi bij het instellen van een pijplijn voor scannen:
none
- de CodeQL-database wordt rechtstreeks vanuit de codebasis gemaakt zonder de codebasis te bouwen (ondersteund voor alle geïnterpreteerde talen en daarnaast ondersteund voor C# en Java).manual
- u definieert de buildstappen die moeten worden gebruikt voor de codebasis in de werkstroom (ondersteund voor alle gecompileerde talen).
Zie CodeQL-codescans voor gecompileerde talen voor meer informatie over de verschillende buildmodi, waaronder een vergelijking van de voordelen van elke buildmodus.
Voor het uitvoeren van analyse van codescans via GitHub Advanced Security voor Azure DevOps is de autobuild
buildmodus in plaats daarvan een afzonderlijke build-taak, AdvancedSecurity-CodeQL-Autobuild@1
.
Tip
De buildmodus none
kan worden gebruikt in combinatie met andere geïnterpreteerde talen (bijvoorbeeld JavaScript, Python, Ruby).
Als de buildmodus none
is opgegeven voor C# of Java in combinatie met andere gecompileerde talen die geen buildmodus none
ondersteunen, mislukt de pijplijntaak.
Hier volgt een voorbeeld van een geldige configuratie met meerdere talen en none
de buildmodus:
trigger: none
pool:
vmImage: windows-latest
steps:
- task: AdvancedSecurity-Codeql-Init@1
displayName: Initialize CodeQL
inputs:
# build mode `none` is supported for C# and Java, and JavaScript is an interpreted language
# and build mode `none` has no impact on JavaScript analysis
languages: 'csharp, java, javascript'
buildtype: 'none'
- task: AdvancedSecurity-Codeql-Analyze@1
displayName: Perform CodeQL Analysis
Hier volgt een voorbeeld van een ongeldige configuratie met meerdere talen en none
de buildmodus:
trigger: none
pool:
vmImage: windows-latest
steps:
- task: AdvancedSecurity-Codeql-Init@1
displayName: Initialize CodeQL
inputs:
# build mode `none` is supported for C# but build mode `none` is NOT supported for Swift
# so this pipeline definition will result in a failed run
languages: 'csharp, swift'
buildtype: 'none'
- task: AdvancedSecurity-Codeql-Analyze@1
displayName: Perform CodeQL Analysis
Aangepaste query's gebruiken met CodeQL
Als u geen aangepast configuratiebestand hebt opgegeven in uw pijplijninstallatie, voert CodeQL het security-extended
querypakket uit om uw code te analyseren. U kunt aangepaste CodeQL-query's gebruiken om uw eigen query's te schrijven om specifieke beveiligingsproblemen en fouten te vinden. U moet ook een aangepast configuratiebestand maken om de standaardanalyse van CodeQL te wijzigen.
Als u bestaande aangepaste query's wilt zoeken of uw eigen aangepaste query wilt bijdragen, raadpleegt u Bijdragen aan CodeQL.
Analyse met aangepaste query's
De snelste manier om te beginnen met een aangepaste query is door een query te schrijven en op te slaan in uw lokale Azure DevOps-opslagplaats. U kunt de details van een aangepaste query aanpassen aan uw behoeften, maar deze moet ten minste een regel-id hebben. Zie CodeQL-query's schrijven voor meer informatie over het schrijven van uw eigen CodeQL-query. U kunt ook meerdere query's bundelen in een querysuite of pakketten gebruiken die zijn gepubliceerd door andere personen. Zie Publiceren en gebruiken van CodeQL-pakketten voor meer informatie.
Een aangepast configuratiebestand gebruiken
Een aangepast configuratiebestand is een manier om te beheren welke query's worden uitgevoerd tijdens de analyse van CodeQL op basis van uw code. U kunt meer query's of querypakketten opgeven die moeten worden uitgevoerd en de standaardCodeQL-query's wijzigen of uitschakelen.
Als u een specifieke query wilt opnemen die u wilt opnemen, geeft u de query op met een naam en pad naar de locatie van het querybestand (.ql) in uw opslagplaats.
Als u een specifiek pakket wilt opnemen dat u wilt opnemen, geeft u de naam van het pakket op. U kunt een willekeurig aantal CodeQL-querypakketten opgeven dat moet worden uitgevoerd in uw configuratiebestand.
De volgende stap bestaat uit het maken van een qlpack.yml
bestand. Dit bestand declareert het CodeQL-pakket en informatie hierover. Bestanden *.ql
in dezelfde map (of submap) als een qlpack.yml
onderdeel van het pakket worden beschouwd.
Tip
Het packs
-filter van het configuratiebestand biedt ondersteuning voor het downloaden van pakketten uit opslagplaatsen die worden gehost in GitHub, hoewel het queries
-filter dat niet doet.
Als het pakket privé is in GitHub, moet u een GitHub-toegangstoken opgeven via de AdvancedSecurity-Codeql-Init@1
taak als een omgevingsvariabele en variabelenaam als GITHUB_TOKEN
, met het bereik van het token .read:packages
Hier volgt een voorbeeld van een configuratiebestand:
name: "Run custom queries"
# When using a configuration file, if you do not disable default queries,
# then the default CodeQL queries in the `code-scanning` query suite will also execute upon analysis.
disable-default-queries: true
# To reference local queries saved to your repository,
# the path must start with `./` followed by the path to the custom query or queries.
# Names for each query referenced is optional.
queries:
- name: Use security-extended query suite
uses: security-extended
- name: Use local custom query (single query)
uses: ./customQueries/javascript/FindTestFunctions.ql
- name: Use local custom query (directory of queries)
uses: ./customQueries/javascript/MemoryLeakQueries
packs:
- mygithuborg/mypackname
paths:
- src
paths-ignore:
- src/node_modules
- '**/*.test.js'
query-filters:
- include:
kind: problem
- include:
precision: medium
- exclude:
id:
- js/angular/disabling-sce
- js/angular/insecure-url-allowlist
Tip
Configuratiebestandspecificaties negeren en hebben voorrang op configuraties op pijplijnniveau voor de AdvancedSecurity-Codeql-Init@1
taak.
includepaths
/ ignorepaths
wordt genegeerd of, indien paths
/paths-ignore
aanwezig, overschreven met waarden van .paths
/paths-ignore
querysuite
wordt overschreven met waarden die zijn opgegeven in queries
of packs
in het configuratiebestand.
Als u een aangepaste query gebruikt, ziet u hier een voorbeeld qlpack.yml
in de map met uw aangepaste query's:
version: 1.0.1
dependencies:
codeql/javascript-all: "*"
codeql/javascript-queries: "*"
De dependencies
variabele bevat alle afhankelijkheden van dit pakket en hun compatibele versiebereiken. Naar elke afhankelijkheid wordt verwezen als het scope/name
codeQL-bibliotheekpakket. Bij het definiëren dependencies
is uw qlpack.yml
afhankelijk van precies een van de kerntaalpakketten (bijvoorbeeld JavaScript, C#, Ruby, enzovoort), die bepaalt welke taal uw query kan analyseren.
Zie CodeQL-pakketstructuur aanpassen voor meer qlpack.yml
specifieke advies- en configuratieopties voor uw configuratiebestand.
Zodra u uw configuratiebestand hebt, moet u de pijplijn waarop CodeQL-analyse wordt uitgevoerd aanpassen om uw nieuwe bestand te kunnen gebruiken. Hier volgt een voorbeeldpijplijn die verwijst naar een configuratiebestand:
trigger: none
pool:
vmImage: windows-latest
# You can either specify your CodeQL variables in a variable block...
variables:
# `configfilepath` must be an absolute file path relative to the repository root
advancedsecurity.codeql.configfilepath: '$(build.sourcesDirectory)/.pipelines/steps/configfile.yml'
# Or you can specify variables as variables for the task. You do not need both definitions.
steps:
- task: AdvancedSecurity-Codeql-Init@1
displayName: Initialize CodeQL
inputs:
languages: 'javascript'
loglevel: '2'
configfilepath: '$(build.sourcesDirectory)/.pipelines/steps/configfile.yml'
# If downloading a pack from GitHub,
# you must include a GitHub access token with the scope of `read:packages`.
env:
GITHUB_TOKEN: $(githubtoken)
- task: AdvancedSecurity-Codeql-Analyze@1
displayName: Perform CodeQL Analysis
Waarschuwingen voor codescans
GitHub Advanced Security for Azure DevOps code scanning alerts include code scanning flags by repository that alert of application vulnerabilities op codeniveau.
Als u codescans wilt gebruiken, moet u eerst GitHub Advanced Security configureren voor Azure DevOps.
Het tabblad Geavanceerde beveiliging onder Opslagplaatsen in Azure DevOps is de hub om uw waarschuwingen voor het scannen van code weer te geven. Selecteer het tabblad Code scannen om scanwaarschuwingen weer te geven. U kunt filteren op vertakking, status, pijplijn, regeltype en ernst. Op dit moment worden in de Alerts Hub geen waarschuwingen weergegeven voor het scannen op pull-vertakkingen.
Er is geen effect op resultaten als de naam van pijplijnen of vertakkingen is gewijzigd. Het kan tot 24 uur duren voordat de nieuwe naam wordt weergegeven.
Als u ervoor kiest om aangepaste CodeQL-query's uit te voeren, is er standaard geen afzonderlijk filter voor waarschuwingen die zijn gegenereerd op basis van verschillende querypakketten. U kunt filteren op regel, die voor elke query uniek is.
Als u Geavanceerde beveiliging voor uw opslagplaats uitschakelt, verliest u de toegang tot de resultaten op het tabblad Geavanceerde beveiliging en de build-taak. De build-taak mislukt niet, maar eventuele resultaten van builds worden uitgevoerd met de taak terwijl Advanced Security is uitgeschakeld, worden verborgen en blijven niet behouden.
Meldingsdetails
Selecteer een waarschuwing voor meer informatie, inclusief herstelrichtlijnen. Elke waarschuwing bevat een locatie, beschrijving, voorbeeld en ernst.
Sectie | Uitleg |
---|---|
Locatie | In de sectie Locaties wordt een specifiek exemplaar beschreven waarin CodeQL een beveiligingsprobleem heeft gedetecteerd. Als er meerdere exemplaren van uw code zijn die dezelfde regel schenden, wordt er een nieuwe waarschuwing gegenereerd voor elke afzonderlijke locatie. De kaart Locaties bevat een directe koppeling naar het betreffende codefragment, zodat u het codefragment kunt selecteren dat moet worden omgeleid naar de Azure DevOps-webgebruikersinterface voor bewerking. |
Beschrijving | De beschrijving wordt geleverd door het CodeQL-hulpprogramma op basis van het probleem. |
Aanbeveling | De aanbeveling is de voorgestelde oplossing voor een bepaalde waarschuwing voor het scannen van code. |
Opmerking | In de voorbeeldsectie ziet u een vereenvoudigd voorbeeld van de geïdentificeerde zwakke plekken in uw code. |
Ernst | Ernstniveaus kunnen laag, gemiddeld, hoog of kritiek zijn. De ernstscore is gebaseerd op de opgegeven CVSS-score (Common Vulnerability Scoring System) voor de geïdentificeerde Common Weakness Enumeration (CWE). Meer informatie over hoe ernst wordt beoordeeld op dit GitHub-blogbericht. |
Waarschuwingen voor een opslagplaats weergeven
Iedereen met inzendermachtigingen voor een opslagplaats kan een overzicht bekijken van alle waarschuwingen voor een opslagplaats op het tabblad Geavanceerde beveiliging onder Opslagplaatsen. Selecteer het tabblad Code scannen om alle waarschuwingen voor geheim scannen weer te geven.
Als u resultaten wilt weergeven, moeten codescantaken eerst worden uitgevoerd. Zodra de eerste scan is voltooid, worden alle gedetecteerde beveiligingsproblemen weergegeven op het tabblad Geavanceerde beveiliging.
Op de pagina Waarschuwingen worden standaard resultaten weergegeven voor het scannen van afhankelijkheden voor de standaardbranch van de opslagplaats.
De status van een bepaalde waarschuwing weerspiegelt de status voor de standaardbranch en de meest recente uitvoeringspijplijn, zelfs als de waarschuwing bestaat op andere vertakkingen en pijplijnen.
Waarschuwingen voor het scannen van code negeren
Als u waarschuwingen wilt sluiten, hebt u de juiste machtigingen nodig. Standaard kunnen alleen projectbeheerders Geavanceerde beveiligingswaarschuwingen negeren.
Een waarschuwing negeren:
- Navigeer naar de waarschuwing die u wilt sluiten en selecteer de waarschuwing.
- Selecteer de vervolgkeuzelijst Waarschuwing sluiten.
- Als dit nog niet is geselecteerd, selecteert u Risico geaccepteerd of Fout-positief als reden voor sluiting.
- Voeg een optionele opmerking toe aan het tekstvak Opmerking .
- Selecteer Sluiten om de waarschuwing te verzenden en te sluiten.
- De waarschuwingsstatus verandert van Open naar Gesloten en uw reden voor ontslag wordt weergegeven.
Met deze actie wordt alleen de waarschuwing voor de geselecteerde vertakking gesloten. Andere vertakkingen die hetzelfde beveiligingsprobleem bevatten, blijven actief totdat ze zijn gesloten. Elke waarschuwing die eerder is gesloten, kan handmatig opnieuw worden geopend.
Waarschuwingen voor codescans voor pull-aanvragen beheren
Als er waarschuwingen worden gemaakt voor nieuwe codewijzigingen in een pull-aanvraag, wordt de waarschuwing gerapporteerd als een aantekening in de opmerkingensectie van het tabblad Overzicht van de pull-aanvraag en als een waarschuwing op het tabblad Geavanceerde beveiligingsopslagplaats, met een nieuw vertakkingskiezerresultaat voor de pull-aanvraagbranch.
U kunt de betrokken coderegels bekijken, een samenvatting van de bevindingen bekijken en de aantekening in de sectie Overzicht oplossen.
Als u waarschuwingen voor pull-aanvragen wilt verwijderen, moet u naar de detailweergave van de waarschuwing navigeren om zowel de waarschuwing te sluiten als de aantekening op te lossen. Als u anders gewoon de opmerkingsstatus (1) wijzigt, wordt de aantekening omgezet, maar wordt de onderliggende waarschuwing niet gesloten of opgelost.
Als u de volledige set resultaten voor uw pull-aanvraagvertakking wilt zien, gaat u naar Geavanceerde beveiliging van opslagplaatsen>en selecteert u uw pull-aanvraagvertakking. Als u Meer details weergeven (2) selecteert in de aantekening, wordt u doorverbonden naar de detailweergave van de waarschuwing op het tabblad Geavanceerde beveiliging.
Tip
Aantekeningen worden alleen gemaakt wanneer de betrokken regels code volledig uniek zijn voor het verschil in de pull-aanvraag.
Problemen met codescans oplossen
Over het algemeen rapporteert de CodeQL CLI de status van elke opdracht die wordt uitgevoerd als afsluitcode als afsluitcode. De afsluitcode bevat informatie voor volgende opdrachten of voor andere hulpprogramma's die afhankelijk zijn van de CodeQL CLI. Zie Afsluitcodes voor meer informatie over afsluitcodedetails.
Fout: codeQL-opdracht 'database finalize' (32)
Deze fout geeft aan dat er een probleem is met het voltooien van het maken van de CodeQL-database, mogelijk vanwege extractiefouten of ontbrekende buildstappen.
Stappen voor probleemoplossing:
- Controleer of de code bestaat en is gecompileerd
- Controleer voor gecompileerde talen of het buildproces code samenstelt en plaatsvindt tussen de
AdvancedSecurity-Codeql-Init
en deAdvancedSecurity-Codeql-Analyze
taken. Algemene buildopdrachten en vereiste vlaggen (zoals clean no-cache/no-daemon) vindt u hier in Het opgeven van build-opdrachten. - Controleer voor geïnterpreteerde talen of er een broncode is voor de opgegeven taal in het project.
- Controleer voor gecompileerde talen of het buildproces code samenstelt en plaatsvindt tussen de
- Extractiefouten controleren
- Controleer of extractiefouten van invloed zijn op de status van de CodeQL-database.
- Controleer het logboekbestand op extractiefouten en waarschuwingen om de algehele databasestatus te beoordelen.
- Overweldigende fouten onderzoeken
- Als de meeste bestanden extractorfouten tegenkomen, onderzoek dan verder om inzicht te krijgen in de hoofdoorzaak van onjuiste extractie.
Fout: autobuild script (1)
Deze fout beschrijft een automatische buildfout, wat een probleem voorstelt met het instellen of configureren van codescans.
Stappen voor probleemoplossing:
- Buildstappen configureren
- Verwijder de AutoBuild-stap en configureer in plaats daarvan specifieke buildstappen voor gecompileerde talen in uw pijplijnen.
- Raadpleeg de installatierichtlijnen in GitHub Advanced Security configureren voor Azure DevOps.
Fout: CodeQL-directory's zijn niet gevonden in de cache van agenthulpprogramma's
Deze fout geeft een probleem aan met het installeren van CodeQL voor zelf-hostende agents.
Stappen voor probleemoplossing:
- Raadpleeg de installatierichtlijnen of configuratiescripts in GitHub Advanced Security configureren voor Azure DevOps.
Fout: taalpijplijnvariabele niet ingesteld
Deze fout treedt op wanneer u CodeQL probeert uit te voeren zonder de pijplijnvariabele in te stellen die aangeeft welke talen moeten worden gescand.
Stappen voor probleemoplossing:
- Taalpijplijnvariabele instellen
- Zorg ervoor dat de taalpijplijnvariabele juist is geconfigureerd. Raadpleeg de installatierichtlijnen in GitHub Advanced Security configureren voor Azure DevOps.
- Ondersteunde talen zijn onder andere , , , , , , en
ruby
swift
.javascript
python
java
go
cpp
csharp
CodeQL retourneert geen resultaten
Deze sectie bevat richtlijnen voor situaties waarin CodeQL-analyse geen resultaten oplevert.
Stappen voor probleemoplossing:
- Controleren op gedetecteerde beveiligingsproblemen
- Houd rekening met de mogelijkheid dat uw code echt geen beveiligingsproblemen heeft. Als er beveiligingsproblemen worden verwacht maar niet gedetecteerd, gaat u verder met het controleren.
- Configuratie van querysuite controleren
- Controleer of de querysuite wordt gebruikt en overweeg indien nodig over te schakelen naar een uitgebreider pakket.
- U kunt ook aangepaste querysuites maken voor een op maat gemaakte analyse.
- Machtigingen aanpassen voor het weergeven van resultaten
- Zorg ervoor dat de juiste machtigingen, ten minste op het niveau van de inzender, worden verleend voor toegang tot analyseresultaten. Zie Geavanceerde beveiligingsmachtigingen voor meer informatie.
Time-out voor CodeQL
Als de AdvancedSecurity-Codeql-Analyze@1
taak wordt weergegeven This job was abandoned ... we lost contact with the agent
en u een gehoste Microsoft-agent gebruikt, raakt de taak de ingebouwde time-out van zes uur voor betaalde gehoste agents. U kunt in plaats daarvan proberen een analyse uit te voeren op een zelf-hostende agent.
Taakmachtigingen voor codescans
De buildtaak voor codescans maakt gebruik van de pijplijnidentiteit om de Advanced Security REST API's aan te roepen. Pijplijnen in hetzelfde project hebben standaard toegang tot het uploaden van het SARIF-bestand dat is gegenereerd door het uitvoeren van CodeQL-analyse. Als deze machtigingen worden verwijderd uit het buildserviceaccount of als u een aangepaste installatie hebt (bijvoorbeeld een pijplijn die wordt gehost in een ander project dan de opslagplaats), moet u deze machtigingen handmatig verlenen.
Stappen voor probleemoplossing:
- Verken
Advanced Security: View alerts
enAdvanced Security: Manage and dismiss alerts
toestemming voor het buildserviceaccount dat wordt gebruikt in uw pijplijn, wat voor pijplijnen met projectbereik is[Project Name] Build Service ([Organization Name])
, en voor pijplijnenProject Collection Build Service ([Organization Name])
met een verzamelingsbereik.
Handmatige installatie van CodeQL-bundel naar zelf-hostende agent
Installeer de CodeQL-bundel in de cache van het agenthulpprogramma door gebruik te maken van het installatiescript voor uw architectuur, dat beschikbaar is op GitHub. Voor deze scripts moet de $AGENT_TOOLSDIRECTORY
omgevingsvariabele worden ingesteld op de locatie van de map agenthulpprogramma's op de agent, bijvoorbeeld C:/agent/_work/_tool
. U kunt ook handmatig de volgende stappen implementeren:
- Kies de nieuwste CodeQL-releasebundel van GitHub.
- Download en pak de bundel uit naar de volgende map in de map van het agenthulpprogramma, meestal onder
_work/_tool
:./CodeQL/0.0.0-[codeql-release-bundle-tag]/x64/
Met behulp van de huidige release vanv2.16.0
, wordt de mapnaam een./CodeQL/0.0.0-codeql-bundle-v2.16.0/x64/
titel. Meer informatie over de map met agenthulpprogramma's. - Maak een leeg bestand met
x64.complete
de titel in de./CodeQL/0.0.0-[codeql-release-bundle-tag]
map. In het vorige voorbeeld moet het pad naar het eindbestand naar hetx64.complete
bestand zijn./CodeQL/0.0.0-codeql-bundle-v2.16.0/x64.complete
.