サプライチェーン

コーディングエージェントは大量のパッケージをインストールします。新たに侵害された依存関係は、サンドボックスを汚染する最も直接的な手段の1つです。サプライチェーンペインは、Bromure Agentic Coding がすべてのパッケージ取得に適用する、ワークスペースごとのポリシーを設定します。ペイン自体の説明にあるとおり、Bromure はすべてのパッケージ取得(npm、PyPI、Cargo、RubyGems、Maven、NuGet、Go modules、Packagist)をホストの MITM を通じてスキャンし、エージェントが応答を目にする前にこれらのポリシーを適用します。VM 内の .npmrc / pip.conf はこれらの設定をさらに厳しくすることしかできず、緩めることはできません。ピンポイントで上書きするには、パッケージごとの許可リストを使用してください。

ワークスペース設定エディタのサプライチェーンペイン。経過期間ゲートのグループが最小2日で有効になっており、OSV 脆弱性チェックのグループが表示されている

このペインは、独立して切り替えられる5つのレイヤーをグループ化しています。経過期間ゲートOSV 脆弱性チェックパッケージフィルタリングインストールスクリプトロックファイルピン留めインストールです(最後の3つはスクロールして表示します)。このページでは設定について説明します。パイプライン全体 — エコシステムのカバレッジ、セキュリティログ、応答ヘッダー、侵害検出 — については、サプライチェーン保護の章で説明します。

適用の仕組み

すべてのチェックはホスト側のプロキシで実行され、VM 内では決して実行されません。レピュテーションサービスの API キー(socket.dev、Delpi)はホスト上にのみ保持され、VM にエクスポートされることは決してありません。チェックが発動すると、プロキシはプレーンテキストの理由を伴う HTTP 451 応答でダウンロードをブロックします(たとえば「npm package [email protected] published 4 hours ago — policy requires 2 days minimum」)。npmpipcargo はそのテキストをそのまま表示するため、エージェントもあなたも、インストールが失敗した理由を正確に確認できます。ブロックされた応答にはヘッダー X-Bromure-Block: supply-chain が付き、書き換えられた応答には X-Bromure-Rewritten: supply-chain が付きます。

ポリシーの編集はライブで適用されます。ワークスペースを保存すると、新しいポリシーが実行中のセッションへ即座にプッシュされ(VM の再起動は不要)、各変更はセキュリティログの [supply-chain] policy engaged 行で確認できます(ウィンドウメニュー → セキュリティログ…)。

メモ: npm や pip のローカルキャッシュにすでに存在するパッケージはネットワークに一切アクセスしないため、それらについては何もチェックもログ記録もされません。インストール中にセキュリティログが静かなのは、単にすべてがキャッシュされていたことを意味する場合があります。

経過期間ゲート

経過期間ゲートは、設定可能なカットオフより新しいパッケージバージョンを拒否します。これは、公開されたばかりのリリースこそが、新たに侵害されたパッケージである可能性が最も高いという考えに基づいています。デフォルトで有効になっている唯一のレイヤーです。

  • カットオフより新しいパッケージを拒否 — マスタートグル。デフォルトで有効。
  • 最小経過期間 — 日数単位のカットオフ(ステッパー、0〜90)。デフォルト: 2日。
  • 除外パッケージnpm:axios(1つのエコシステム)または単に axios(すべてのエコシステム)の形式の許可リスト。大文字・小文字は区別されません。行を追加するには エントリを追加 をクリックします。

浮動参照(pkg@latest、semver 範囲)が完全にブロックされることは決してありません。プロキシはレジストリのメタデータを書き換え、新しすぎるバージョンをエージェントの視点からは存在しないものにするため、パッケージマネージャーは許可された最新のバージョンに解決します。451 が返されるのは、新しすぎるバージョンへのピン留め参照のみで、そのパッケージの経過期間と要求される最小値が示されます。

メモ: Maven、NuGet、Go modules は、標準のメタデータ応答にバージョンごとのタイムスタンプを持たないため、経過期間ゲートは現在これら3つのエコシステムをブロックしません。npm、PyPI、Cargo、RubyGems、Packagist は完全にカバーされています(PyPI の場合、Bromure は PyPI JSON API から公開時刻をオンデマンドで取得します)。

OSV 脆弱性チェック

