Rà soát thay đổi mã nguồn về bảo mật
Rà soát các pull request và thay đổi cục bộ để phát hiện lỗi bảo mật tái phát theo cách thủ công hoặc trong CI/CD.
Chạy quy trình rà soát thay đổi bảo mật để tìm lỗi tái phát trong một tập hợp thay đổi được Git quản lý. Codex rà soát từng tệp tương tự mã nguồn đã thay đổi và mã hỗ trợ trực tiếp cho tệp đó. Quy trình này không mở rộng thành một cuộc kiểm tra toàn bộ kho lưu trữ.
Để quét toàn bộ kho lưu trữ thay vì một thay đổi cụ thể, hãy xem Chạy một lượt quét bảo mật.
Chạy rà soát thủ công
Trong ứng dụng máy tính, mở Security, chọn Scans, rồi chọn + Scan. Chọn kho lưu trữ, sau đó chọn Changes. Rà soát các thay đổi chưa commit, một commit duy nhất hoặc một bản sửa đổi cơ sở và bản sửa đổi đầu. Deep scan không khả dụng cho quy trình quét thay đổi.
Bạn cũng có thể yêu cầu Codex rà soát các thay đổi chưa commit trong một cuộc trò chuyện:
Use $codex-security:security-diff-scan to review my current uncommitted changes for security regressions.Với một commit hoặc phạm vi nhánh, hãy chỉ định cả hai phiên bản khi cần:
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.Bạn cũng có thể nêu tên một pull request khi các bản sửa đổi cơ sở và đầu của nó có sẵn trong bản checkout cục bộ.
Xác nhận thay đổi trong bước thiết lập
- Chọn Changes.
- Xác nhận kho lưu trữ đã checkout, nhánh hiện tại và commit mới nhất.
- Trong Changes to review, chọn:
Uncommitted changescho cây làm việc hiện tại.- Commit mới nhất để rà soát một commit duy nhất.
- Một bản sửa đổi cơ sở và bản sửa đổi đầu cho phạm vi nhánh hoặc pull request.
- Xác nhận rằng phần tóm tắt mô tả đúng thay đổi bạn định rà soát.
- Chọn Start scan.
Codex không checkout nhánh khác hoặc chuyển cây làm việc đã chọn. Nếu một phiên bản được yêu cầu chưa có sẵn cục bộ, hãy fetch phiên bản đó trước khi rà soát hoặc cung cấp phiên bản cơ sở và phiên bản đầu cuối có sẵn cục bộ.
Xử lý các phát hiện
Sau khi rà soát kết quả, hãy khắc phục và xác minh một phát hiện đã được chấp nhận hoặc xuất và theo dõi các phát hiện.
Tự động hóa rà soát trong CI/CD
Với CLI độc lập, hãy xem Chạy Codex Security trong
CI để biết về JSON có cấu trúc, chính sách mức độ nghiêm trọng và việc tải lên SARIF.
Tiếp tục phần này để gọi kỹ năng plugin đã cài đặt
thông qua codex exec.
Chạy $codex-security:security-diff-scan trong CI khi runner có thể gọi
Codex CLI mà không cần tương tác. Trước tiên, cài đặt CLI mà không để lộ thông tin xác thực dùng cho lượt
quét:
npm install --global @openai/codexCài đặt plugin Codex Security trong CLI:
codex plugin add codex-security@openai-curatedLệnh cài đặt sử dụng kho plugin công khai của Codex CLI. Xem nhật ký thay đổi plugin để biết các yêu cầu cụ thể cho từng phiên bản.
Tiếp theo, cung cấp một API key OpenAI từ kho bí mật CI dưới tên
CODEX_SECURITY_API_KEY. Chỉ cung cấp thông tin xác thực cho lượt quét:
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."Môi trường cô lập có quyền ghi cho phép lượt quét tạo các tệp tạm thời. Lời nhắc vẫn yêu cầu Codex giữ nguyên bản checkout mã nguồn.
Quy trình quét ghi đầu ra vào
$TMPDIR/codex-security-scans/<repository>/<scan-id>/:
| Tệp | Nội dung |
|---|---|
report.md |
Điểm bắt đầu chính để đọc và truy cập toàn bộ thư mục quét. |
findings/<slug>/ |
Các báo cáo lỗ hổng chi tiết và tệp chứng minh khái niệm hỗ trợ, khi được yêu cầu. |
hardening/ |
Hướng dẫn gia cố cấu trúc và các đề xuất hỗ trợ, khi được yêu cầu. |
findings.json |
Các phát hiện kèm mã định danh ổn định, mức độ nghiêm trọng, độ tin cậy, vị trí mã nguồn và biện pháp khắc phục. Dùng các trường này trong quy trình bảo mật hoặc công cụ hạ nguồn. |
scan-manifest.json |
Biên nhận quét đã niêm phong, chứa mục tiêu đã rà soát, các phiên bản và mã băm của các tệp kết quả. |
coverage.json |
Các bề mặt đã rà soát và được hoãn xem xét, các mục loại trừ và mức độ đầy đủ của phạm vi bao phủ. |
Để biết định nghĩa các trường, hãy xem lược đồ phát hiện. Dùng findingId để xác định phát hiện và occurrenceId cho lần xuất hiện của phát hiện đó
trong lượt quét này.
Ví dụ, lệnh này in một hàng được phân tách bằng tab cho mỗi phát hiện:
jq -r '
.findings[] |
[.findingId, .severity.level, .confidence.level, .locations[0].path, .locations[0].startLine, .title] |
@tsv
' findings.jsonCác ví dụ này giả định một runner Linux đáng tin cậy có Node.js và npm, Git, Python
3, jq và các công cụ dòng lệnh của nhà cung cấp. Tiền tố gói toàn cục npm
phải có quyền ghi.
Kết quả quét có thể chứa thông tin lỗ hổng nhạy cảm. Giữ các tệp kết quả ở chế độ riêng tư, đồng thời rà soát đích đến và nội dung trước khi công bố các phát hiện. Chọn ví dụ dành cho nhà cung cấp CI của bạn:
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 Tạo một biến CI/CD CODEX_SECURITY_API_KEY được che giấu và rà soát riêng tư các
artifact quét trước khi chia sẻ phát hiện.
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()Đối với Azure Repos, hãy cấu hình chính sách nhánh Build validation để chạy pipeline trên các 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
}
}
}
}
} Các ví dụ bỏ qua pull request từ fork. Chỉ chạy các tác vụ có thông tin xác thực từ một
định nghĩa pipeline được bảo vệ và chỉ dành cho những người đóng góp được tin cậy để sử dụng thông tin xác thực
quét. Lưu trữ codex-security-scans để giữ các phát hiện có cấu trúc,
manifest, phạm vi bao phủ và report.md cùng nhau, kèm theo mọi đầu ra
findings/ hoặc hardening/ đã yêu cầu. Hãy bắt đầu với kết quả mang tính tư vấn và xem xét
phạm vi bao phủ cũng như thời gian chạy trước khi biến tác vụ thành một bước kiểm tra bắt buộc.
Để biết cách xử lý API key và kiểm soát môi trường cô lập, hãy xem Chế độ không tương tác. Nếu tổ chức của bạn cho phép Codex
GitHub Action, công cụ này có thể cài đặt CLI khi chạy, nhưng bạn
vẫn phải cài đặt plugin trước và trỏ đầu vào codex-home của action tới
chính CODEX_HOME đó.