Tinjau perubahan kode untuk keamanan
Tinjau pull request dan perubahan lokal untuk menemukan regresi keamanan secara manual atau dalam CI/CD.
Jalankan peninjauan perubahan keamanan untuk menemukan regresi dalam satu set perubahan yang didukung Git. Codex meninjau setiap file mirip sumber yang berubah beserta kode pendukung langsungnya. Peninjauan ini tidak diperluas menjadi audit repositori penuh.
Jika Anda ingin memindai repositori penuh alih-alih perubahan tertentu, lihat Jalankan pemindaian keamanan.
Jalankan peninjauan manual
Di aplikasi desktop, buka Security, pilih Scans, lalu pilih + Scan. Pilih repositori, lalu pilih Changes. Tinjau perubahan yang belum di-commit, satu commit, atau revisi dasar dan revisi kepala. Deep scan tidak tersedia untuk pemindaian perubahan.
Anda juga dapat meminta Codex meninjau perubahan yang belum di-commit dalam percakapan:
Use $codex-security:security-diff-scan to review my current uncommitted changes for security regressions.Untuk rentang commit atau cabang, tentukan kedua ujungnya bila diperlukan:
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.Anda juga dapat menyebutkan pull request jika revisi dasar dan revisi kepalanya tersedia dalam checkout lokal.
Konfirmasikan perubahan dalam penyiapan
- Pilih Changes.
- Konfirmasikan repositori yang sedang di-checkout, cabang saat ini, dan commit terbaru.
- Di bagian Changes to review, pilih:
Uncommitted changesuntuk working tree saat ini.- Commit terbaru untuk peninjauan satu commit.
- Revisi dasar dan revisi kepala untuk rentang cabang atau pull request.
- Konfirmasikan bahwa ringkasan menjelaskan perubahan yang ingin Anda tinjau.
- Pilih Start scan.
Alur kerja ini tidak melakukan checkout cabang lain atau mengubah working tree yang dipilih. Jika revisi yang diminta tidak tersedia secara lokal, ambil revisi tersebut sebelum peninjauan atau berikan revisi dasar dan revisi kepala yang tersedia secara lokal.
Tindak lanjuti temuan
Setelah meninjau hasilnya, perbaiki dan verifikasi temuan yang diterima atau ekspor dan lacak temuan.
Otomatiskan peninjauan dalam CI/CD
Jalankan skill $codex-security:security-diff-scan yang sama dari CI ketika runner
dapat memanggil Codex CLI tanpa interaksi. Pertama, instal CLI dan plugin
tanpa mengekspos kredensial pemindaian:
npm install --global @openai/codexInstal plugin Codex Security di CLI:
codex plugin add codex-security@openai-curatedPerintah instalasi menggunakan marketplace plugin Codex CLI publik, yang mungkin menawarkan versi berbeda dari katalog aplikasi desktop yang di-hosting. Periksa changelog plugin sebelum Anda bergantung pada versi atau fitur plugin tertentu dalam CI.
Kemudian, ekspos OpenAI API key dari penyimpanan rahasia CI Anda sebagai
CODEX_SECURITY_API_KEY hanya untuk pemindaian:
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."Pemindaian menulis outputnya ke
$TMPDIR/codex-security-scans/<repository>/<scan-id>/:
| File | Isi |
|---|---|
report.md |
Titik masuk utama yang mudah dibaca ke direktori pemindaian lengkap. |
findings/<slug>/ |
Satu laporan kerentanan terperinci untuk setiap temuan yang dapat dilaporkan, beserta file bukti konsep pendukung jika tersedia. |
hardening/ |
Portofolio penguatan struktural serta proposal atau diagram pendukung ketika pemindaian memiliki temuan yang dapat dilaporkan. |
findings.json |
Temuan dengan pengidentifikasi stabil, tingkat keparahan, tingkat keyakinan, lokasi sumber, dan remediasi. Masukkan ke alur kerja keamanan internal yang disetujui atau alat hilir. |
scan-manifest.json |
Tanda terima pemindaian tersegel yang memuat target dan revisi yang ditinjau, serta hash artefak. |
coverage.json |
Area yang ditinjau dan ditangguhkan, pengecualian, serta kelengkapan cakupan. |
Skema findings.json
menentukan struktur lengkapnya. Skema tersebut mencakup kolom berikut:
| Kolom | Jenis | Deskripsi |
|---|---|---|
documentType |
String | Mengidentifikasi dokumen sebagai codex-security.findings. |
schemaVersion |
String | Mengidentifikasi versi skema temuan. |
scanId |
String | Mengidentifikasi pemindaian yang menghasilkan temuan. |
findings |
Array | Berisi nol atau beberapa objek temuan. |
findings[].findingId |
String | Pengidentifikasi temuan stabil yang berasal dari sidik jari temuan. |
findings[].occurrenceId |
String | Mengidentifikasi kemunculan temuan ini dalam pemindaian tertentu. |
findings[].ruleId |
String | Mengidentifikasi keluarga kerentanan. |
findings[].identity |
Object | Berisi jangkar semantik dan pengidentifikasi instans saudara yang bersifat opsional. |
findings[].fingerprints |
Object | Berisi algoritma sidik jari dan sidik jari utama. |
findings[].title |
String | Memberikan judul singkat temuan. |
findings[].summary |
String | Merangkum kerentanan dan dampaknya. |
findings[].severity |
Object | Berisi tingkat keparahan dan detail penilaian opsional. |
findings[].confidence |
Object | Berisi tingkat keyakinan dan alasannya. |
findings[].taxonomy |
Object | Berisi kategori kerentanan dan pengidentifikasi CWE. |
findings[].locations |
Array | Mencantumkan file yang terdampak, nomor baris, dan peran lokasi. |
findings[].remediation |
String | Menjelaskan perbaikan yang direkomendasikan. |
findings[].provenance |
Object | Mengidentifikasi sumber temuan. |
Sebagai contoh, perintah ini mencetak satu baris yang dipisahkan tab untuk setiap temuan:
jq -r '
.findings[] |
[.findingId, .severity.level, .confidence.level, .locations[0].path, .locations[0].startLine, .title] |
@tsv
' findings.jsonContoh-contoh ini mengasumsikan runner Linux tepercaya dengan Node.js dan npm, Git, Python
3, jq, serta alat baris perintah penyedia. Prefiks paket global npm
harus dapat ditulisi.
Pilih contoh untuk penyedia CI Anda. Hasil pemindaian dapat mencakup detail kerentanan yang sensitif. Jaga agar artefak tetap privat, dan publikasikan temuan hanya setelah meninjau audiens, konten, dan persetujuan yang diperlukan.
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 Buat variabel CI/CD CODEX_SECURITY_API_KEY yang disamarkan dan tinjau artefak
pemindaian secara privat sebelum membagikan temuan.
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()Untuk Azure Repos, konfigurasikan kebijakan cabang Build validation untuk menjalankan pipeline pada 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
}
}
}
}
} Contoh-contoh tersebut melewati pull request dari fork. Jalankan pekerjaan berkredensial hanya dari
definisi pipeline yang dilindungi dan hanya untuk kontributor yang dipercaya memegang kredensial
pemindaian. Arsipkan codex-security-scans untuk menyimpan temuan terstruktur,
manifest, artefak cakupan, report.md, serta output findings/ dan
hardening/ yang tertaut bersama-sama. Mulailah dengan hasil bersifat saran dan tinjau cakupan
serta waktu proses sebelum menjadikan pekerjaan tersebut sebagai pemeriksaan wajib.
Untuk penanganan API key dan kontrol sandbox, lihat Mode
noninteraktif. Jika organisasi Anda mengizinkan Codex
GitHub Action, tindakan tersebut dapat menginstal CLI saat runtime, tetapi Anda
tetap harus menginstal plugin terlebih dahulu dan mengarahkan input codex-home tindakan tersebut ke
CODEX_HOME yang sama.