보안을 위한 코드 변경 사항 검토
풀 리퀘스트와 로컬 변경 사항에서 보안 회귀가 발생했는지 수동으로 또는 CI/CD에서 검토합니다.
보안 변경 검토를 실행하여 Git으로 관리되는 하나의 변경 세트에서 회귀를 찾습니다. Codex는 변경된 소스형 파일과 이를 직접 지원하는 코드를 각각 검토합니다. 검토 범위를 전체 리포지토리 감사로 확장하지는 않습니다.
특정 변경 사항 대신 전체 리포지토리를 스캔하려면 보안 스캔 실행을 참조하세요.
수동 검토 실행
데스크톱 앱에서 Security 를 열고 Scans 를 선택한 다음 + Scan 을 선택합니다. 리포지토리를 선택한 다음 Changes 를 선택합니다. 커밋되지 않은 변경 사항, 단일 커밋 또는 기준 리비전과 헤드 리비전을 검토합니다. 변경 사항 스캔에서는 Deep scan 을 사용할 수 없습니다.
대화에서 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.로컬 체크아웃에서 기준 리비전과 헤드 리비전을 사용할 수 있다면 풀 리퀘스트를 지정할 수도 있습니다.
설정에서 변경 사항 확인
- Changes 를 선택합니다.
- 체크아웃된 리포지토리, 현재 브랜치, 최신 커밋을 확인합니다.
- Changes to review 에서 다음 중 하나를 선택합니다.
- 현재 작업 트리의 경우
Uncommitted changes. - 단일 커밋 검토의 경우 최신 커밋.
- 브랜치 또는 풀 리퀘스트 범위의 경우 기준 리비전과 헤드 리비전.
- 현재 작업 트리의 경우
- 요약이 검토하려는 변경 사항을 설명하는지 확인합니다.
- Start scan 을 선택합니다.
Codex는 다른 브랜치를 체크아웃하거나 선택한 작업 트리를 전환하지 않습니다. 요청한 리비전이 로컬에 없다면 검토 전에 가져오거나 로컬에서 사용할 수 있는 기준 및 최종 리비전을 제공하세요.
발견 항목에 대한 조치
결과를 검토한 후 수용한 발견 사항을 수정하고 검증하거나 발견 사항을 내보내고 추적하세요.
CI/CD에서 검토 자동화
독립 실행형 CLI에서 구조화된 JSON, 심각도 정책, SARIF 업로드를 사용하려면 CI에서 Codex Security
실행을 참조하세요.
설치된 플러그인 스킬을 호출하려면 이 섹션에 따라
codex exec을 사용하세요.
러너가 사용자 개입 없이 Codex CLI를 호출할 수 있다면 CI에서
$codex-security:security-diff-scan을 실행하세요. 먼저 스캔 자격 증명이 노출되지 않도록
CLI를 설치하세요.
npm install --global @openai/codexCLI에 Codex Security 플러그인을 설치합니다.
codex plugin add codex-security@openai-curated설치 명령은 공개 Codex CLI 플러그인 마켓플레이스를 사용합니다. 버전별 요구 사항은 플러그인 변경 로그를 참조하세요.
다음으로 CI 보안 비밀 저장소의 OpenAI API key를
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 및 제공업체의 명령줄 도구가 설치된 신뢰할 수 있는 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 마스킹된 CODEX_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.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()Azure Repos의 경우 풀 리퀘스트에서 파이프라인을 실행하도록 Build validation 브랜치 정책을 구성합니다.
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를 건너뜁니다. 자격 증명이 필요한 작업은 보호된
파이프라인 정의에서만 실행하고, 스캔 자격 증명을 신뢰할 수 있는 기여자에 대해서만
실행하세요. 구조화된 발견 사항, 매니페스트, 검사 범위 및 report.md를
요청된 findings/ 또는 hardening/ 출력과 함께 보관하려면
codex-security-scans를 아카이브하세요. 먼저 권고 결과로 시작하고, 이 작업을 필수 검사로
지정하기 전에 검사 범위와 런타임을 검토하세요.
API key 처리와 샌드박스 제어에 관한 내용은 비대화형
모드를 참조하세요. 조직에서 Codex
GitHub Action 사용을 허용하는 경우 런타임에 CLI를 설치할 수 있지만,
여전히 플러그인을 먼저 설치하고 Action의 codex-home 입력이
동일한 CODEX_HOME을 가리키도록 해야 합니다.