大規模言語モデル(LLM)が動作するコードを生成し、開発パイプラインやエージェントスタックに統合されるにつれて、次のようなリスクが高まっています。 隠されました or 悪意のある モデル出力に埋め込まれているか、Web ページやサードパーティのプラグインを介して挿入されているか、モデルのトレーニング中に導入されているかに関係なく、命令は、そのコードが実行されると安全でない動作を引き起こす可能性があります。
開発者コミュニティで広まっているユーザーレポートによると、あるソフトウェア開発者が壊滅的なデータ損失を経験した。 800GBのファイルが削除されましたなど、 CursorAIアプリケーション全体 — の支援を受けて生成されたコードを実行した後 ジェミニ3 内部で作業中 カーソルAI IDE開発者がコード生成に LLM を利用するケースが増えるにつれ、レビューされていないスクリプトや安全でないスクリプトの影響はより深刻になります。
したがって、LLM によって生成された危険なコードを検出して削除する方法を知ることは非常に重要です。
ChatGPT と LLM のコンテキストにおける「隠しコード」とは何ですか?
「隠されたコード」とはどういう意味でしょうか?
「隠しコード」とは、開発者が LLM が取り込んだり出力したりするテキスト (またはファイル) 内に埋め込まれた命令や実行可能なコンテンツを表すために使用する包括的な用語であり、次のようなものが含まれます。
- プロンプト形式の指示 ユーザー コンテンツ内に埋め込まれます (例: PDF に隠された「以前の指示は無視してください...」)。
- 目に見えない文字 または、トークンを隠したりトークン化の仮定を破ったりするために使用されるゼロ幅のスペース。
- エンコードされたペイロード (画像またはドキュメント内の base64、URL エンコードされたステガノグラフィック埋め込み)。
- 隠しHTML/JS または、下流のレンダラーによって解釈される可能性のある、フォーマットされたコンテンツに含まれるスクリプト ブロック。
- メタデータまたは注釈 (ファイル コメント、PDF 内の隠しレイヤー) は、検索システムまたはモデルに指示を与えます。
- 暗黙の行動 危険なAPIを使用する生成されたコードから発生するもの(例:
eval,exec,subprocess、ネットワーク/システム コールなど)を悪意のある意図でなくても実行することがあります。 - プロンプトに挿入された指示 攻撃者がプロンプトまたはコンテキストを操作したために、モデルが隠しコマンドやバックドアのようなロジックを含むコードを生成する原因となります。
これらの攻撃ベクトルは、しばしば 即注射 or 間接的な即時注入 モデルの挙動を変更することが目的の場合。セキュリティコミュニティは現在、プロンプトインジェクションをコアLLM脆弱性として扱っており、OWASPはこれをLLMリスクカテゴリとして正式に規定しています。
これは通常のマルウェアや XSS とどう違うのでしょうか?
違いは セマンティック レイヤー:プロンプトインジェクションは、ホストOSやブラウザのレンダリングエンジンではなく、モデルの命令に従う動作を標的とします。とはいえ、ウェブレンダラーで実行される隠されたHTMLやスクリプトは、依然として実行可能攻撃(XSSのような)であり、セマンティックレイヤーと実行レイヤーの両方を防御する必要があります。業界のリーダーや研究者は、プロンプトインジェクションを「最先端のセキュリティ課題」と呼び、緩和戦略を継続的に発表しています。
LLM が隠れたコードや危険なコードを生成できるのはなぜですか?
モデルの動作、トレーニングデータ、および指示コンテキスト
LLMは、与えられたコンテキストと指示に基づいて、妥当な継続を生成するように訓練されます。コンテキストに敵対的な手がかりが含まれている場合、またはユーザーがモデルに強力なアクションを実行するコードを要求した場合、モデルは微妙な動作や能動的な動作を含むコードを出力できます。
LLMは妥当だが安全ではないコードを生成する
LLMは流暢さと有用性を重視しており、破壊的な副作用がある場合の安全性を重視しているわけではありません。簡潔な rm -rf /path/to/dir or shutil.rmtree() 「クリーンアップ」を依頼された際に、ユーザーは自信たっぷりの言い回しで返答することが多いため、ユーザーは十分に精査することなく、そのまま真似をしてしまう可能性があります。この「自信過剰」の問題こそが、一見無害な依頼が危険なものになる理由です。
難読化ワークフローの自動化
脅威アクターは現在、LLM呼び出しを連鎖させることでコード難読化を自動化しています。1つのモデルがペイロードを生成し、別のモデルがそれをシグネチャ検出を回避するように再加工する、といった具合です。2025年の業界脅威レポートやベンダー分析では、この「AI支援による難読化」が新たな手法として記録されています。
モデル出力内の隠されたコードをどのように検出できますか?
クイックトリアージチェックリスト
- 見えない/異常なUnicodeをスキャンする (ゼロ幅結合子、ゼロ幅スペース、バイト オーダー マーク、非 ASCII ホモグリフ)。
- 静的解析/AST解析を実行する 強力なAPIの使用を特定する(
eval,exec,subprocess,os.system、反射的な呼び出し)。 - エンコードされたペイロードを探す (base64、16 進 BLOB、繰り返される長い文字列、または圧縮されたコンテンツ)。
- 難読化パターンを確認する (API名を構成する文字列連結、文字演算、
chr()チェーン)。 - 意味解析を使用する コードが実際に I/O、ネットワーク、またはファイルシステムの変更を実行するかどうかを確認します。
静的パターン検出(高速、最初の行)
- 言語を考慮した解析とリンティング。 生成された出力をすぐにコードブロックに解析し、散文にしない。フォーマッタとリンター(Black/Prettier、pylint、eslint)を実行する。リンタールールは、以下の使用をフラグ付けする。
eval,exec,rm -rf、生のサブプロセス呼び出し、またはコマンドを動的に構築するシェル パイプ。 - トークンおよび文字列パターン スキャナー。 高リスクのトークンとパターンを検索:
sudo、絶対パスのような/home/,C:\,rm -rf,shutil.rmtree,subprocess.Popen、インライン base64 blob、解釈できない長い文字列、およびインタープリターのコンテキストを切り替えるシバン。 - 秘密のスキャンと出所チェック。 ハードコードされた資格情報、信頼されていないレジストリを指す URL、または任意のソースからパッケージを動的に取得するコードを検出します。
静的分析では、多くの明らかな問題が迅速に検出され、CI ゲートの一部として実行するのに低コストです。
セマンティックおよびコンテキスト検出(より深い)
- 意図分析。 生成されたコードの意図を分類するために、セカンダリモデルまたはルールエンジンを使用します。「読み取り」、「書き込み」、「削除」、「ネットワーク」、「インストール」のどれですか?削除/書き込みに分類されたものはすべてエスカレーションをトリガーする必要があります。
- データフロー分析。 コードを解析し、検証されていないパスやユーザー指定のパスが破壊的なAPIにアクセスできないか検出します。例えば、LLM出力やリモートファイルから生成された変数が、後でシェルコマンドに連結されている場合は、フラグを設定します。
- 起源の相関関係。 会話、システムプロンプト、コンテキストページの完全な記録を保持してください。疑わしい出力が特定の外部ドキュメントまたはプラグイン呼び出しと相関している場合、プロンプトインジェクションまたは汚染されたコンテキストを示している可能性があります。
動的および行動検出(最も信頼性が高い)
- 監視付きのサンドボックス実行。 生成されたコードを、ネットワーク、ホストマウント、システムコールフィルタリング(seccomp)のない、厳密に制限された一時的な環境で実行します。ファイルシステムのアクティビティ、試行されたネットワーク呼び出し、プロセスの生成、異常なI/Oを監視します。
- カナリアテスト。 実際のデータで実行する前に、センチネル ファイルを含む合成ディレクトリに対してコードを実行し、削除または上書きを監視します。
- 行動ヒューリスティック。 親ディレクトリを横断するループ、深さチェックなしの再帰操作、または多くのファイルに損害を与える可能性のある名前変更パターン (同じファイル名を繰り返し書き込むなど) を探します。
動的分析は、難読化されたり、遅延されたり、実行時にのみトリガーされるペイロードを検出する唯一の方法です。
LLM 出力を実行する前に、隠しコードを削除または無効化するにはどうすればよいでしょうか?
防御的除去 vs. セマンティクスの変更
「隠しコードを削除する」には2つの目的があります。
- 消毒 — 明らかにコードではない、または疑わしいコンテンツ(非表示のUnicode、ゼロ幅文字、追加されたbase64ペイロードなど)を削除します。これにより、意図された安全なロジックが変更されることはありません。
- 中和 — 外部サービスを実行または呼び出すものについては、検証されるまでそれらの呼び出しを無効にするか、no-ops にします。
常に優先する 中和 + レビュー 盲目的な削除は避けるべきです。コードの一部を恣意的に削除すると、動作が壊れたり予期せぬ動作をする可能性があります。代わりに、疑わしい構造を、明示的にログに記録され、安全に失敗する(例外を発生させるか、安全なデフォルトを返す)スタブに置き換えてください。
ステップ1 - 生成されたコードを信頼できないデータとして扱う
ChatGPT(またはLLM)から取得したコードは、削除および強化パイプラインを経由せずに直接実行しないでください。このパイプラインはポリシーで強制適用し、CI/CDで自動化する必要があります。
ステップ2 - コードを抽出して正規化する
- テキストを正規化し、ゼロ幅の文字を削除しますU+200B、U+200C、U+200D、U+FEFFなどのゼロ幅/フォーマットコードポイント文字を削除します。監査のために、削除された内容をログに記録します。この手順により、視覚的なステルスに使用される多くの「隠された」エンコーディングが削除されます。
- コード以外のコンテキストをすべて削除する: ナラティブ、非表示のコメント、HTML/Markdownラッパーを削除します。言語フォーマッタ(Black、Prettier)を使用してコードを正規化することで、難読化された空白文字や制御文字を正規化します。
- これらの構造を持つコードを拒否または隔離する: ダイナミック
eval、生のサブプロセス呼び出し(os.system,subprocess.Popen)、インラインbase64 blobをデコードして実行したり、埋め込まれたりします#!インタープリタのコンテキストをシフトしようとするディレクティブ。 テキストを正規化し、ゼロ幅の文字を削除します
U+200B、U+200C、U+200D、U+FEFFなどのゼロ幅/フォーマットコードポイント文字を削除します。監査のために、削除された内容をログに記録します。この手順により、視覚的なステルスに使用される多くの「隠された」エンコーディングが排除されます。
ステップ3 - ASTに解析し、リスクのあるノードを置き換える
コードをASTに解析し、動的実行を呼び出すノードを見つけます(例: exec)、または関数名をプログラム的に構築するコードなど、不適切なコードがないか確認してください。これらを、「安全でない動的動作がブロックされました」という制御された例外を発生させる安全なスタブに置き換えてください。レビュー用に、AST で裏付けられたソースのサニタイズされたコピーを生成してください。セキュリティパターンチェック(環境に合わせたカスタム semgrep ルール)を実行してください。一致が見つかった場合は、マークを付けて無効化してください。
ステップ4 - 静的強化と書き換え
- 自動書き換え: 危険な呼び出しを安全なラッパーに置き換える自動サニタイザーを介してコードを渡す — 例:
os.system()/subprocessタイムアウトとネットワーク ブロックを適用する、承認済みのサンドボックス化されたエグゼキューターを使用します。 - 能力ゲーティングAPIキー、トークン、特権エンドポイントへの呼び出しを変更または削除し、ローカルテスト用にモックアダプターに置き換えます。シークレットやURLが誤って含まれてしまうのを防ぎます。
- 依存関係の書き換え: ブロックダイナミック
pip/npmコードによって作成されたインストール。依存関係はレジストリ経由で宣言および承認される必要があります。
ステップ5 - 積極的なサンドボックス内で実行する
- 一時コンテナ / マイクロVM: ネットワークに接続できず、ホストの認証情報にアクセスできず、ファイルシステムへのアクセスも制限されているコンテナ/VMでコードを実行します。gVisor、Firecracker、専用の一時実行サービスなどのテクノロジーが適しています。コードがI/Oにアクセスする必要がある場合は、ポリシーを適用するプロキシを使用してください。
- システムコールフィルタとseccomp: 許可されるシステムコールを制限します。一時ディレクトリ外へのファイル書き込みはブロックされます。
- リソース/時間制限: CPU/メモリ/時間の制限を設定し、論理爆弾であっても無期限に実行できないようにします。
サンドボックス実行と監視を組み合わせることで、静的チェックでは見逃されるペイロードを発見できる場合が多くあります。業界のガイダンスや最近のホワイトペーパーでは、サンドボックス化を中核的な緩和策として推奨しています。
パイプラインにはどのような自動化ツールとルールが必要ですか?
推奨ツールチェーンコンポーネント
- Unicode衛生モジュール (カスタムまたは既存のライブラリ)。正規化された文字をログに記録する必要があります。
- パーサー + AST アナライザー 各ターゲット言語(Python
ast,typed-ast、JavaScript パーサー、Java パーサー)。 - 静的解析ツール / SAST: Bandit (Python)、Semgrep (複数言語、カスタマイズ可能)、セキュリティ プラグイン付き ESLint。
- エントロピーとデコーダーのヒューリスティック: base64/hex/gzip を検出し、検査にルーティングします。
- サンドボックスランタイム: 厳密な seccomp/AppArmor プロファイルを持つ最小限のコンテナー、またはシステムコールが無効になっている言語レベルのインタープリター。
- ポリシー執行者: 許可されたモジュール、許可されたエンドポイント、および安全な API ラッパーを決定するコンポーネント。
- 監査証跡: 元の出力、サニタイズされた出力、差分、および決定を記録する不変のログ。
semgrep パターンの例(概念)
危険な関数の使用を警告する、簡潔で保守的なルールを使用してください。例えば、
- フラグ
eval,exec,Functionコンストラクター (JS)、動的インポート、または文字列で構築された API 名。 - 許可リスト外のネットワーク呼び出しにフラグを立てる(例:
requests.get不明なホストへ)。 - 機密パスへの書き込みフラグ(
/etc、システム フォルダー) またはプロセスの生成。
(これらを組織ごとの構成項目として保持し、時間をかけて強化します。)
実用的なサニタイズ スニペット (安全な例) とは何ですか?
以下は、危険ではない、応用できる防御の例です。 サニタイズと検出 スニペットです。エクスプロイトの手順ではありません。
例: ゼロ幅文字を削除する (Python、防御的)
import re
ZERO_WIDTH_RE = re.compile(r'')
def strip_zero_width(s: str) -> str:
cleaned = ZERO_WIDTH_RE.sub('', s)
return cleaned
これにより、攻撃者がコードを隠すためによく使用する文字が削除されます。削除された内容は常にログに記録し、削除は監査証跡の一部として扱うようにしてください。
例: AST の解析と検査 (Python、概念)
import ast
def has_dynamic_exec(source: str) -> bool:
tree = ast.parse(source)
for node in ast.walk(tree):
if isinstance(node, ast.Call):
if getattr(node.func, 'id', '') in ('eval', 'exec',):
return True
if isinstance(node, ast.Attribute):
if getattr(node, 'attr', '') in ('popen', 'system'):
return True
return False
If has_dynamic_exec True を返す場合、コードを実行せず、代わりに動的ノードを安全なスタブに置き換えてレビューを要求します。
注: これらの例は本質的に防御的なものです。パイプラインからログ記録、監査、または人間によるレビューを削除しないでください。
まとめ: LLMの出力は常に信頼できないコードのように扱う
LMは強力な生産性ツールです。洗練されたコードを作成し、ドラフトを加速し、定型業務を自動化できます。しかし、LMが実際に実行される場面では、セキュリティのルールが変わります。 モデル出力は信頼できないアーティファクトとして扱う必要がある過去18~30か月間に行われた迅速なインジェクション、バックドア調査、そして現実世界の脆弱性開示の組み合わせは、リスク表面が拡大し、今後も進化し続けるという明確な点を示しています。
解析、静的解析、サンドボックス化された動的テスト、ガバナンス、継続的なレッドチーム演習を組み合わせた実用的な防御策は、ほとんどの攻撃を阻止できます。しかし、チームは組織的な統制にも投資する必要があります。最小権限、出所の特定、そしてLLMの出力は検証が必要であることを前提とする文化です。業界では、これらのパターンを容易にするためのツールやフレームワークが構築されています。また、上記のチェックリストを採用することで、隠されたペイロードが漏れる可能性を低減できます。
開発者は、次のような最新のLLM APIにアクセスできます。 クロード・ソネット 4.5 API および Gemini 3 Pro プレビュー CometAPI経由など、 最新モデルバージョン 公式ウェブサイトで常に更新されています。まずは、モデルの機能について調べてみましょう。 プレイグラウンド そして相談する APIガイド 詳細な手順についてはこちらをご覧ください。アクセスする前に、CometAPIにログインし、APIキーを取得していることを確認してください。 コメットAPI 統合を支援するために、公式価格よりもはるかに低い価格を提供します。
準備はいいですか?→ 今すぐCometAPIに登録しましょう !


