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ữ.
Nếu muốn quét toàn bộ kho lưu trữ thay vì một thay đổi cụ thể, hãy xem Chạy quy trình 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.Đối với một commit hoặc phạm vi nhánh, hãy xác định cả hai đầu 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.
Quy trình làm việc không checkout nhánh khác hoặc thay đổi cây làm việc đã chọn. Nếu một bản sửa đổi được yêu cầu không có sẵn cục bộ, hãy fetch bản sửa đổi đó trước khi rà soát hoặc cung cấp bản sửa đổi cơ sở và đầu 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
Chạy cùng kỹ năng $codex-security:security-diff-scan từ CI khi runner
có thể gọi Codex CLI mà không cần tương tác. Trước tiên, hãy cài đặt CLI và plugin
mà không làm lộ thông tin xác thực dùng để 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 chợ plugin Codex CLI công khai, nơi có thể cung cấp phiên bản khác với danh mục ứng dụng máy tính được lưu trữ. Hãy kiểm tra nhật ký thay đổi của plugin trước khi phụ thuộc vào một phiên bản hoặc tính năng plugin cụ thể trong CI.
Sau đó, chỉ cung cấp một OpenAI API key từ kho bí mật CI dưới dạng
CODEX_SECURITY_API_KEY trong thời gian 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."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 vào chính, dễ đọc, dẫn đến toàn bộ thư mục quét. |
findings/<slug>/ |
Một báo cáo lỗ hổng chi tiết cho mỗi phát hiện cần báo cáo, kèm các tệp bằng chứng khái niệm hỗ trợ khi có. |
hardening/ |
Danh mục củng cố cấu trúc cùng các đề xuất hoặc sơ đồ hỗ trợ khi quy trình quét có phát hiện cần báo cáo. |
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í nguồn và biện pháp khắc phục. Dùng cho các quy trình bảo mật nội bộ đã được phê duyệ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 được rà soát, các bản sửa đổi và hàm băm của artifact. |
coverage.json |
Các bề mặt đã rà soát và hoãn lại, trường hợp loại trừ và mức độ đầy đủ của phạm vi. |
Lược đồ findings.json
định nghĩa cấu trúc đầy đủ. Lược đồ bao gồm các trường sau:
| Trường | Kiểu | Mô tả |
|---|---|---|
documentType |
Chuỗi | Xác định tài liệu là codex-security.findings. |
schemaVersion |
Chuỗi | Xác định phiên bản lược đồ phát hiện. |
scanId |
Chuỗi | Xác định quy trình quét đã tạo ra các phát hiện. |
findings |
Mảng | Chứa không hoặc nhiều đối tượng phát hiện. |
findings[].findingId |
Chuỗi | Mã định danh phát hiện ổn định được tạo từ dấu vân tay của phát hiện. |
findings[].occurrenceId |
Chuỗi | Xác định lần xuất hiện này của phát hiện trong một quy trình quét cụ thể. |
findings[].ruleId |
Chuỗi | Xác định họ lỗ hổng. |
findings[].identity |
Đối tượng | Chứa điểm neo ngữ nghĩa và mã định danh phiên bản cùng cấp không bắt buộc. |
findings[].fingerprints |
Đối tượng | Chứa thuật toán dấu vân tay và dấu vân tay chính. |
findings[].title |
Chuỗi | Cung cấp tiêu đề ngắn của phát hiện. |
findings[].summary |
Chuỗi | Tóm tắt lỗ hổng và tác động của nó. |
findings[].severity |
Đối tượng | Chứa mức độ nghiêm trọng và thông tin chấm điểm không bắt buộc. |
findings[].confidence |
Đối tượng | Chứa mức độ tin cậy và cơ sở lý giải. |
findings[].taxonomy |
Đối tượng | Chứa danh mục lỗ hổng và các mã định danh CWE. |
findings[].locations |
Mảng | Liệt kê các tệp bị ảnh hưởng, số dòng và vai trò vị trí. |
findings[].remediation |
Chuỗi | Mô tả cách khắc phục được đề xuất. |
findings[].provenance |
Đối tượng | Xác định nguồn của phát hiện. |
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.
Chọn ví dụ dành cho nhà cung cấp CI của bạn. Kết quả quét có thể chứa chi tiết nhạy cảm về lỗ hổng. Hãy giữ artifact ở chế độ riêng tư và chỉ công bố phát hiện sau khi rà soát đối tượng, nội dung và các phê duyệt bắt buộc.
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ỉ 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, artifact phạm vi, report.md cùng các đầu ra findings/ và
hardening/ được liên kết với nó. Hãy bắt đầu với kết quả mang tính tư vấn và rà soát phạm vi
cũng như thời gian chạy trước khi đặt tác vụ thành bước kiểm tra bắt buộc.
Để biết cách xử lý API key và kiểm soát sandbox, 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 đó.