OpenAI Codex Security CLI: во сколько обходится один реальный скан

Последнее обновление: 2026-07-29 03:17:33

Репозиторий из одного файла и девяти строк Express-кода. Именно на нём я проверил новый Codex Security CLI. Через восемь с половиной минут сканирование остановилось у лимита $6.00: инструмент успел сжечь 7.0 млн входных токенов, написать threat model на 1 605 слов — и не выдать ни одной находки. Главный вывод для тех, кто собирается подключать его к CI: цена зависит не от размера кодовой базы, а от того, как долго агент размышляет в своём цикле. Поэтому --max-cost стоит настроить раньше всего остального.

Тем не менее разобраться с инструментом стоит. Это первая версия Codex Security, которую можно запускать без подключения репозитория к GitHub App.

Репозиторий OpenAI codex-security на GitHub с лицензией Apache-2.0 и 1,8 тыс. звёзд

Что умеет CLI — и чего от него не ждать

Сам Codex Security появился не вчера. В марте 2026 года OpenAI запустила его в исследовательском превью как облачный сервис: вы подключаете GitHub-репозиторий, сервис строит модель угроз, сканирует историю коммитов в изолированной среде и показывает результаты в рабочем пространстве ChatGPT. По данным SecurityWeek, сервис доступен клиентам ChatGPT Pro, Enterprise, Business и Edu.

Релиз от 28 июля 2026 года — это другой продукт. openai/codex-security представляет собой CLI и TypeScript SDK под лицензией Apache-2.0. Пакет опубликовали в npm как версию 0.1.0 в 17:09 UTC, а 0.1.1 вышла в 23:48 UTC того же дня. На момент написания у проекта 1.8k звёзд и 28 открытых issue. Перед нами буквально проект первого дня.

Для установки понадобятся Node.js 22 или новее и Python 3.10 или новее: движок сканирования поставляется как встроенный Python-плагин.

npm install @openai/codex-security
npx codex-security info

Команда info сразу показывает, что именно установлено:

sdkVersion: 0.1.1
bundledPluginVersion: 0.1.14
cliVersion: 0.1.1
codexVersion: 0.144.6
model: gpt-5.6-sol
reasoningEffort: xhigh

Последние две строки объясняют почти всю экономику. В этой установке сканирование по умолчанию использует GPT-5.6 Sol с уровнем рассуждений xhigh. Модель можно заменить через --model, но сам плагин построен вокруг глубокого агентного цикла — и платить приходится именно за него.

Набор команд заметно шире, чем можно предположить по облачному продукту: scan, validate, patch, scans для списка, просмотра, повторного запуска, сопоставления и сравнения сканов, bulk-scan, экспорт в CSV, JSON или SARIF через export, install-hook, а также режим mcp, регистрирующий инструмент как MCP-сервер. Учтите, что info также выводит scanMcp: false: сканирование нельзя отменить через транспорт MCP.

Авторизация: два пути и один важный барьер

Команда npx codex-security login авторизует через аккаунт ChatGPT, для headless-машин есть --device-auth, а для CI предназначена переменная OPENAI_API_KEY. Если одновременно доступны ключ и активная сессия, интерактивный запуск спросит, что использовать. В неинтерактивном режиме приоритет получает API-ключ.

Но в официальной документации есть оговорка, которую важно не пропустить: для полного сканирования репозитория дополнительно может потребоваться Trusted Access for Cyber. Ни вход в аккаунт, ни API-ключ сами по себе этот доступ не дают. То есть рассчитывать стоит не просто на логин, а на отдельный запрос доступа.

Как запустить OpenAI Codex Security CLI через совместимый endpoint

Первая очевидная попытка — подставить в OPENAI_API_KEY ключ стороннего провайдера — заканчивается ошибкой:

codex-security: Authentication failed using OPENAI_API_KEY.

Одного ключа недостаточно, чтобы перенаправить трафик. Встроенный рантайм Codex всё равно обращается к базовому URL OpenAI и игнорирует OPENAI_BASE_URL. Провайдера нужно переопределять через --codex, передавая TOML-значения:

OPENAI_API_KEY=sk-... npx codex-security scan . --auth api-key --max-cost 5 \
  --codex 'model_provider="relay"' \
  --codex 'model_providers.relay.name="relay"' \
  --codex 'model_providers.relay.base_url="https://your-endpoint/api/v1"' \
  --codex 'model_providers.relay.env_key="OPENAI_API_KEY"' \
  --codex 'model_providers.relay.wire_api="responses"'

На двух деталях я потерял по одному запуску. Значения без кавычек дают Invalid --codex TOML value. А вариант wire_api="chat" Codex 0.144.6 вообще отвергает: ошибка ссылается на discussion #7782 и требует использовать responses. Endpoint должен поддерживать Responses API, одних Chat Completions недостаточно.

Из этой же настройки следует, куда попадёт фактический счёт за модель. CLI всегда считает стоимость по публичным тарифам OpenAI для GPT-5.6 Sol независимо от выбранного endpoint. Поэтому отображаемая сумма — это расчёт по токенам, а не ваш реальный инвойс. Если отправить тот же трафик через endpoint с ценой вдвое ниже прайса, запуск на $6.03 ниже обойдётся примерно в $3, хотя CLI продолжит показывать $6.03.

Цена одного сканирования на практике

У приведённых цифр есть важное ограничение: все пять запусков проходили через сторонние OpenAI-совместимые endpoints, поскольку у меня не было учётной записи ChatGPT Business или Enterprise для проверки официального пути. Это замер CLI в сценарии, доступном обычному разработчику прямо сейчас, а не поведения облачного сервиса для аккаунта с нужными правами.

Тестовый репозиторий намеренно маленький и намеренно небезопасный: девять строк, в которые заложены четыре уязвимости.

const express = require('express');
const { exec } = require('child_process');
const db = require('./db');
const app = express();
const API_KEY = "sk-live-9f3a2b7c1d4e5f6a8b9c0d1e2f3a4b5c";
app.get('/u', (req, res) => db.query("SELECT * FROM users WHERE id = " + req.query.id, (e, r) => res.json(r)));
app.get('/ping', (req, res) => exec("ping -c 1 " + req.query.host, (e, o) => res.send(o)));
app.get('/f', (req, res) => res.sendFile(__dirname + "/files/" + req.query.name));
app.listen(3000);

SQL с конкатенацией строк, вызов child_process.exec с параметром запроса, неочищенный путь в sendFile, жёстко прописанный ключ. Среда теста: macOS, Node v22.17.0, Python 3.14.6, @openai/[email protected], встроенный плагин 0.1.14. Все прогоны выполнены 2026-07-29 с 02:20 до 03:05 UTC.

ЗапускЦельЛимитОстановлен наВремяКэшированный вводНовый вводВыводНаходки
1Весь репозиторий, обычный режим$1.00$1.463m23s1,092,608121,39610,3000
2Весь репозиторий, обычный режим$6.00$6.038m33s6,654,720331,33034,9460
3Рабочее дерево, diff в одну строку$3.00$3.069m46s2,035,712240,44828,1200
4Весь репозиторий, полный проект$8.00$8.548m00s7,299,840634,41957,2230
5Весь репозиторий, reasoning_effort=low$3.00$3.204m13s1,749,248366,84116,2690

Суммы в долларах — собственная оценка CLI: она выводится по ходу сканирования и сохраняется в scans list. Расчёт строится на токенах и публичных ценах OpenAI, а не на фактических тарифах endpoint. Относительно небольшие суммы при таком числе токенов объясняются кэшированным вводом. Для запуска 2 всё точно сходится при $5.00 за миллион новых входных токенов, $0.50 за миллион кэшированных и $30.00 за миллион выходных:

331,330 x $5.00/M   = $1.657
6,654,720 x $0.50/M = $3.327
34,946 x $30.00/M   = $1.048
                      ------
                      $6.032   (CLI reported $6.03239)

Те же три тарифа воспроизводят до цента итоговые суммы всех пяти запусков. Это удобная проверка, если ваши собственные расчёты вдруг покажутся странными.

