العودة إلى التحديثات
UpdatedAug 8, 2026

foxcage — Updated!

شغّل Firefox في حاوية Podman rootless مع إسقاط الصلاحيات (capabilities)، وعزل الشبكة، وتخزين مؤقت (ephemeral) لاحتواء محاولات الهروب من بيئة العزل (sandbox) ومنع اختراق المضيف.

مشاركة

foxcage icon foxcage

قم بتشغيل Firefox في حاوية Podman بدون صلاحيات الجذر لعزل الأمان. يعمل متصفحك بدون أي صلاحيات Linux تقريبًا، في مساحة مستخدم وشبكة خاصة به، معزولًا عن المضيف — بينما لا يزال يتمتع بتسريع GPU كامل، وصوت، ودعم DRM.

لماذا foxcage؟

يمتلك Firefox بالفعل صندوق رمل متعدد العمليات يعزل عارضات محتوى الويب باستخدام مساحات أسماء Linux وseccomp-bpf. بالنسبة لمعظم التهديدات، هذا فعال. يضيف foxcage جدارًا ثانيًا: إذا استغل مهاجم ثغرة تهرب من صندوق رمل Firefox (وهذا يحدث — توجد CVEs لهذا)، فسيستقر داخل حاوية مقفلة بدلاً من جلسة المستخدم الكاملة.

ما يحمي منه foxcage

  • الوصول إلى الملفات بعد الاستغلال. الهروب من صندوق الرمل على Firefox العاري يمنح الوصول إلى كل ما يمكن لمستخدمك قراءته: ~/.ssh، ~/.gnupg، ملفات تعريف المتصفح للمتصفحات الأخرى، قواعد بيانات مدير كلمات المرور، المستندات، الكود المصدري. في foxcage، يرى المهاجم فقط ما قمت بتركيبه صراحةً.
  • بقايا التتبع على القرص. قفص @tmp المؤقت لا يترك أي أثر على القرص بعد إغلاق النافذة — بما في ذلك الإضافات، حالة HSTS، ذاكرة التخزين المؤقت لجلسة TLS، وذاكرة التخزين المؤقت لـ DNS التي لا يزال Firefox في التصفح الخاص يحتفظ بها. تعمل أقفاص @tmp المتعددة بشكل متزامن دون التداخل مع بعضها البعض.
  • الاستمرارية. على Firefox العاري، يمكن للبرمجيات الخبيثة الكتابة إلى ~/.config/autostart، ~/.bashrc، cron، أو أي مكان آخر للبقاء بعد إعادة التشغيل. الحاوية المؤقتة لـ foxcage (--rm) تعني أن لا شيء يستمر ما لم تقم بتركيبه عبر bind.
  • الحركة الجانبية في الشبكة. افتراضيًا، لا يمكن للحاوية فحص الخدمات على localhost. على Firefox العاري، يمتلك هروب صندوق الرمل وصولًا كاملًا للشبكة. (استخدم [network] mode = "host" إذا كان القفص يحتاج وصولًا إلى localhost، مثل التطوير المحلي — ولكن راجع التحذير تحت "الشبكات": وضع المضيف يكشف أيضًا مآخذ Unix المجردة للمضيف.)
  • تصعيد الامتيازات. تسقط الحاوية جميع صلاحيات Linux باستثناء CAP_SYS_CHROOT وتمنع اكتساب امتيازات جديدة. ثنائيات Setuid، استغلالات النواة عبر استدعاءات النظام الغامضة، ومسارات التصعيد المماثلة مقطوعة.