api.osv.dev でパッケージを照会(無料、キー不要) が有効な場合、ダウンロードされた各アーティファクトのエコシステム、パッケージ、バージョンが OSV データベース — GitHub Advisory Database、PyPI advisories、Go の脆弱性データベース、RubySec などを無料で集約したもの — と照合されます。ブロックする深刻度 のしきい値以上のアドバイザリがあれば、451 でダウンロードをブロックします。

  • デフォルトで無効 — ペインが指摘するとおり、推移的なサブパッケージ内の低深刻度の CVE がワークフローを中断すべきではありません。
  • ブロックする深刻度 では 低以上中以上高以上(デフォルト)、重大のみ を選択できます。
  • 8つのエコシステムすべてをカバーします。チェックはアーティファクトのダウンロード時に実行され、メタデータの取得時には実行されません。

パッケージフィルタリング

パッケージフィルタリング のラジオボタンでレピュテーションプロバイダーを選択します。なしsocket.devDelpi のいずれかです。2つのプロバイダーは動作が異なり、socket.dev は取得を通す前にプロキシが照会する事前チェックであるのに対し、Delpi は npm レジストリを完全に置き換えるため、両者は排他的です。保存された API キーは切り替え時に保持されるので、プロバイダー間の切り替えは非破壊的です。

socket.dev

socket.dev を選択したら、API トークンを API キー に貼り付けます(API キーを取得 リンクは socket.dev のトークンページを開きます)。以下の両方のトグルはキーが入力されるまで無効のままで、キーが空の場合はトグルの状態にかかわらず socket.dev 全体が無効になります。キーはホスト側にのみ保存され、VM に入ることは決してありません。

  • 侵害されたパッケージをブロック(不正なインストールスクリプト、マルウェア判定、タイポスクワット、疑わしいテレメトリ) — 攻撃の形をしたサプライチェーンリスクのシグナルでブロックします。マルウェアの決定的な指標はどの深刻度でもブロックし、難読化されたコード、インストールスクリプト、タイポスクワッティング、シェルアクセスなどのノイズの多いシグナルは socket.dev が高または重大と評価した場合にのみブロックします(したがって、無害な postinstall を持つパッケージはブロックされません)。デフォルトで無効。
  • 既知の CVE を持つパッケージをブロック — socket.dev の脆弱性バケットが CVE ブロックしきい値(デフォルト 高以上。このトグルが有効になるまでピッカーは無効)以上の場合にブロックします。デフォルトで無効。

メモ: socket.dev は Cargo をサポートしていません。socket.dev フィルタリングを有効にすると、すべての crates.io アーティファクトは判定を得られず、以下で説明する未検証パッケージの保留をトリガーします — 実質的に crate バージョンごとにプロンプトが表示されます。Rust を多用するワークスペースでは socket.dev を無効にするか、プロンプトへの応答が発生することを想定してください。

Delpi

Delpi を選択して API キーを入力すると(API キーを取得 リンクは landh.tech を開きます)、プロキシはすべての npm レジストリリクエスト — メタデータ、tarball、audit、registry.npmjs.org 宛のすべて — を Delpi の npm 互換セキュアレジストリ depi-npm-proxy.landh.tech に再ルーティングし、あなたのキーをホストが注入する Bearer トークンとして付加します。Delpi は事前審査済みのパッケージを提供するため、パッケージごとの照会の代わりに、レジストリ全体が置き換えられます。他のレイヤー(経過期間ゲート、OSV、スクリプト除去)はその上でなお適用されます。Delpi が置き換えるのは socket.dev であって、ローカルポリシーではありません。

キーフィールドが空の間は、オレンジ色の警告が API キーを入力してください — キーがないと Delpi は無効のままです。 と表示します。Delpi がキーを拒否した場合、npm install は明確な Bromure エラーで失敗し、拒否はセキュリティログに記録され、ワンショットのアラートが発生します。Delpi は npm のみに影響し、他のエコシステムには手を加えません。

インストールスクリプト

