Проверка изменений кода на наличие уязвимостей
Проверяйте запросы на включение изменений и локальные изменения на предмет регрессий безопасности вручную или в 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.
В ходе этого процесса другая ветка не извлекается, а выбранное рабочее дерево не изменяется. Если запрошенная ревизия недоступна локально, получите её перед проверкой либо укажите доступные локально базовую и конечную ревизии.
Работа с обнаруженными проблемами
После просмотра результатов исправьте и проверьте подтверждённую проблему либо экспортируйте и отслеживайте обнаруженные проблемы.
Автоматизация проверок в CI/CD
Запускайте тот же навык $codex-security:security-diff-scan из CI, если среда выполнения
может вызывать Codex CLI без взаимодействия с пользователем. Сначала установите CLI и плагин,
не раскрывая учётные данные для сканирования:
npm install --global @openai/codexУстановите плагин Codex Security в CLI:
codex plugin add codex-security@openai-curatedКоманда установки использует общедоступный каталог плагинов Codex CLI, в котором может предлагаться версия, отличная от версии в каталоге размещённого настольного приложения. Ознакомьтесь с журналом изменений плагина, прежде чем полагаться на конкретную версию или функцию плагина в CI.
Затем предоставьте API key OpenAI из хранилища секретов CI как
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."Результаты сканирования записываются в
$TMPDIR/codex-security-scans/<repository>/<scan-id>/:
| Файл | Содержимое |
|---|---|
report.md |
Основная удобочитаемая точка входа в полный каталог результатов сканирования. |
findings/<slug>/ |
По одному подробному отчёту об уязвимости для каждой проблемы, подлежащей включению в отчёт, со вспомогательными файлами для доказательства концепции, если они доступны. |
hardening/ |
Набор мер по структурному усилению защиты, а также сопутствующие предложения или диаграммы, если при сканировании обнаружены проблемы, подлежащие включению в отчёт. |
findings.json |
Обнаруженные проблемы со стабильными идентификаторами, уровнем критичности, степенью уверенности, расположением в исходном коде и рекомендациями по устранению. Используйте их в одобренных внутренних процессах безопасности или последующих инструментах. |
scan-manifest.json |
Защищённая квитанция сканирования с проверенной целью, ревизиями и хешами артефактов. |
coverage.json |
Проверенные и отложенные области, исключения и полнота охвата. |
Схема findings.json
определяет полную структуру. Схема включает следующие поля:
| Поле | Тип | Описание |
|---|---|---|
documentType |
Строка | Идентифицирует документ как codex-security.findings. |
schemaVersion |
Строка | Идентифицирует версию схемы обнаруженных проблем. |
scanId |
Строка | Идентифицирует сканирование, при котором были обнаружены проблемы. |
findings |
Массив | Содержит ноль или более объектов обнаруженных проблем. |
findings[].findingId |
Строка | Стабильный идентификатор проблемы, полученный из её цифрового отпечатка. |
findings[].occurrenceId |
Строка | Идентифицирует это появление проблемы в конкретном сканировании. |
findings[].ruleId |
Строка | Идентифицирует семейство уязвимостей. |
findings[].identity |
Объект | Содержит семантическую привязку и необязательный идентификатор связанного экземпляра. |
findings[].fingerprints |
Объект | Содержит алгоритм цифрового отпечатка и основной цифровой отпечаток. |
findings[].title |
Строка | Содержит краткое название обнаруженной проблемы. |
findings[].summary |
Строка | Кратко описывает уязвимость и её последствия. |
findings[].severity |
Объект | Содержит уровень критичности и необязательные сведения об оценке. |
findings[].confidence |
Объект | Содержит степень уверенности и её обоснование. |
findings[].taxonomy |
Объект | Содержит категорию уязвимости и идентификаторы CWE. |
findings[].locations |
Массив | Перечисляет затронутые файлы, номера строк и роли расположений. |
findings[].remediation |
Строка | Описывает рекомендуемое исправление. |
findings[].provenance |
Объект | Идентифицирует источник обнаруженной проблемы. |
Например, эта команда выводит по одной строке с разделителями-табуляциями для каждой обнаруженной проблемы:
jq -r '
.findings[] |
[.findingId, .severity.level, .confidence.level, .locations[0].path, .locations[0].startLine, .title] |
@tsv
' findings.jsonВ этих примерах предполагается использование доверенной среды выполнения Linux с Node.js и npm, Git, Python
3, jq и инструментами командной строки поставщика. Глобальный префикс пакетов 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 Создайте маскируемую переменную CI/CD CODEX_SECURITY_API_KEY и просматривайте артефакты
сканирования в закрытом доступе, прежде чем делиться обнаруженными проблемами.
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
}
}
}
}
} В примерах пропускаются запросы на включение изменений из форков. Запускайте задания с учётными данными только из
защищённого определения конвейера и только для участников, которым доверены учётные данные для
сканирования. Архивируйте codex-security-scans, чтобы хранить структурированные сведения об обнаруженных проблемах,
манифест, артефакты охвата, report.md и связанные с ним результаты findings/ и
hardening/ вместе. Сначала используйте результаты в рекомендательном режиме и проверяйте охват
и время выполнения, прежде чем делать задание обязательной проверкой.
Сведения об обращении с API key и средствах управления песочницей см. в разделе Неинтерактивный
режим. Если ваша организация разрешает использовать Codex
GitHub Action, он может устанавливать CLI во время выполнения, однако вам
по-прежнему необходимо сначала установить плагин и направить входные данные codex-home действия на
тот же CODEX_HOME.