ما لا يحمي منه foxcage

  • الهجمات على مستوى المتصفح. التصيد، الإضافات الخبيثة، وأي شيء يعمل ضمن الوظائف الطبيعية لـ Firefox غير متأثر — يعزل foxcage الحاوية عن المضيف، وليس المستخدم عن المتصفح.
  • الدلائل المثبتة عبر bind. أي شيء تقوم بتركيبه (profile، downloads_dir، تركيبات bind إضافية) يمكن الوصول إليه بالكامل من قبل متصفح مخترق. إذا قمت بتركيب دليل ملف تعريف مضيف، يمكن للمهاجم العبث به تمامًا كما هو الحال على Firefox العاري.
  • التقاط الصوت عبر PulseAudio. يتم تركيب مأخذ PulseAudio في الحاوية عبر bind. على الرغم من تركيبه للقراءة فقط على مستوى نظام الملفات، فإن مآخذ Unix domain ثنائية الاتجاه — يمكن لعملية مخترقة إرسال طلبات تسجيل عبر المأخذ. يمكن لهروب صندوق رمل المتصفح تسجيل الصوت من ميكروفون المضيف.
  • استغلالات Wayland compositor. يتم تمرير مأخذ Wayland. تعزل Wayland compositors العملاء عن بعضهم البعض حسب التصميم، لكن ثغرة في compositor نفسه ستكون قابلة للوصول.

التكوين الأمني

تعمل الحاوية مع:

  • جميع صلاحيات Linux مسقطة (فقط CAP_SYS_CHROOT يُعاد إضافتها لصندوق رمل محتوى Firefox؛ CAP_SETUID/CAP_SETGID تُضاف مؤقتًا عند تكوين init.root)
  • no-new-privileges لمنع تصعيد الامتيازات
  • مساحة مستخدم بدون جذر (--userns keep-id)
  • /dev/shm خاص (غير مشترك مع المضيف) — حجم قابل للتكوين عبر shm_size
  • شبكات معزولة عبر pasta مع حظر loopback المضيف افتراضيًا
  • DNS يستخدم DNS المضيف افتراضيًا (قابل للتكوين عبر network.dns)
  • فقط مآخذ محددة من XDG_RUNTIME_DIR تُركب عبر bind (Wayland، PulseAudio، PipeWire، ووكيل D-Bus المفلتر) — دليل وقت التشغيل الكامل للمضيف لا يُكشف أبدًا
  • الوصول إلى ناقل جلسة D-Bus للمضيف يتم دائمًا عبر وسيط xdg-dbus-proxy مفلتر يعمل على المضيف. فقط org.freedesktop.Notifications، org.freedesktop.portal.Desktop، org.mozilla.*، و(للفروع) مساحة اسم الفرع نفسه (مثل org.librewolf.*) قابلة للوصول — خدمات الجلسة مثل keyring ووكيل SSH/GPG محظورة
  • الوصول إلى البوابة واسع. يُسمح بـ org.freedesktop.portal.Desktop ككل، لأن هذه هي طريقة عمل منتقي الملفات، "فتح الرابط في تطبيق آخر"، ومشاركة الشاشة. كما يكشف RemoteDesktop (لوحة مفاتيح/فأرة اصطناعية للجلسة بأكملها)، Camera و Location. تلك محكومة بحوارات الموافقة الخاصة بسطح المكتب لديك وليس بواسطة foxcage — ويشبه موجه RemoteDesktop موجه مشاركة الشاشة، لذا اقرأ حوارات الموافقة قبل قبولها. لا يمتلك xdg-dbus-proxy قاعدة "رفض واجهة واحدة"، لذا تضييق هذا يعني تعداد كل واجهة يحتاجها Firefox؛ راجع docs/DESIGN.md لمعرفة لماذا لا يتم ذلك افتراضيًا
  • جميع تركيبات bind (profile، downloads_dir، تركيبات [mounts] bind الإضافية) تستخدم nosuid,noexec
  • تنزيل المتصفح يتم التحقق منه مقابل توقيعات GPG: Firefox مقابل مجاميع SHA-512 الموقعة من Mozilla، وLibreWolf مقابل التوقيع المنفصل لمشرفي LibreWolf بالإضافة إلى SHA-256 المرتبط. التحقق أكثر صرامة من gpg --verify، الذي يخرج بـ 0 لتوقيع مصنوع بمفتاح ملغى ولأي مفتاح في keyring. يتطلب foxcage أيضًا أن تتصل السلسلة بالمفتاح الأساسي المثبت، ويرفض أي إصدار موقع بمفتاح فرعي ألغى مالكه كونه مخترقًا — راجع مفاتيح التوقيع الملغاة
  • حاوية مؤقتة (--rm) — تُفقد كتابات نظام الملفات عند الخروج
  • لا توجد أجهزة مضيفة (كاميرا ويب، مفاتيح أمان، طابعات) تُمرر ما لم يتم تمكينها صراحةً