npm tarball から preinstall / install / postinstall / prepare をオンザフライで除去 は、悪意のある npm パッケージがインストール時にコードを実行するために使用するフックを削除します。Bromure は tarball を転送中に書き換え — パッケージの package.json からスクリプトキーを削除し、tar チェックサムを再計算し、再度 gzip 圧縮します — そしてレジストリメタデータから整合性ハッシュを消去するため、ピン留めされていないインストールでは npm 自身の検証がなお通ります。除去はセキュリティログにオレンジ色でログ記録されます。解析に失敗した場合は、元の tarball が手を加えられずに通過します(このレイヤーは、正しく構成されたインストールを壊すのではなく、フェイルオープンします)。

インストールスクリプトを本当に必要とするバインディングコンパイラ(better-sqlite3、node-canvas など)は、インストールスクリプトを許可する対象npm:better-sqlite3 の形式で入れます。

デフォルトで無効。npm のみ(PyPI の sdist は決して書き換えられません — setup.py は任意のコードです)。

ロックファイルピン留めインストール

ロックファイルピン留めインストール(npm cipip --require-hashes)は、tarball の整合性ハッシュをロックファイルにピン留めするため、Bromure は検証を壊さずにそれらの tarball を書き換えることができません。デフォルトでは、それらは変更されずに静かに通過します。

ロックファイルピン留めの tarball を変更せずに通過させる前に確認(npm cipip --require-hashes を有効にすると、代わりに確認が求められます。バッチ内の最初のロックファイルピン留めの取得時に、Pass through npm ci (lockfile-pinned install) from workspace "<name>"? というタイトルのホストダイアログが表示され、15分間許可1回だけ許可セッションの残りの間許可許可しない の選択肢が示されます。バッチ全体がこの決定に従います(同時の取得は1つのプロンプトに統合されます)。拒否すると 451 でブロックされ、60秒間記憶されます。

メモ: ラベルには pip --require-hashes が記載されていますが、検出は現在 npm の npm ci のみに実装されています — pip のハッシュピン留めインストールはプロンプトをトリガーしません。

レピュテーションソースに到達できない場合

有効なレピュテーションソース(OSV または socket.dev)が判定を出せない場合 — ネットワークダウン、レート制限、認証失敗、非対応エコシステム — Bromure は静かに許可するのではなく、フェイルクローズします。ダウンロードは保留され、パッケージとバージョンごとに、未検証パッケージを受け入れるかどうかをダイアログが尋ねます。拒否すると 451 でブロックされます。承認は package@version ごとにキー付けされるため、1つの応答が依存関係グラフ全体を一括で覆うことはできません。

これは、攻撃者がレート制限を誘発してパッケージをこっそり通すのを防ぐための意図的な保護です。また、OSV または socket.dev を有効にした完全オフラインの作業では、キャッシュされていないすべてのパッケージについてプロンプトが表示されることも意味します — オフライン利用ではこれらのレイヤーを無効にしてください。ヘッドレスの SSH/CLI セッションでは、同じ質問がワークスペースの tmux 内で尋ねられます。応答がない場合は拒否となります。

設定リファレンス

設定種類デフォルト
カットオフより新しいパッケージを拒否トグル有効
最小経過期間ステッパー、0〜90日2日
除外パッケージリスト(npm:axios または axios
api.osv.dev でパッケージを照会(無料、キー不要)トグル無効
ブロックする深刻度(OSV)ピッカー: 低 / 中 / 高以上、重大のみ高以上
パッケージフィルタリングラジオ: なし / socket.dev / Delpiなし
API キー(socket.dev)セキュアフィールド
侵害されたパッケージをブロックトグル(socket.dev キーが必要)無効
既知の CVE を持つパッケージをブロックトグル(socket.dev キーが必要)無効
CVE ブロックしきい値ピッカー(CVE トグルで有効化)高以上
API キー(Delpi)セキュアフィールド空(キーがないと Delpi は無効のまま)
npm tarball から preinstall / install / postinstall / prepare をオンザフライで除去トグル無効
インストールスクリプトを許可する対象リスト(npm:better-sqlite3
ロックファイルピン留めの tarball を変更せずに通過させる前に確認トグル無効

ここで入力した API キーは、ホスト上のワークスペースの profile.json に保存されます(VM には決して保存されません)。すべてのレピュテーション呼び出しはホストプロキシから発信されます。セキュリティログ、エコシステムごとのインターセプトの詳細、これらのポリシーと組み合わさる侵害検出アラームについては、サプライチェーン保護の章を参照してください。