Ни один из пяти запусков не завершился. Каждый остановился по лимиту бюджета, а scans list для всех показывает phase: preflight, status: failed и coverage: worklistRows 0. Иными словами, ни один не дошёл до этапа, где формируется отчёт об уязвимостях.

Запуск 4 был контрольным. Первый репозиторий специально оставили неполным: без package.json, с импортом ./db, которого в проекте не было. Собственная модель угроз инструмента отметила это как явную неизвестность. После пересборки в полноценный проект из четырёх файлов и тринадцати строк с объявленными зависимостями стоимость не снизилась, а выросла: $8.54 и 7.9M входных токенов.

Рост оценочной стоимости за восемь минут сканирования репозитория из девяти строк

Рост не был линейным. В первые три минуты стоимость увеличивалась медленно, затем произошли два скачка — и каждый совпал с расширением работы агента. В логе механизм появляется один раз, на 51-й секунде: Preflight: worker delegation supported (up to 8 worker slots).

Разбивка токенов: 6,65 млн кэшированных входных токенов против 0,33 млн новых входных и 35 тыс. выходных

95% входных токенов пришлось на чтения из кэша. Контекст отправлялся повторно от шага к шагу, а не считывался заново. Такие токены дешёвые, но именно эта статья всё равно оказалась самой крупной в счёте. Даже по кэшированному тарифу семь миллионов токенов — это много для файла из девяти строк.

Именно здесь ломается часто повторяемая оценка примерно в $0.02 на 1 000 строк кода. По ней мой репозиторий должен был стоить долю цента.

Низкий уровень рассуждений экономит меньше, чем кажется

В запуске 5 для того же проекта, что и в запуске 4, установлен model_reasoning_effort="low". Расход токенов снизился примерно с 1.0M до 0.5M в минуту, то есть за те же деньги сканирование работало вдвое дольше. Однако оно всё равно упёрлось в лимит на этапе preflight и ничего не выдало. Снижение скорости расхода не решает проблему, если пайплайн в любом случае требует больше итераций, чем покрывает бюджет.

--max-cost — это контрольная точка, а не аварийный стоп-кран

Сопоставление заданного бюджета и стоимости на момент остановки сканирования в пяти запусках с лимитами от $1 до $8

Официальная документация CLI предупреждает, что уже начатые запросы могут завершиться после превышения лимита. Но не говорит, насколько именно. В пяти запусках перерасход составил от 0.5% до 46%: лимит $1.00 привёл к остановке на $1.46, $6.00 — на $6.03, а три промежуточных лимита были превышены на 2–7%. Перерасход равен стоимости работы, уже находившейся в полёте. Самый дорогой сценарий — когда веер воркеров заканчивает работу рядом с потолком. Устанавливайте лимит ниже суммы, которую действительно нельзя превысить.

Проверка перед коммитом не станет дешёвым вариантом

Кажется, что очевидное решение для дорогого полного сканирования — проверять только изменения. Я закоммитил чистую базовую версию, добавил одну уязвимую строку с LIKE, собранным конкатенацией строк, и запустил --working-tree --base HEAD.

Этот запуск оказался дороже первого полного: 9m46s, 2,276,160 входных токенов, остановка на $3.06 при лимите $3.00. Он действительно продвинулся дальше полных сканов и успел записать ранжированный список работ для ревью — rank_input.jsonl и deep_review_input.jsonl — но находок всё равно не выдал. Ограничение diff не уменьшает контекст каждого шага: агент всё так же читает репозиторий, строит полную модель угроз и раздаёт задачи воркерам.

install-hook подключает Git pre-commit hook, который блокирует коммит при находках высокой критичности и ошибках сканирования. Прежде чем ставить его команде, измерьте цену одного diff-скана на собственной кодовой базе: такой hook может добавлять к каждому коммиту и минуты, и доллары.

Какие проблемы инструмент пока не увидит

Модель угроз, которую инструмент написал для девяти строк, выполнена качественно. Она определяет все четыре границы доверия, называет отсутствующий модуль ./db явной неизвестностью и не приписывает Express защитные механизмы, которые невозможно проверить. Ограничение сформулировано прямо: "Controls not present in the repository must not be assumed."

