الانتقال إلى المحتوى الرئيسي

الوصول الكامل إلى القرص هو وحدة الثقة الخاطئة للوكلاء

يتعامل macOS مع الوصول الكامل إلى القرص كمنحة ثنائية دائمة لكل ملف تنفيذي. أما أحمال عمل الوكلاء فهي ظرفية ومُعرَّفة وقت التشغيل، لذا ينبغي أن تكون الثقة محدودة النطاق لكل مهمة.

صورة مقرّبة للوحة دارات تُظهر المسارات ونقاط اللحام والمكوّنات السطحية بعمق ميدان ضحل.

المنحة أوسع من المهمة

الوصول الكامل إلى القرص (FDA) على macOS هو منحة TCC (الشفافية والموافقة والتحكم) واحدة ترفع حواجز القراءة في البيئة المعزولة عبر دليل المستخدم بأكمله. عملياً، تغطي موافقة واحدة مخزن Mail، وأدلة ملفات تعريف Safari وChrome، وسلسلة مفاتيح تسجيل الدخول، وقاعدة بيانات Messages، وأي بيانات اعتماد للمطورين موجودة في ~/.aws أو ~/.ssh أو ~/.config. يرى المستخدم مربع حوار واحداً ومفتاح تبديل واحداً. ويرى النظام بتاً واحداً.

هذا البت دائم. يبقى بعد إعادة التشغيل، وينطبق على كل استدعاء مستقبلي للملف التنفيذي الموقَّع، ولا يضيق بحسب طريقة تشغيل العملية. الوكيل الذي احتاج قراءة مجلد مشروع واحد يوم الثلاثاء لا يزال يحمل المنحة نفسها يوم الجمعة عندما يُطلب منه تلخيص ملف PDF من دليل التنزيلات.

أحمال عمل الوكلاء ظرفية. للتشغيل بداية وخطة ومجموعة من استدعاءات الأدوات ونهاية. والفجوة بين ما يحتاجه التشغيل وما تسمح به المنحة هي سطح الخطر، وعلى macOS هذه الفجوة هي حالياً دليل المستخدم بأكمله.

لماذا لا يناسب نموذج التطبيق

تتمتع تطبيقات macOS التقليدية بمجموعة ميزات مستقرة وقابلة للتدقيق. محرر الصور يقرأ الصور. وعميل البريد يقرأ مخزن البريد. ويستطيع المراجعون الاستدلال على الإذن لأن السلوك محدود بغرض المنتج.

أما مجموعة قراءات الوكيل فيحددها المخطِّط وقت التشغيل. الملف التنفيذي نفسه، عند استدعائه مرتين، يمكنه قراءة جدول بيانات في جلسة وملف سلسلة مفاتيح في الجلسة التالية، لأن الخطة تُولَّد من الأمر ومن البيئة. ولا يوجد بيان ثابت يصف ما ستلمسه العملية.

Wide corridor with white tiled walls and floor, black wooden doors and built-in shelves

هذا يغيّر نمط فشل حقن الأوامر. في تطبيق تقليدي، قد يتسبب الحقن في مخرجات سيئة. أما في وكيل يحمل FDA، فيحوّل الحقن منحة مشروعة إلى مسار تسريب دون أي تصعيد للامتيازات: النموذج مُصرَّح له أصلاً بقراءة بيانات الاعتماد، وأداة الشبكة مُصرَّح لها أصلاً بإرسال البايتات. لا يحتاج المهاجم إلى كسر البيئة المعزولة؛ بل يحتاج إلى توجيه الخطة.

وفي الوقت نفسه، يُطلب من المستخدم الاستدلال على مربع حوار يقول "الوصول إلى جميع الملفات" بينما المهمة هي "تلخيص هذا المجلد". لا يستطيع مربع الحوار التعبير عن المهمة لأن نظام التشغيل لا يعرف المهمة. لذا فالموافقة غير مستنيرة بالمعنى المحدد الذي يهم: فهي ليست محدودة النطاق بالقرار الذي يتخذه المستخدم فعلاً. وقد ركّزت التغطية على تشديد Apple لهذه الضوابط على تجربة مطوّري التطبيقات (The Verge، TechCrunch)؛ أما حالة الوكيل فمختلفة بنيوياً لأن الكيان الطالب ليس مجموعة ميزات ثابتة.

بديل محدود النطاق بالمهمة

ينبغي أن ينتقل الضابط من إذن نظام ثنائي إلى عقد قدرات محدود النطاق بالمهمة. تصبح منحة نظام التشغيل سقفاً؛ ويصبح إطار عمل الوكيل نقطة الإنفاذ التي تضيّقه.

آلية ملموسة: إصدار مقبض محدود النطاق لكل تشغيل. المقبض سجل صغير بأربعة حقول.

  • المسارات. قائمة سماح صريحة بالأدلة أو الملفات، تُحلّ وقت التخطيط لا وقت المنح. تُحلّ الروابط الرمزية ويُفحص المسار المحلول.
  • النافذة الزمنية. انتهاء بوقت الحائط. بعده يصبح المقبض خامداً حتى لو كانت العملية لا تزال حية.
  • ميزانية البايتات. حد أقصى تراكمي للقراءة. عند استنفاد الميزانية، تفشل القراءات الإضافية بشكل مغلق بدلاً من الاقتطاع الصامت.
  • الحالة النهائية. قاعدة الإبطال عند الإكمال. عندما يبلغ التشغيل حالة نهائية (نجاح، فشل، مهلة، إلغاء)، يُدمَّر المقبض ويُختم سجل التدقيق.
