Examiner les modifications de code sous l’angle de la sécurité
Examinez les pull requests et les modifications locales, manuellement ou dans un processus CI/CD, afin de détecter les régressions de sécurité.
Exécutez un examen de sécurité des modifications pour détecter les régressions dans un ensemble de modifications géré par Git. Codex examine chaque fichier modifié assimilable à du code source ainsi que le code qui le prend directement en charge. Il n’étend pas cet examen à un audit complet du dépôt.
Si vous souhaitez analyser un dépôt complet plutôt qu’une modification précise, consultez Exécuter une analyse de sécurité.
Exécuter un examen manuel
Dans l’application de bureau, ouvrez Security, sélectionnez Scans, puis + Scan. Choisissez le dépôt, puis sélectionnez Changes. Examinez les modifications non validées, un commit unique ou une révision de base et une révision de tête. Deep scan n’est pas disponible pour une analyse des modifications.
Vous pouvez également demander à Codex d’examiner les modifications non validées dans une conversation :
Use $codex-security:security-diff-scan to review my current uncommitted changes for security regressions.Pour un commit ou une plage de branches, indiquez les deux extrémités si nécessaire :
Use $codex-security:security-diff-scan to review the changes from origin/main to HEAD for security regressions. Focus on authentication, authorization, input handling, filesystem access, network requests, and secrets.Vous pouvez également désigner une pull request lorsque ses révisions de base et de tête sont disponibles dans le checkout local.
Confirmer la modification dans la configuration
- Sélectionnez Changes.
- Confirmez le dépôt extrait, la branche actuelle et le dernier commit.
- Sous Changes to review, choisissez :
Uncommitted changespour le worktree actuel.- Le dernier commit pour examiner un commit unique.
- Une révision de base et une révision de tête pour une plage de branches ou de pull requests.
- Vérifiez que le résumé décrit la modification que vous souhaitiez examiner.
- Sélectionnez Start scan.
Le workflow n’extrait pas une autre branche et ne modifie pas le worktree sélectionné. Si une révision demandée n’est pas disponible localement, récupérez-la avant l’examen ou fournissez une base et une tête disponibles localement.
Traiter les résultats
Après avoir examiné les résultats, corrigez et vérifiez un résultat accepté ou exportez et suivez les résultats.
Automatiser les examens dans un processus CI/CD
Exécutez la même compétence $codex-security:security-diff-scan depuis le processus CI lorsque l’exécuteur
peut invoquer la CLI Codex sans interaction. Commencez par installer la CLI et le plugin
sans exposer l’identifiant d’analyse :
npm install --global @openai/codexInstallez le plugin Codex Security dans la CLI :
codex plugin add codex-security@openai-curatedLa commande d’installation utilise la place de marché publique des plugins de la CLI Codex, qui peut proposer une version différente de celle du catalogue hébergé de l’application de bureau. Consultez le journal des modifications du plugin avant de dépendre d’une version ou d’une fonctionnalité précise du plugin dans le processus CI.
Exposez ensuite une OpenAI API key provenant du magasin de secrets de votre processus CI en tant que
CODEX_SECURITY_API_KEY, uniquement pendant l’analyse :
CODEX_API_KEY="$CODEX_SECURITY_API_KEY" codex exec \
--sandbox workspace-write \
"Use \$codex-security:security-diff-scan to review changes from $BASE_REVISION to $HEAD_REVISION for security regressions. Do not modify the checkout."L’analyse écrit sa sortie dans
$TMPDIR/codex-security-scans/<repository>/<scan-id>/ :
| Fichier | Contenu |
|---|---|
report.md |
Point d’entrée principal et lisible vers le répertoire complet de l’analyse. |
findings/<slug>/ |
Un rapport de vulnérabilité détaillé par résultat à signaler, accompagné de fichiers de preuve de concept lorsqu’ils sont disponibles. |
hardening/ |
Portefeuille de durcissement structurel et propositions ou diagrammes associés lorsque l’analyse contient des résultats à signaler. |
findings.json |
Résultats avec des identifiants stables, leur gravité, leur niveau de confiance, les emplacements sources et les mesures correctives. Alimentez les workflows de sécurité internes approuvés ou les outils en aval. |
scan-manifest.json |
Reçu d’analyse scellé contenant la cible examinée, les révisions et les empreintes des artefacts. |
coverage.json |
Surfaces examinées et différées, exclusions et exhaustivité de la couverture. |
Le schéma findings.json
définit la structure complète. Le schéma comprend les champs suivants :
| Champ | Type | Description |
|---|---|---|
documentType |
Chaîne | Identifie le document comme codex-security.findings. |
schemaVersion |
Chaîne | Identifie la version du schéma des résultats. |
scanId |
Chaîne | Identifie l’analyse ayant produit les résultats. |
findings |
Tableau | Contient zéro ou plusieurs objets de résultat. |
findings[].findingId |
Chaîne | Identifiant stable du résultat dérivé de son empreinte. |
findings[].occurrenceId |
Chaîne | Identifie cette occurrence du résultat dans une analyse précise. |
findings[].ruleId |
Chaîne | Identifie la famille de vulnérabilités. |
findings[].identity |
Objet | Contient l’ancre sémantique et un identifiant facultatif d’instance apparentée. |
findings[].fingerprints |
Objet | Contient l’algorithme d’empreinte et l’empreinte principale. |
findings[].title |
Chaîne | Fournit le titre court du résultat. |
findings[].summary |
Chaîne | Résume la vulnérabilité et son impact. |
findings[].severity |
Objet | Contient le niveau de gravité et des détails facultatifs sur son évaluation. |
findings[].confidence |
Objet | Contient le niveau de confiance et sa justification. |
findings[].taxonomy |
Objet | Contient la catégorie de vulnérabilité et les identifiants CWE. |
findings[].locations |
Tableau | Répertorie les fichiers concernés, les numéros de ligne et les rôles des emplacements. |
findings[].remediation |
Chaîne | Décrit le correctif recommandé. |
findings[].provenance |
Objet | Identifie la source du résultat. |
Par exemple, cette commande affiche une ligne séparée par des tabulations pour chaque résultat :
jq -r '
.findings[] |
[.findingId, .severity.level, .confidence.level, .locations[0].path, .locations[0].startLine, .title] |
@tsv
' findings.jsonCes exemples supposent l’utilisation d’un exécuteur Linux de confiance doté de Node.js et de npm, de Git, de Python
3, de jq et des outils en ligne de commande du fournisseur. Le préfixe global des paquets npm
doit être accessible en écriture.
Choisissez l’exemple correspondant à votre fournisseur CI. Les résultats d’analyse peuvent contenir des détails sensibles sur des vulnérabilités. Conservez les artefacts dans un espace privé et ne publiez les résultats qu’après avoir vérifié le public visé, le contenu et les approbations requises.
name: Codex Security review
on:
pull_request:
jobs:
security-review:
if: github.event.pull_request.head.repo.full_name == github.repository
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v5
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
persist-credentials: false
- name: Install Codex Security
env:
CODEX_HOME: ${{ runner.temp }}/codex-home
run: |
npm install --global @openai/codex
codex plugin add codex-security@openai-curated
- name: Review code changes
env:
CODEX_SECURITY_API_KEY: ${{ secrets.CODEX_SECURITY_API_KEY }}
CODEX_HOME: ${{ runner.temp }}/codex-home
TMPDIR: ${{ runner.temp }}/codex-security
BASE_SHA: ${{ github.event.pull_request.base.sha }}
HEAD_REVISION: ${{ github.event.pull_request.head.sha }}
run: |
BASE_REVISION="$(git merge-base "$BASE_SHA" "$HEAD_REVISION")"
CODEX_API_KEY="$CODEX_SECURITY_API_KEY" codex exec \
--sandbox workspace-write \
"Use \$codex-security:security-diff-scan to review changes from $BASE_REVISION to $HEAD_REVISION for security regressions. Do not modify the checkout."
- uses: actions/upload-artifact@v4
if: always()
with:
name: codex-security-review
path: ${{ runner.temp }}/codex-security/codex-security-scans Créez une variable CI/CD masquée CODEX_SECURITY_API_KEY et examinez les artefacts de l’analyse
de manière privée avant de partager les résultats.
codex-security-review:
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_SOURCE_PROJECT_ID == $CI_PROJECT_ID'
variables:
GIT_DEPTH: "0"
script:
- |
codex_security_api_key="$CODEX_SECURITY_API_KEY"
unset CODEX_SECURITY_API_KEY
export CODEX_HOME="/tmp/codex-home-$CI_JOB_ID"
export TMPDIR="/tmp/codex-security-$CI_JOB_ID"
export BASE_REVISION="$CI_MERGE_REQUEST_DIFF_BASE_SHA"
export HEAD_REVISION="${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA:-$CI_COMMIT_SHA}"
npm install --global @openai/codex
codex plugin add codex-security@openai-curated
CODEX_API_KEY="$codex_security_api_key" codex exec \
--sandbox workspace-write \
"Use \$codex-security:security-diff-scan to review changes from $BASE_REVISION to $HEAD_REVISION for security regressions. Do not modify the checkout."
after_script:
- |
unset CODEX_SECURITY_API_KEY
scan_root="/tmp/codex-security-$CI_JOB_ID/codex-security-scans"
if [ -d "$scan_root" ]; then
tar -czf codex-security-artifacts.tar.gz -C "$scan_root" .
fi
artifacts:
when: always
paths:
- codex-security-artifacts.tar.gz trigger: none
pool:
vmImage: ubuntu-latest
steps:
- checkout: self
fetchDepth: 0
- bash: |
set -euo pipefail
export CODEX_HOME="$AGENT_TEMPDIRECTORY/codex-home"
npm install --global @openai/codex
codex plugin add codex-security@openai-curated
displayName: Install Codex Security
- bash: |
set -euo pipefail
export CODEX_HOME="$AGENT_TEMPDIRECTORY/codex-home"
export TMPDIR="$AGENT_TEMPDIRECTORY/codex-security"
export HEAD_REVISION="$SYSTEM_PULLREQUEST_SOURCECOMMITID"
export BASE_REVISION="$(git merge-base HEAD^1 "$HEAD_REVISION")"
CODEX_API_KEY="$CODEX_SECURITY_API_KEY" codex exec \
--sandbox workspace-write \
"Use \$codex-security:security-diff-scan to review changes from $BASE_REVISION to $HEAD_REVISION for security regressions. Do not modify the checkout."
displayName: Review code changes
condition: and(succeeded(), ne(variables['System.PullRequest.IsFork'], 'True'))
env:
CODEX_SECURITY_API_KEY: $(CODEX_SECURITY_API_KEY)
- publish: $(Agent.TempDirectory)/codex-security/codex-security-scans
artifact: codex-security-review
condition: always()Pour Azure Repos, configurez une stratégie de branche Build validation afin d’exécuter le pipeline sur les pull requests.
pipeline {
agent { label 'linux' }
stages {
stage('Codex Security review') {
when {
allOf {
changeRequest()
expression { !env.CHANGE_FORK?.trim() }
}
}
steps {
sh '''#!/usr/bin/env bash
set -euo pipefail
export CODEX_HOME="/tmp/codex-home-$BUILD_TAG"
export TMPDIR="/tmp/codex-security-$BUILD_TAG"
mkdir -p "$TMPDIR"
git fetch --no-tags origin "$CHANGE_TARGET"
target="$(git rev-parse FETCH_HEAD)"
git fetch --no-tags origin "$CHANGE_BRANCH"
git rev-parse FETCH_HEAD > "$TMPDIR/head"
git merge-base "$target" "$(cat "$TMPDIR/head")" > "$TMPDIR/base"
npm install --global @openai/codex
codex plugin add codex-security@openai-curated
'''
withCredentials([string(credentialsId: 'codex-security-api-key', variable: 'CODEX_SECURITY_API_KEY')]) {
sh '''#!/usr/bin/env bash
set +x
set -euo pipefail
export CODEX_HOME="/tmp/codex-home-$BUILD_TAG"
export TMPDIR="/tmp/codex-security-$BUILD_TAG"
export HEAD_REVISION="$(cat "$TMPDIR/head")"
export BASE_REVISION="$(cat "$TMPDIR/base")"
CODEX_API_KEY="$CODEX_SECURITY_API_KEY" codex exec \
--sandbox workspace-write \
"Use \$codex-security:security-diff-scan to review changes from $BASE_REVISION to $HEAD_REVISION for security regressions. Do not modify the checkout."
'''
}
}
post {
always {
sh '''#!/usr/bin/env bash
set -euo pipefail
scan_root="/tmp/codex-security-$BUILD_TAG/codex-security-scans"
if [ -d "$scan_root" ]; then
tar -czf codex-security-artifacts.tar.gz -C "$scan_root" .
fi
'''
archiveArtifacts artifacts: 'codex-security-artifacts.tar.gz', allowEmptyArchive: true
}
}
}
}
} Les exemples ignorent les pull requests provenant de forks. N’exécutez les tâches nécessitant des identifiants que depuis une
définition de pipeline protégée et uniquement pour les contributeurs autorisés à accéder à l’identifiant
d’analyse. Archivez codex-security-scans pour conserver ensemble les résultats structurés,
le manifeste, les artefacts de couverture, report.md ainsi que ses sorties liées findings/ et
hardening/. Commencez par des résultats consultatifs, puis examinez la couverture
et le temps d’exécution avant de faire de la tâche une vérification obligatoire.
Pour la gestion des API key et les contrôles du bac à sable, consultez le mode non
interactif. Si votre organisation autorise la Codex
GitHub Action, celle-ci peut installer la CLI lors de l’exécution, mais vous
devez tout de même installer d’abord le plugin et faire pointer l’entrée codex-home de l’action vers
le même CODEX_HOME.