В этом и заключается фундаментальное ограничение. Единственный вход для инструмента — исходный код, поэтому всё, что определяется при развёртывании, остаётся вне поля зрения: политика CORS, включённый debug-режим, слабый TLS, отсутствующие security headers, cache poisoning и авторизация между сервисами во время выполнения. В частности, уязвимости авторизации на уровне объектов требуют проверки аутентифицированными запросами от двух реальных пользователей — исходный код сам по себе этого не даст.

Глубина поддержки языков, по сообщениям, тоже неравномерна. В одном практическом разборе облачного сервиса говорится, что лучше всего покрыты Python, JavaScript, TypeScript, Go и Java, а Ruby, PHP и Kotlin отстают. Я тестировал только JavaScript, поэтому эту оценку стоит считать вторичной информацией.

Стоит ли запускать?

Установить инструмент уже сейчас стоит ради модели угроз. Это единственный артефакт, который я получил во всех запусках: документ на 1 605 слов с картой границ доверия, сценариями атакующего и определением критического, высокого, среднего и низкого уровней именно для этого сервиса. Он пригодится и как вход для других средств безопасности: --knowledge-base принимает собственную архитектурную документацию, а сгенерированную модель можно редактировать.

Если вам нужны предсказуемые расходы или фактический список находок, лучше подождать. В пяти конфигурациях я не получил ни того ни другого: от $1.46 до $8.54 за запуск для репозитория, который можно прочитать за десять секунд. Документированные артефакты следующих этапов — findings.json, coverage.json и report.md — мне так и не встретились. Остаётся открытым вопрос, будет ли иначе вести себя аккаунт ChatGPT Business с нужными правами: эти тесты на него не отвечают.

Ни один из двух очевидных рычагов экономии здесь не сработал: ни ограничение diff, ни снижение уровня рассуждений не помогли пройти тот же барьер. На арифметику повлиял только тариф модели. Оценка основана на токенах и публичной цене, поэтому endpoint с ценой вдвое ниже уменьшает стоимость того же запуска вдвое. Планируйте бюджет по замерам реальных запусков, а не по размеру репозитория, и закладывайте запас на один раунд воркеров: в моём случае максимальный перерасход составил 46% лимита.

FAQ

Codex Security CLI бесплатен?

CLI и SDK распространяются по лицензии Apache-2.0, установить их можно бесплатно. Сканирования бесплатными не являются: они расходуют токены GPT-5.6 Sol через используемые учётные данные, а CLI показывает текущую оценку по публичным тарифам OpenAI.

Нужен ли тариф ChatGPT Business или Enterprise?

Для облачной интеграции с GitHub — да: этот путь ограничен Pro, Enterprise, Business и Edu. CLI принимает обычный OPENAI_API_KEY, но документация предупреждает, что полные сканирования репозитория всё равно могут требовать Trusted Access for Cyber, который ни один тариф не предоставляет автоматически.

Можно ли запускать его в CI?

Да. Задайте OPENAI_API_KEY, добавьте --fail-on-severity, чтобы находки приводили к ненулевому коду завершения, и направьте CODEX_SECURITY_STATE_DIR в доступный для записи каталог за пределами репозитория. По умолчанию сканирования только формируют отчёт.

Работает ли он со сторонним OpenAI-совместимым endpoint?

Да, если endpoint поддерживает Responses API. Конфигурацию провайдера Codex нужно переопределить флагами --codex, потому что одна лишь настройка OPENAI_API_KEY приводит к ошибке аутентификации.

Чем CLI отличается от плагина Codex Security?

Движок сканирования один и тот же, отличается точка входа. Плагин работает в инфраструктуре OpenAI с подключённым GitHub-репозиторием. CLI запускается на вашей машине по локальному пути, хранит историю сканов в локальном каталоге состояния и дополнительно поддерживает сканирование с ограничением по diff, pre-commit hook, экспорт SARIF и регистрацию MCP.


Читайте также: Гид по ценам GPT-5.6 · Автоматический режим Codex