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.
Pour analyser un dépôt entier 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 révisions de branche, précisez les deux révisions 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.
Codex ne bascule pas sur une autre branche et ne change pas le worktree sélectionné. Si une révision demandée n’est pas disponible localement, récupérez-la avant la revue ou fournissez une révision de base et une révision de tête disponibles localement.
Traiter les résultats
Après avoir examiné les résultats, corrigez et vérifiez un constat accepté ou exportez et suivez les constats.
Automatiser les examens dans un processus CI/CD
Pour la CLI autonome, consultez Exécuter Codex Security en
CI pour obtenir du JSON structuré, définir une politique de gravité et importer des fichiers SARIF.
Poursuivez cette section pour invoquer le skill du plugin installé
via codex exec.
Exécutez $codex-security:security-diff-scan en CI lorsque l’exécuteur peut invoquer la
CLI Codex sans interaction. Commencez par installer la CLI sans exposer les identifiants
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. Consultez le journal des modifications du plugin pour connaître les exigences propres à chaque version.
Ensuite, fournissez une API key OpenAI provenant du stockage de secrets de votre CI via
CODEX_SECURITY_API_KEY. N’exposez cet identifiant que 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."Le bac à sable accessible en écriture permet à l’analyse de créer des artefacts temporaires. Le prompt exige toujours que Codex laisse la copie de travail des sources inchangée.
L’analyse écrit sa sortie dans
$TMPDIR/codex-security-scans/<repository>/<scan-id>/ :
| Fichier | Contenu |
|---|---|
report.md |
Point d’entrée principal lisible vers le répertoire d’analyse complet. |
findings/<slug>/ |
Rapports de vulnérabilité détaillés et fichiers de preuve de concept associés, sur demande. |
hardening/ |
Recommandations de renforcement structurel et propositions associées, sur demande. |
findings.json |
Constats avec identifiants stables, gravité, niveau de confiance, emplacements dans le code source et mesures correctives. Utilisez ces champs dans les workflows de sécurité ou les outils en aval. |
scan-manifest.json |
Attestation d’analyse scellée contenant la cible examinée, les révisions et les empreintes des artefacts. |
coverage.json |
Surfaces examinées ou dont l’examen a été reporté, exclusions et exhaustivité de la couverture. |
Pour la définition des champs, consultez le schéma des constats. Utilisez findingId pour identifier le constat et occurrenceId pour son occurrence
dans cette analyse.
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.
Les résultats d’analyse peuvent contenir des détails sensibles sur les vulnérabilités. Gardez les artefacts privés et vérifiez la destination et le contenu avant de publier les constats. Choisissez l’exemple correspondant à votre fournisseur de CI :
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 des contributeurs autorisés à utiliser l’identifiant
d’analyse. Archivez codex-security-scans afin de conserver ensemble les résultats structurés,
le manifeste, la couverture et report.md, ainsi que tous les livrables
findings/ ou hardening/ demandés. Commencez par des résultats consultatifs, puis examinez
la couverture et la durée d’exécution avant de faire de la tâche une vérification obligatoire.
Pour la gestion des API keys 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.