Git에서 관리하는 변경 사항 한 묶음을 대상으로 보안 검토를 실행해 보안이 약화된 부분을 찾으세요. Codex는 변경된 파일 중 소스 코드에 해당하거나 그와 유사한 파일을 각각 검토하고, 해당 파일을 직접 뒷받침하는 코드도 살펴봅니다. 검토 범위는 리포지터리 전체에 대한 감사로 확대되지 않습니다.
특정 변경 사항 대신 리포지터리 전체를 스캔하려면 보안 스캔 실행을 참고하세요.
수동 검토 실행
데스크톱 앱에서 보안을 열고 스캔을 선택한 다음 + 스캔을 선택하세요. 리포지터리를 고른 다음 변경 사항을 선택하세요. 커밋하지 않은 변경 사항, 단일 커밋 또는 베이스 리비전과 헤드 리비전 사이의 변경 사항을 검토할 수 있습니다. 심층 스캔은 변경 사항 스캔에서 사용할 수 없습니다.
대화에서 Codex에 커밋하지 않은 변경 사항을 검토해 달라고 요청할 수도 있습니다.
$codex-security:security-diff-scan을 사용해서 현재 내가 커밋하지 않은 변경 사항으로 인해 보안이 약화되는 부분이 있는지 검토해 주세요.
커밋이나 브랜치의 특정 범위를 검토하려면 필요에 따라 두 리비전을 모두 지정하세요.
$codex-security:security-diff-scan을 사용해서 origin/main부터 HEAD까지의 변경 사항으로 인해 보안이 약화되는 부분이 있는지 검토해 주세요. 인증, 인가, 입력 처리, 파일 시스템 접근, 네트워크 요청, 시크릿을 중점적으로 살펴봐 주세요.
로컬 체크아웃에 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는 이번 스캔에서 해당 이슈가 발견된 사례를 식별합니다.
예를 들어 다음 명령어는 보안 이슈마다 한 행을 출력하고 각 필드를 탭으로 구분합니다.
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-scansCODEX_SECURITY_API_KEY를 마스킹된 CI/CD 변수로 만들고, 보안 이슈를 공유하기 전에 스캔 아티팩트를 비공개로 검토하세요.
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 경로로 지정해야 합니다.