Code Scanning met CodeQL
CodeQL is GitHub's engine voor codeanalyse en de standaardscanner achter de code scanning-functionaliteit van GitHub. CodeQL behandelt code als data: de code wordt omgezet in een doorzoekbare database, waarna semantische analyses worden uitgevoerd om kwetsbaarheden te vinden.
CodeQL ondersteunt een breed scala aan programmeertalen, waaronder:
- JavaScript
- TypeScript
- Python
- Java
- C#
- Go
- Ruby
- C
- C++
Voor de meeste talen is het inschakelen van code scanning zo eenvoudig als het toevoegen van de officiële CodeQL-workflow aan je repository.
Code Scanning instellen
De standaardconfiguratie kan met één klik rechtstreeks worden ingeschakeld via het tabblad Security van de repository. Voor meer controle kun je ook een workflowbestand gebruiken:
name: CodeQL Analysis
on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: '0 2 * * 1' # Weekly scan every Monday at 2am
jobs:
analyze:
name: Analyze (${{ matrix.language }})
runs-on: ubuntu-latest
permissions:
security-events: write
actions: read
contents: read
strategy:
matrix:
language: [csharp, javascript-typescript]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
queries: security-extended # Run extended security query suite
- name: Autobuild
uses: github/codeql-action/autobuild@v3
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{ matrix.language }}"
Wat detecteert CodeQL?
De query suites van CodeQL detecteren verschillende soorten kwetsbaarheden, waaronder:
- Injectiekwetsbaarheden: SQL-injection, command injection en path traversal.
- Cross-site scripting: reflected, stored en DOM-based XSS.
- Onveilige deserialisatie: onveilige patronen voor het deserialiseren van objecten.
- Cryptografische problemen: het gebruik van zwakke algoritmes en onveilige random number generation.
- Taint tracking: end-to-end analyse van datastromen, van onbetrouwbare input tot gevoelige onderdelen van de applicatie.
- Zwaktes in authenticatie: hardcoded credentials en ontbrekende authenticatiecontroles.
De resultaten verschijnen rechtstreeks in pull requests als annotaties op de betreffende regels code en in het tabblad Security van de repository. Ze kunnen ook branch protection rules activeren die voorkomen dat code wordt gemerged totdat bevindingen zijn opgelost of bewust zijn afgewezen.
Third-party scanners via SARIF
Code scanning is niet beperkt tot CodeQL. GitHub ondersteunt de SARIF-standaard (Static Analysis Results Interchange Format), waardoor iedere SARIF-compatible scanner resultaten naar GitHub kan uploaden.
Dit geldt onder andere voor tools zoals Semgrep, Snyk, Checkmarx, Veracode en SonarQube. Alle bevindingen worden samengebracht in hetzelfde Security-tabblad, zodat je één overzicht houdt, ongeacht welke scanner de resultaten heeft gegenereerd.
Secret Scanning
Secret scanning detecteert automatisch secrets, API-keys, tokens, connection strings, private keys en andere credentials die in een repository zijn opgenomen. Daarbij wordt niet alleen gekeken naar de huidige staat van de repository, maar ook retrospectief naar de volledige commit history.
Hoe werkt Secret Scanning?
GitHub onderhoudt detectiepatronen voor meer dan 200 soorten secrets van providers zoals AWS, Azure, Google Cloud, Stripe, Twilio, Slack en vele andere. Wanneer een secret wordt gevonden dat overeenkomt met een van deze patronen:
- worden de repository owner en security manager gewaarschuwd;
- stelt GitHub bij een aangesloten provider de provider rechtstreeks op de hoogte, zodat het token automatisch kan worden ingetrokken;
- verschijnt de bevinding in het Security-tabblad van de repository onder Secret Scanning alerts.
Push Protection
Een van de krachtigste onderdelen van Secret Scanning is Push Protection. In plaats van secrets pas te detecteren nadat ze zijn gecommit, blokkeert Push Protection de push al tijdens git push wanneer in nieuwe commits een secret wordt gevonden.
De developer krijgt een foutmelding te zien waarin het betreffende secret wordt aangegeven. De push blijft geblokkeerd totdat het secret is verwijderd of de developer de bypass expliciet bevestigt. Die bypass wordt vastgelegd voor auditdoeleinden.
remote: Push rejected. Secret scanning found a potential secret.
remote:
remote: To push this commit, please remove the secret detected in:
remote: file: src/appsettings.json
remote: line: 12
remote: type: Azure Storage Account Key
Zo voorkom je dat een secret überhaupt in de repository terechtkomt, in plaats van achteraf afhankelijk te zijn van detectie en rotatie.
Custom patterns
Voor organisatiespecifieke secrets, zoals interne service tokens of eigen API-formaten, ondersteunt GitHub custom secret scanning patterns op basis van regular expressions. Deze kunnen worden toegepast op repository-, organisatie- of enterprise-niveau.
Dependency Review en Dependabot
Third-party dependencies zijn een van de meest voorkomende bronnen van kwetsbaarheden in moderne applicaties. GitHub biedt twee aanvullende tools om dit risico te beperken.
Dependency Review
De Dependency Review action controleert pull requests die dependencybestanden aanpassen, zoals package.json, *.csproj, requirements.txt en go.mod. Vervolgens wordt gecontroleerd of nieuw toegevoegde dependencies bekende kwetsbaarheden bevatten in de GitHub Advisory Database.
- name: Dependency Review
uses: actions/dependency-review-action@v4
with:
fail-on-severity: moderate
deny-licenses: GPL-2.0, AGPL-3.0
Hiermee kun je voorkomen dat pull requests worden gemerged wanneer ze een kwetsbare dependency boven een ingestelde severity threshold introduceren, of een dependency toevoegen met een licentie die de organisatie niet toestaat.
Dependabot Alerts en Security Updates
Dependabot monitort continu de dependency graph van iedere repository en genereert alerts wanneer een dependency een bekende CVE bevat.
Dependabot gaat verder dan alleen signaleren. Het kan automatisch pull requests openen om een kwetsbare dependency bij te werken naar een gepatchte versie.
Dependabot version updates breidt dit uit naar proactief onderhoud. Dependencies kunnen volgens een ingestelde planning automatisch worden bijgewerkt, waardoor het verschil tussen de gebruikte en meest recente versies kleiner blijft.
# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: npm
directory: /
schedule:
interval: weekly
open-pull-requests-limit: 10
reviewers:
- my-org/security-team
Security Overview: inzicht over de hele organisatie
Voor securityteams en engineering managers biedt GitHub Enterprise een Security Overview-dashboard op organisatie- en enterprise-niveau. Dit geeft één overzicht van:
- welke repositories GHAS-features hebben ingeschakeld;
- openstaande Code Scanning alerts op basis van severity en leeftijd;
- Secret Scanning alerts en de status van de oplossing;
- het aantal Dependabot alerts en de snelheid waarmee deze worden opgelost.
Hiermee kunnen teams prioriteiten stellen, repositories met het grootste securityrisico identificeren en de security posture in de tijd volgen, zonder GitHub te verlaten.
Vergelijking met securitymogelijkheden in Azure DevOps
Azure DevOps bevat geen native static analysis, Secret Scanning of Dependency Review. Organisaties die Azure DevOps gebruiken, zijn hiervoor meestal afhankelijk van:
- third-party extensies uit de Azure DevOps Marketplace, zoals SonarQube, WhiteSource/Mend en Checkmarx;
- aparte stappen in CI-pipelines waarin scanners draaien en resultaten extern worden gerapporteerd;
- handmatige processen voor het detecteren en roteren van gelekte secrets.
Dit versnipperde model betekent dat resultaten verspreid staan over meerdere tools, integraties extra maatwerk vereisen en er geen centraal overzicht is van de security posture.
GitHub Advanced Security biedt deze functionaliteiten native, waarbij resultaten direct zichtbaar zijn in de context waarin developers al werken.
GitHub Advanced Security uitrollen binnen een organisatie
Voor grotere organisaties met veel repositories is een gefaseerde uitrol aan te raden:
- Schakel GHAS standaard in voor nieuwe repositories: configureer de organisatie zo dat GitHub Advanced Security automatisch wordt ingeschakeld voor nieuw aangemaakte repositories.
- Schakel Push Protection organisatiebreed in: dit levert veel securitywaarde op met relatief weinig impact op developers en voorkomt dat secrets überhaupt worden gecommit.
- Start met Code Scanning op repositories met een hoger risico: begin bijvoorbeeld met repositories die authenticatie, betalingen of gevoelige data verwerken.
- Beoordeel en prioriteer bestaande alerts: bekijk vóór een brede uitrol de bestaande backlog en richt een duidelijk proces voor triage in.
- Integreer met je bestaande securityproces: koppel GitHub Security alerts via webhooks of de GitHub API aan je SIEM, ticketingsysteem of andere security operations-tools.
Conclusie
GitHub Advanced Security verandert de manier waarop organisaties application security aanpakken. In plaats van alleen achteraf te scannen, verschuift de focus naar preventie die rechtstreeks in de developmentworkflow is ingebouwd.
De combinatie van semantische analyse met CodeQL, Push Protection voor secrets en geautomatiseerde remediation met Dependabot biedt securityfunctionaliteit waarvoor je in Azure DevOps meerdere afzonderlijke tools nodig zou hebben.
In het laatste artikel van deze serie kijken we naar misschien wel een van de interessantste ontwikkelingen binnen GitHub Enterprise: GitHub Copilot en de enterprise-functionaliteiten die daarbij horen.