handle = broker.issue(
    paths=["~/work/reports/q3"],
    ttl_seconds=600,
    byte_budget=64 * ![Close-up of buttons and control indicators on a black electronic device](/media/control-panel-buttons-macro-b39724-755d22.jpg)led"],
)

![Server racks network](/media/server-racks-network-7e7030-cc721c.jpg)

# every read goes through the handle, not the filesystem
blob = handle.read("~/work/reports/q3/summary.md")

تُسجَّل كل قراءة عند حدود المقبض، ما يجعل مسار التدقيق لكل مهمة بدلاً من لكل ملف تنفيذي. وعندما يحدث خطأ، يكون لسؤال "ما الذي لمسه هذا التشغيل" جواب مباشر بدلاً من إعادة بناء من قياسات على مستوى العملية.

المقايضة حقيقية وتستحق الذكر صراحةً. الوسيط الذي يتوسط القراءات يضيف مكوّناً يمكن أن يفشل، وميزانية بايتات ضيقة جداً ستُجهض مهاماً مشروعة طويلة الأمد. لذا يجب أن يعرض الإطار الميزانية للمخطِّط حتى يستطيع الوكيل طلب تمديد قبل أن يصطدم بالحد، بدلاً من اكتشاف الحد كاستثناء في منتصف التشغيل. هذه أجزاء متحركة أكثر من مفتاح TCC واحد، وهي كلفة جعل الإذن ذا معنى.

ما يعنيه هذا لمطوّري وكلاء macOS

صمّم لعالم تُثبَّط فيه المنحة الواسعة. فضّل منتقيات المستندات، والإشارات المرجعية محدودة النطاق أمنياً، والمنح لكل دليل على موافقة FDA واحدة. الإشارة المرجعية التي تشير إلى مجلد واحد قدرة أضيق من قراءة تشمل دليل المستخدم بأكمله، ويمكن حفظها وإعادة التحقق منها في كل تشغيل.

افترض أن المنحة ستكون مرئية للمستخدم في إشعار، واجعل ذلك الإشعار ذا معنى. إذا أظهر النظام "هذا الوكيل قرأ قاعدة بيانات Messages الخاصة بك"، فينبغي أن يستطيع الوكيل تحديد المهمة التي سببت ذلك والغرض الذي استُخدمت فيه البيانات. الإشعار الذي لا يستطيع المستخدم التصرف بناءً عليه يدرّبه على تجاهل الإشعارات، ما يضعف الضابط لكل تطبيق آخر.

خطّط للإبطال في منتصف التشغيل. يمكن أن ينتهي مقبض، أو تتقادم إشارة مرجعية، أو يطفئ المستخدم المنحة بينما الوكيل يعمل. ينبغي أن يكون الوكيل قابلاً للاستئناف لا قاتلاً: خزّن الخطة نقطة تفتيش، وحدّد الخطوة التي فقدت قدرتها، ثم إما اطلب مقبضاً جديداً بنطاق أضيق أو توقف بنظافة مع نتيجة جزئية. التعامل مع الإبطال كانهيار يحوّل ضابطاً أمنياً إلى حادثة موثوقية، وهكذا تُعطَّل الضوابط.

النقطة الأوسع هي أن وحدة الثقة ينبغي أن تطابق وحدة العمل. تشغيل الوكيل هو وحدة العمل. أما عمر الملف التنفيذي فليس كذلك. وإلى أن يعكس نموذج الإذن ذلك، فإن كل وكيل على macOS يبعد عن قراءة أكثر مما تطلبه مهمته يوماً ما بحقنة أوامر واحدة.

مشاركةXLinkedInرابط دائم5 دقيقة قراءة

قراءات ذات صلة

الأسئلة التي يجيب عنها هذا

Why is Full Disk Access a poor fit for agent workloads?

FDA is a single durable grant that applies to every future run of a signed binary and covers mail stores, browser profiles, keychains, message databases and developer credentials at once. Agent runs are episodic and their read set is decided at runtime by a planner, so the grant is almost always wider than the task.

How does prompt injection change the risk profile?

With FDA already granted, an injected instruction does not need to escalate privileges. The agent is already authorised to read credentials and to use a network tool, so steering the plan is enough to turn a legitimate grant into an exfiltration path.

What does a task-scoped handle contain?

An explicit path allowlist resolved at plan time, a wall-clock expiry, a cumulative byte budget, and a revoke-on-completion rule that destroys the handle and seals the audit record when the run reaches a terminal state.

What is the main trade-off of a capability broker?

It adds a mediating component that can fail, and a byte budget that is too tight will abort legitimate long-running jobs. The planner needs visibility into the budget so it can request an extension before hitting the limit, rather than failing mid-run.

How should agents handle revocation mid-run?

Treat it as a resumable state, not a crash. Checkpoint the plan, mark the step that lost its capability, and either request a narrower handle or stop cleanly with a partial result. Controls that cause reliability incidents tend to get disabled.