Record current sandbox quota verification

This commit is contained in:
Hamza Ayed
2026-10-03 19:37:11 +03:00
parent 0587347157
commit 379098f3d6
+1 -1
View File
@@ -109,7 +109,7 @@
5. أوامر تطوير: تشغيل أوامر محددة في بيئة معزولة وبمهلة وحدود موارد، ومع موافقة لكل أمر في البداية. (2026-10-03: تحقق Windows 10 Pro 19045، Intel i7-6600U مع virtualization firmware مفعّل، RAM 15.9GB والمتاح وقت القياس 5.2GB، و40.8GB مساحة فارغة على C:. لا يوجد `WindowsSandbox.exe` أو Docker. استعلاما WSL أعادا شاشة المساعدة فلم يثبتا توفر توزيعة. فحص Windows Sandbox يحتاج مسؤولًا؛ محاولة DISM مرتفعة الصلاحية انتهت بخطأ `0xc0000142` ولم تغيّر إعدادًا. أُعدّ prototype محلي بـAppContainer وJob Object (`scripts/appcontainer_probe.cpp`): 512 MiB، حد 8 عمليات، مهلة 30 ثانية، وإنهاء شجرة العمليات عند إغلاق الـJob. في تشغيل Windows بأذونات مناسبة نجح smoke test: `cmd.exe` عمل داخل الحاوية؛ مُنع من قراءة ملف Temp للمضيف ومن إنشاء ملف خارجه، بينما نجح في الكتابة والقراءة من مجلد العمل المعزول. نُسخ `README.md` من المشروع إلى الحاوية ثم استخدم `curl.exe file://` لنسخه منها؛ النسخة تطابقت بايتًا ببايت. اختُبر `curl.exe` داخل الحاوية (`--version` exit 0)، وفشل الوصول إلى `/health` على `127.0.0.1:8100` بمهلة curl 28 رغم نجاح endpoint من المضيف؛ هذا فحص اتصال محلي فقط، وليس اختبارًا للإنترنت العام. إعداد AppContainer بلا قدرات شبكية. الجلسة المقيدة لدى Codex فشلت في إنشاء الملف الشخصي بـ`0x80070005`، بينما نجح الفاحص عبر جلسة التنفيذ المسموحة؛ يحتوي `scripts/run_appcontainer_probe.ps1` على build وتشغيل وتنظيف مؤقت قابل للتكرار. ما زال هذا prototype غير مدمج في الوكيل ولا توجد أوامر عامة قابلة للتنفيذ. التالي: تجربة نسخ ملفات محددة وآمنة من مساحة يختارها المستخدم مع حدود حجم واستثناء الأسرار والروابط الرمزية، ثم إرجاع المخرجات/diff والتحقق من الموارد والمهلة، وبعدها دمج قائمة أوامر مسموحة وموافقة صريحة في API والواجهة. [AppContainer isolation](https://learn.microsoft.com/en-us/windows/win32/secauthz/appcontainer-isolation)، [تنفيذ AppContainer](https://learn.microsoft.com/en-us/windows/win32/secauthz/implementing-an-appcontainer)، [Job Objects](https://learn.microsoft.com/en-us/windows/win32/procthread/job-objects).)
- [x] تجهيز Snapshot محدود لملفات يختارها المستخدم (`app/execution_snapshot.py`): يفرض جذر workspace المعتمد للحساب، حتى 50 ملفًا، 512KB لكل ملف و10MB إجماليًا، ويقبل الامتدادات المدعومة فقط. يرفض المسارات المخفية/المستثناة/الخارجة، والروابط الرمزية، وأسماء أجهزة Windows المحجوزة، وأسماء الملفات/المحتوى التي تكشف مفاتيح معروفة أو قيم اعتماد مباشرة؛ وينسخ إلى مجلد مؤقت مع SHA-256 لكل ملف. 7 اختبارات snapshot و7 اختبارات workspace ناجحة (2026-10-03). فحص الأسرار محافظ وليس ماسحًا شاملًا ولا يغني عن المراجعة. مرّ الـSnapshot عبر driver تطوير تجريبي إلى broker، لكنه غير مربوط بعد بطلب API أو منتقي ملفات المستخدم.
- [x] تشغيل Python من ملفات Snapshot في AppContainer: نُسخت ملفات التشغيل القياسية وDLLs من Python 3.14 (33,627,970 بايت/631 ملفًا، دون `site-packages`)، وشغّل broker ملف `.py` الموجود داخل Snapshot وأعاد ملف نتيجة؛ تحقق الخروج `0`. يلتقط stdout/stderr عبر pipe ويخزن أول 64KB فقط: اختبار خرج 70KB أعاد 65,536 بايت وعلامة `truncated=true`. (2026-10-03: أعيد تشغيل probe كاملًا؛ fixture كتب بايتات stderr غير صالحة UTF-8، ونجح التحويل باستبدالها بـU+FFFD بدل فقد المخرجات. انتهى التشغيل `shell_exit=0`، وظلت نتيجة الملف داخل الحاوية.) الملف المشغل fixture فقط وليس كودًا اختاره المستخدم.
- [x] اختبار مراقبة مساحة بيانات الحاوية، لكن النتيجة **غير صالحة كحد تخزين يفرضه النظام**: في تجربة تشخيصية أقدم تجاوز القياس الهدف ووصل إلى نحو 176MiB. (2026-10-03: أُعيد الاختبار بكتابة متزامنة؛ أوقف الـbroker المهمة عند `ERROR_DISK_FULL`، لكنه رصد 134,273,312 بايت مقابل حد 134,217,728، أي تجاوزًا بنحو 55KB قبل الإيقاف. وُجد في تجربة سابقة تجاوز أكبر بنحو 645KB. هذا تحكم مراقب من العملية وليس حصة قرص صلبة، فلا يكفي لتشغيل شيفرة عامة متعددة المستخدمين.) قاس probe مالك ملف النتيجة داخل الحاوية: `python_result_owner_is_host_user_sid=true` و`python_result_owner_is_appcontainer_sid=false`؛ لذلك حصة NTFS حسب المستخدم ستجمع ملفات المستخدم المضيف أيضًا، ولا تعزل مساحة كل تشغيل. توثيق Microsoft يربط رسوم الحصة بـSID مالك الملف، ويشرح أن الحصة الصلبة تمنع مساحة إضافية عند بلوغها. إرفاق VHD يتطلب `SE_MANAGE_VOLUME_PRIVILEGE`؛ تجربة VHDX المؤقتة السابقة أُلغيت عند UAC، ومحاولة تشغيل PowerShell المرتفع أخيرًا فشلت بـ`0xc0000142` قبل إنشاء القرص؛ لم يتغير أي قرص. المسار التالي يحتاج خدمة/عامل مخصصًا بصلاحيات مضبوطة أو إعداد قرص محدود من مسؤول النظام؛ تبقى أوامر المستخدم العامة معطلة حتى يثبت عزل قابل لإعادة الاستخدام. [NTFS disk quotas](https://learn.microsoft.com/en-us/windows/win32/fileio/disk-quota-limits)، [AttachVirtualDisk privileges](https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-attachvirtualdisk).
- [x] اختبار مراقبة مساحة بيانات الحاوية، لكن النتيجة **غير صالحة كحد تخزين يفرضه النظام**: في تجربة تشخيصية أقدم تجاوز القياس الهدف ووصل إلى نحو 176MiB. (2026-10-03: كتابة متزامنة أوقفت العملية عند `ERROR_DISK_FULL` بعد رصد 134,273,312 بايت مقابل حد 134,217,728. إعادة تحقق على الحالة الحالية في 2026-10-03 تجاوزت الحد نفسه وسجلت 136,637,390 بايت، أي 2,419,662 بايت فوق الهدف قبل الإيقاف. توجد تجربة أقدم تجاوزت الهدف بنحو 645KB. هذه مراقبة دورية من broker وليست حصة قرص صلبة، فلا تكفي لتشغيل شيفرة عامة متعددة المستخدمين.) قاس probe مالك ملف النتيجة داخل الحاوية: `python_result_owner_is_host_user_sid=true` و`python_result_owner_is_appcontainer_sid=false`؛ لذلك حصة NTFS حسب المستخدم ستجمع ملفات المستخدم المضيف أيضًا، ولا تعزل مساحة كل تشغيل. توثيق Microsoft يربط رسوم الحصة بـSID مالك الملف، ويشرح أن الحصة الصلبة تمنع مساحة إضافية عند بلوغها. إرفاق VHD يتطلب `SE_MANAGE_VOLUME_PRIVILEGE`؛ تجربة VHDX المؤقتة السابقة أُلغيت عند UAC، ومحاولة تشغيل PowerShell المرتفع أخيرًا فشلت بـ`0xc0000142` قبل إنشاء القرص؛ لم يتغير أي قرص. فحص الحالة الحالية لم يجد `vmcompute`/`vmms` أو أدوات Hyper-V، وأوامر قراءة ميزات Windows فشلت بـCOMException. المسار التالي يحتاج تثبيت/تهيئة عزل نظامي أو عاملًا مخصصًا بحصة حقيقية؛ تبقى أوامر المستخدم العامة معطلة حتى يثبت حد قابل لإعادة الاستخدام. [NTFS disk quotas](https://learn.microsoft.com/en-us/windows/win32/fileio/disk-quota-limits)، [AttachVirtualDisk privileges](https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-attachvirtualdisk).
- [ ] إكمال الربط الإنتاجي بعد تأمين حصة تخزين يفرضها نظام التشغيل: endpoint مصادق عليه لخطة أمر allowlist وموافقة مرة واحدة مرتبطة بالمستخدم والمساحة والبصمات والمهلة؛ نسخ الملفات المحددة من API إلى broker، capture موحد وآمن للنتيجة، عرض الموافقة والحالة والمخرجات في Flutter، ومعاينة diff قبل أي تطبيق. prototype لم يُدمج في API أو الواجهة ولا يسمح حاليًا بتنفيذ أوامر المستخدم.
6. لا وصول عام إلى القرص، ولا أوامر مدمرة أو نشر خارجي دون موافقة صريحة. كل أداة لها مخطط مدخلات ومخرجات واختبارات وسجل تدقيق.