Git で管理している一連の変更を対象に、変更によってセキュリティが低下していないかレビューします。Codex は、変更されたソースコードやそれに準じるファイルを 1 つずつ確認し、それぞれの動作を直接支えるコードも調べます。レビューの範囲をリポジトリ全体の監査にまで広げることはありません。
特定の変更ではなくリポジトリ全体をスキャンする場合は、セキュリティスキャンの実行を参照してください。
手動レビューの実行
デスクトップアプリでセキュリティを開き、スキャン、+ スキャンの順に選択します。リポジトリを選び、変更を選択します。レビューの対象には、未コミットの変更、単一のコミット、またはベースとヘッドのリビジョンで指定した範囲を選べます。変更を対象とするスキャンでは詳細スキャンを利用できません。
会話の中で、未コミットの変更をレビューするよう Codex に依頼することもできます。
Use $codex-security:security-diff-scan to review my current uncommitted changes for security regressions.
コミットやブランチの範囲をレビューする場合は、必要に応じて両端のリビジョンを指定します。
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.
Pull Request のベースとヘッドのリビジョンがローカルのチェックアウトにあれば、その Pull Request を指定することもできます。
設定画面でのレビュー対象の確認
- 変更を選択します。
- チェックアウト済みのリポジトリ、現在のブランチ、最新のコミットを確認します。
- レビュー対象の変更で、次のいずれかを選びます。
- 現在の作業ツリーをレビューする場合は
Uncommitted changes - 単一のコミットをレビューする場合は最新のコミット
- ブランチまたは Pull Request の変更範囲をレビューする場合はベースとヘッドのリビジョン
- 現在の作業ツリーをレビューする場合は
- 概要に表示されている変更が、レビューしたい変更と一致していることを確認します。
- スキャンを開始を選択します。
Codex が別のブランチをチェックアウトしたり、選択した作業ツリーを切り替えたりすることはありません。指定したリビジョンがローカルにない場合は、レビュー前にフェッチするか、ローカルにあるベースとヘッドを指定してください。
検出事項への対応
結果を確認したら、対応すると判断した検出事項を修正して検証するか、検出事項をエクスポートして追跡する手順に進みます。
CI/CD でのレビューの自動化
スタンドアロン CLI で構造化 JSON、重大度に基づくポリシー、SARIF のアップロードを利用する方法は、CI での Codex Security の実行を参照してください。インストール済みのプラグインのスキルを codex exec で呼び出す場合は、以下の手順に従います。
ランナーが Codex CLI を非対話で呼び出せる場合は、CI で $codex-security:security-diff-scan を実行できます。まず、スキャン用の認証情報をインストールプロセスに渡さずに CLI をインストールします。
npm install --global @openai/codex
CLI に Codex Security プラグインをインストールします。
codex plugin add codex-security@openai-curated
このコマンドは、Codex CLI の公開プラグインマーケットプレイスを使用します。バージョンごとの要件は、プラグインの変更履歴を参照してください。
次に、CI のシークレットストアに保存した OpenAI API キーを CODEX_SECURITY_API_KEY として渡します。この認証情報はスキャンの実行時にのみ渡してください。
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."
書き込み可能なサンドボックスを使用するため、スキャン中に一時的な成果物を作成できます。一方、プロンプトでは、チェックアウトしたソースを変更しないよう Codex に指示しています。
スキャン結果は $TMPDIR/codex-security-scans/<repository>/<scan-id>/ に書き込まれます。
| ファイル | 内容 |
|---|---|
report.md |
スキャンディレクトリ全体の内容を確認する際に最初に読むレポートです。 |
findings/<slug>/ |
要求した場合に出力される、脆弱性の詳細レポートと、その脆弱性を実証するためのファイルです。 |
hardening/ |
要求した場合に出力される、コードの構造面でセキュリティを強化するための指針と具体的な提案です。 |
findings.json |
検出事項ごとに、安定した識別子、重大度、確信度、ソース内の該当箇所、修正方法を記録します。これらのフィールドはセキュリティワークフローや後続のツールで利用できます。 |
scan-manifest.json |
レビュー対象、リビジョン、成果物のハッシュを記載し、封印したスキャンの実行記録です。 |
coverage.json |
レビュー済みの範囲、レビューを見送った範囲、除外した箇所、レビューの網羅度を記録します。 |
各フィールドの定義は、検出事項のスキーマを参照してください。findingId は検出事項自体を識別し、occurrenceId は今回のスキャンで検出された個別の事例を識別します。
たとえば、次のコマンドは検出事項ごとにタブ区切りで 1 行ずつ出力します。
jq -r '
.findings[] |
[.findingId, .severity.level, .confidence.level, .locations[0].path, .locations[0].startLine, .title] |
@tsv
' findings.json
以下の例では、Node.js と npm、Git、Python 3、jq、および各 CI プロバイダーのコマンドラインツールを利用できる、信頼できる Linux ランナーを想定しています。npm のグローバルパッケージのインストール先には書き込み権限が必要です。
スキャン結果には、脆弱性に関する機密情報が含まれることがあります。成果物は非公開で保管し、検出事項を公開する前に公開先と内容を確認してください。利用している 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マスクを有効にした CI/CD 変数 CODEX_SECURITY_API_KEY を作成します。検出事項を共有する前に、スキャンの成果物を非公開の状態で確認してください。
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.gztrigger: 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()Azure Repos では、Pull Request に対してパイプラインを実行するよう、ビルドの検証ブランチポリシーを設定します。
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
}
}
}
}
}これらの例では、フォークからの Pull Request をスキップします。認証情報を使用するジョブは、保護されたパイプライン定義からのみ実行し、対象はスキャン用の認証情報を預けられる信頼済みのコントリビューターに限定してください。codex-security-scans をアーカイブすると、構造化された検出事項、マニフェスト、カバレッジ情報、report.md に加え、要求に応じて出力された findings/ や hardening/ もまとめて保存できます。まずは結果を参考情報として利用し、ジョブを必須チェックにする前にスキャンの範囲と実行時間を確認してください。
API キーの取り扱いとサンドボックスの制御については、非対話モードを参照してください。組織で Codex GitHub Action の利用が許可されている場合、このアクションで実行時に CLI をインストールできます。ただし、プラグインは事前にインストールし、アクションの codex-home 入力には、プラグインのインストール時と同じ CODEX_HOME を指定してください。