CIに組み込む前に知っておきたい結論から言うと、Codex Security CLIのスキャン費用はコード行数では決まりません。エージェントがどれだけ思考ループを回すかで決まります。Expressのコードが1ファイル9行だけのリポジトリをスキャンしたところ、8分半後に$6.00の上限で停止しました。この時点で消費していた入力トークンは700万、出力は1,605語の脅威モデル、検出結果はゼロです。まず設定すべきなのは何よりも--max-costでしょう。
それでもこのツールを把握しておく価値はあります。GitHub Appにリポジトリを渡さず、Codex Securityを実行できる初めてのバージョンだからです。
Codex Security CLIでできること、できないこと
Codex Securityそのものは新製品ではありません。OpenAIは2026年3月、ホステッドサービスとしてリサーチプレビューを開始しました。GitHubリポジトリを接続すると、隔離環境で脅威モデルの作成とコミット履歴のスキャンを行い、ChatGPTワークスペースで結果を報告する仕組みです。SecurityWeekの報道によれば、ChatGPT Pro、Enterprise、Business、Eduの顧客が利用できます。
2026年7月28日に公開されたものは別物です。openai/codex-securityはApache-2.0ライセンスのCLIおよびTypeScript SDKで、npmにはバージョン0.1.0として公開されました。公開時刻は17:09 UTCで、同日23:48 UTCには0.1.1が続いています。執筆時点では1.8k stars、オープン中のissueは28件。まさに公開初日のプロジェクトです。
インストールには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
費用面で重要なのは最後の2行です。この環境では、スキャンの既定値がGPT-5.6 Sol、推論強度はxhighでした。--modelでモデルは変更できますが、プラグインの中核は深いエージェント型ループであり、料金を左右するのもこのループです。
コマンド群はホステッド版から想像するより広く、scan、validate、patch、scans(一覧、表示、再実行、照合、比較)、bulk-scan、CSV・JSON・SARIFへのexport、install-hookを備えています。ツールをMCPサーバーとして登録するmcpモードもあります。ただし、MCP経由ではスキャンをキャンセルできないため、infoにはscanMcp: falseと表示されます。
認証は2通り。ただし本当に詰まるのはアクセス権
npx codex-security loginではChatGPTアカウントでログインできます。ヘッドレスマシンには--device-auth、CIにはOPENAI_API_KEYを使います。APIキーとログイン状態の両方がある場合、対話型スキャンでは使用する認証方法を聞かれます。非対話実行ではAPIキーが優先されます。
公式ドキュメントで特に注意したいのは、リポジトリ全体を対象とするスキャンには追加でTrusted Access for Cyberが必要になる場合がある点です。ログインしてもAPIキーを設定しても、これが自動で付与されるわけではありません。ログイン手順ではなく、アクセス申請が必要になるものとして考えておくべきです。
OpenAI互換エンドポイントでOpenAI Codex Security CLIを動かす
第三者のキーをOPENAI_API_KEYに入れれば、そのサービスへルーティングされると思うかもしれません。しかし、最初に失敗するのがここです。
codex-security: Authentication failed using OPENAI_API_KEY.
キーを入れるだけでは接続先は変わりません。組み込みのCodexランタイムはOpenAI自身のベースURLを向いたままで、OPENAI_BASE_URLを無視します。プロバイダー設定は、TOML値を受け取る--codexで上書きします。
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"'
ここには実行を1回ずつ無駄にした注意点が2つあります。値を引用符で囲まないとInvalid --codex TOML valueで失敗します。また、wire_api="chat"はCodex 0.144.6で明確に拒否されます。エラーはdiscussion #7782を示し、responsesを使うよう案内します。エンドポイント側にはChat Completionsだけでなく、Responses APIの実装が必要です。
モデル料金の扱いも、この設定から理解できます。CLIは接続先がどこであってもGPT-5.6 SolのOpenAIリスト価格で見積もるため、表示される累計は実際の請求額ではなくトークン数からの計算値です。同じトラフィックをリスト価格の半額のエンドポイントへ流した場合、以下の$6.03の実行は実際にはおよそ$3になります。それでもCLIの表示は$6.03のままです。
スキャン1回にかかった費用
以下の数値には前提があります。5回の実行はすべて第三者のOpenAI互換エンドポイント経由です。公式経路を試せるChatGPT BusinessまたはEnterpriseのログインを持っていなかったためです。ここで測っているのは、一般的な開発者が現時点で動かせるCLIであり、権限を持つアカウントで利用するホステッドサービスの挙動ではありません。
テスト用リポジトリは意図的に小さく、かつ意図的に問題を含めました。9行の中に、仕込んだ欠陥が4つあります。
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.46 | 3分23秒 | 1,092,608 | 121,396 | 10,300 | 0 |
| 2 | リポジトリ全体、標準モード | $6.00 | $6.03 | 8分33秒 | 6,654,720 | 331,330 | 34,946 | 0 |
| 3 | 作業ツリー、1行の差分 | $3.00 | $3.06 | 9分46秒 | 2,035,712 | 240,448 | 28,120 | 0 |
| 4 | リポジトリ全体、完全なプロジェクト | $8.00 | $8.54 | 8分00秒 | 7,299,840 | 634,419 | 57,223 | 0 |
| 5 | リポジトリ全体、reasoning_effort=low | $3.00 | $3.20 | 4分13秒 | 1,749,248 | 366,841 | 16,269 | 0 |
ドル表記はスキャン中にCLI自身が出力し、scans listにも保存される推定値です。エンドポイントから実際に請求される金額ではなく、OpenAIリスト価格とトークン数を使って算出されます。トークン数に対して合計額が低く見えるのは、キャッシュ済み入力のためです。実行2は、新規入力が100万トークンあたり$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)
この3つの単価で5回すべての実行結果をセント単位まで再現できます。自分の数値が不自然に見えるときの、便利な検算方法です。
5回のうち最後まで完了したものはありません。すべて予算上限で停止し、scans listではphase: preflight, status: failed、coverage: worklistRows 0と報告されました。つまり、脆弱性を報告する段階まで到達した実行はありません。
実行4は比較対象です。最初のリポジトリは意図的に不完全で、package.jsonはなく、importしている./dbも存在しませんでした。ツール自身が作成した脅威モデルでも、これは明示的な未知要素として指摘されます。そこで依存関係を宣言した4ファイル13行の適切なプロジェクトへ作り直したところ、費用は減るどころか増えました。$8.54、入力トークンは790万です。
費用は直線的には増えません。最初の3分間はゆっくり増え、その後に2回大きく跳ね上がります。各ステップはエージェントが作業範囲を広げたタイミングと重なっています。仕組みは開始51秒後のログに一度だけ出ます。Preflight: worker delegation supported (up to 8 worker slots)です。
入力トークンの95%はキャッシュ読み取りでした。同じコンテキストが新たに読まれるのではなく、ターンごとに再送されていることが分かります。トークン単価は安くても、請求額では最大の項目です。9行のファイルであっても、700万トークンになればキャッシュ入力単価でも無視できません。
この結果を見ると、よく言われる「1,000行あたりおよそ$0.02」という見積もりは成り立ちません。このリポジトリなら、その計算では1セントのごく一部に収まるはずでした。
推論強度を下げても、期待ほどは効かない
実行5では、実行4と同じプロジェクトにmodel_reasoning_effort="low"を設定しました。トークン消費は1分あたりおよそ100万から50万へ下がり、同じ金額で確保できる実行時間は2倍になります。それでも結果は同じで、報告事項がないままpreflightフェーズで上限に到達しました。処理パイプラインが予算内に収まらないターン数を必要とするなら、消費速度を半分にしても解決しません。
--max-costは緊急ブレーキではなく、チェックポイント
CLIの公式ドキュメントには、すでに処理中のリクエストは上限を超えて完了する場合があると書かれています。ただし、どこまで超過するかは説明されていません。5回の実行では超過幅は0.5%から46%でした。$1.00の上限では$1.46、$6.00では$6.03で停止し、中間の3つの上限では2%から7%超過しています。超過額はエージェントがその時点で処理中だった分に相当するため、上限近くでワーカーのファンアウトが起きるのが最も高くつくケースです。絶対に超えられない金額より低く上限を設定してください。
pre-commitで安くなるわけではない
制御不能な全体スキャンへの分かりやすい対策は、変更箇所だけをスキャンすることです。そこでクリーンなベースラインをコミットし、文字列連結で組み立てるLIKE句という脆弱な1行を追加して、--working-tree --base HEADを実行しました。
結果は、最初の全体スキャンより高額でした。9分46秒、入力トークンは2,276,160、$3.00の上限に対して$3.06で停止しています。全体スキャンよりはパイプラインの先へ進み、予算切れ前に優先順位付きのレビュー作業リスト(rank_input.jsonl、deep_review_input.jsonl)を作成しました。しかし検出結果はやはりゼロです。差分に絞ってもターンごとのコンテキストは小さくなりません。エージェントは依然としてリポジトリを読み、完全な脅威モデルを書き、ワーカーへ作業を分散します。
install-hookは、重大度の高い検出結果やスキャンエラーでブロックするGit pre-commitフックを設定します。チームに導入する前に、自分のコードベースで差分スキャン1回の費用を計測すべきです。コミットごとに数分と数ドルが追加されうるフックだからです。
それでも見つけられない問題
9行のコードに対して生成された脅威モデルは、よくできています。4つすべての信頼境界を特定し、不在の./dbモジュールを明示的な未知要素とし、確認できない保護機能をExpressのものとして勝手に認めることもありません。その限界も明快です。"Controls not present in the repository must not be assumed."と記されています。
これが構造的な制約です。入力はソースコードだけなので、デプロイ時に決まる事柄は見えません。CORSポリシー、オンのままになったデバッグモード、弱いTLS、不足したセキュリティヘッダー、キャッシュポイズニング、サービスをまたぐ実行時の認可がそれに当たります。とりわけオブジェクトレベルの認可不備は、確認するには2つの実在するIDで認証済みリクエストを送る必要があります。ソースを読むだけでは確認できません。
言語ごとの深さにも差があるようです。ホステッドサービスを試した実務者の記録では、Python、JavaScript、TypeScript、Go、Javaの対応が最も強く、Ruby、PHP、Kotlinはその後に続くとされています。私がテストしたのはJavaScriptだけなので、この点は二次情報として扱ってください。
今、使うべきか
脅威モデルが欲しいなら、今日インストールしてよいでしょう。これは全実行で得られた唯一の成果物でした。信頼境界を整理し、攻撃者のシナリオを列挙し、このサービスにおけるcritical、high、medium、lowの定義を示す1,605語の文書です。--knowledge-baseで独自のアーキテクチャ文書を渡せ、生成されたモデルも編集できるため、ほかのツールを使う際の入力としても有用です。
予算を予測したい、あるいは実際の検出リストが必要なら待ったほうがよいです。5つの構成で得られたのはどちらでもありませんでした。10秒で読み切れるリポジトリに対し、1回あたり$1.46から$8.54です。パイプライン後半で文書化されているfindings.json、coverage.json、report.mdには、一度も到達できませんでした。権限を持つChatGPT Businessアカウントで異なる挙動を示すかどうかは、このテストでは答えられない未解決の点です。
今回、明白に見える2つのコスト削減策は機能しませんでした。差分への限定も推論強度の引き下げも、同じ壁で止まっています。計算を変えたのはモデル単価です。見積もりはリスト価格に基づくトークン数から計算されるため、リスト価格の半額のエンドポイントなら同じ実行の費用も半額になります。予算はリポジトリ規模からではなく実測結果から組み、上限は実際に超えられない額よりワーカー1ラウンド分だけ低く設定してください。今回の最大超過は上限の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互換エンドポイントでも動きますか?
エンドポイントがResponses APIを実装していれば動作します。ただしOPENAI_API_KEYを設定するだけでは認証に失敗するため、--codexフラグでCodexのプロバイダー設定を上書きする必要があります。
Codex Security CLIとCodex Securityプラグインの違いは?
スキャンエンジンは同じで、入口が異なります。プラグインは接続したGitHubリポジトリに対してOpenAIのインフラ上で動作します。CLIはローカルパスを対象に自分のマシンで実行し、ローカルの状態ディレクトリにスキャン履歴を保存します。加えて、差分スコープのスキャン、pre-commitフック、SARIF出力、MCP登録を提供します。
関連記事: GPT-5.6料金ガイド · Codex auto mode