كل خيار [network] و [mounts] تقوم بتمكينه يقايض بعض العزل من أجل الراحة. الافتراضيات هي التكوين الأكثر تقييدًا الذي لا يزال يمنحك متصفحًا قابلاً للاستخدام.

المتطلبات

  • Python 3.11+
  • Podman (بدون جذر)
  • Wayland compositor (X11 غير مدعوم)
  • pasta (sudo apt install passt) — ما لم يكن network.mode = "host"
  • xdg-dbus-proxy (sudo apt install xdg-dbus-proxy)
  • PulseAudio أو PipeWire مع توافق PulseAudio (للصوت)
  • GPU مع دعم DRI — اختياري؛ بدون /dev/dri يحذر foxcage ويعرض Firefox برمجيًا. يتم تثبيت برامج تشغيل VA-API لـ Intel وAMD وnouveau في الصورة، لذا يعمل فك تشفير الفيديو عبر الأجهزة بدون حزم برامج تشغيل المضيف — راجع فك تشفير الفيديو عبر الأجهزة

شغّل foxcage كمستخدم سطح مكتب عادي، وليس كجذر أو عبر sudo — يقوم الصندوق الرملي بتعيين مستخدمك في الحاوية، والتشغيل كجذر يزيل العزل الذي يوجد foxcage لتوفيره. يرفض البدء كجذر.

البيئة المختبرة: Debian 13 (Trixie) مع GNOME 3. قد تعمل توزيعات Linux الأخرى وWayland compositors الأخرى ولكن لم يتم اختبارها.

التثبيت

foxcage هو سكربت Python واحد بدون تبعيات خارج المكتبة القياسية لـ Python. انسخه إلى دليل في PATH الخاص بك:```sh sudo cp foxcage /usr/local/bin/foxcage

أو للتثبيت المحلي للمستخدم:```sh
cp foxcage ~/.local/bin/foxcage

تأكد من أن السكربت قابل للتنفيذ (chmod +x foxcage).

تحقق من الإصدار الذي لديك باستخدام foxcage --version — مفيد عند الإبلاغ عن مشكلة، حيث يتم تثبيت foxcage عن طريق نسخ ملف واحد.

الاستخدام```sh

./foxcage

عند التشغيل الأول، يقوم السكربت ببناء صورة الحاوية (يقوم بتنزيل Firefox من Mozilla، وتثبيت الحد الأدنى من تبعيات Debian) ثم يبدأ تشغيل Firefox. في عمليات التشغيل اللاحقة، يتحقق foxcage من تحديثات Firefox ويعيد بناء الصورة تلقائيًا عند توفر إصدار جديد. كما يتم إعادة بناء الصورة بشكل دوري (كل 7 أيام افتراضيًا) لالتقاط تحديثات حزم النظام. إذا فشل فحص التحديث (خطأ في الشبكة، انتهاء المهلة)، يتم تسجيل تحذير واستخدام الصورة الموجودة — لا يتم حظر بدء التشغيل أبدًا.

مرر الوسائط إلى Firefox:```sh
./foxcage https://example.com

اجمع قفصًا مسمّىً مع أعلام Firefox:```sh ./foxcage @work --kiosk https://example.com

إذا كان القفص (cage) يعمل بالفعل، يُفتح الرابط في تبويب جديد داخل المتصفح الموجود بدلاً من تشغيل حاوية ثانية. تشغيل `foxcage` (أو `foxcage @cage`) بدون رابط ضد قفص يعمل يخرج بنجاح مع رسالة "القفص يعمل بالفعل" — لا يمكن لـ foxcage رفع نافذة Wayland موجودة من خارج الحاوية، لذلك لا يحاول ذلك.

لا تنطبق خيارات التشغيل لكل إطلاق (**per-launch flags**) عندما يكون القفص يعمل بالفعل. يتم استهلاك `--dns` و`--ipv4-only` و`--lifetime` و`--color` و`--fork` عند بدء تشغيل الحاوية، ولا يمكن تغيير إعدادات الحاوية قيد التشغيل من الخارج، لذلك يتم تجاهلها مع تحذير. أغلق القفص وأعد تشغيله لتطبيقها.

الفئات