Ana içeriğe geç

Full Disk Access, agent'lar için yanlış güven birimidir

macOS, Full Disk Access'i ikili dosya başına kalıcı ve ikili bir yetki olarak ele alır. Agent iş yükleri ise dönemseldir ve çalışma zamanında tanımlanır; bu yüzden güven her görev için kapsamlandırılmalıdır.

Sığ alan derinliği altında izleri, lehim bağlantılarını ve yüzeye monte bileşenleri gösteren bir devre kartının makro fotoğrafı.

Yetki, görevden daha geniş

macOS'ta Full Disk Access (FDA), sandbox'ın okuma bariyerlerini tüm home dizini boyunca kaldıran tek bir TCC (Transparency, Consent, and Control) yetkisidir. Pratikte tek bir onay; Mail deposunu, Safari ve Chrome profil dizinlerini, login keychain'i, Messages veritabanını ve ~/.aws, ~/.ssh ya da ~/.config altında duran tüm geliştirici kimlik bilgilerini kapsar. Kullanıcı tek bir diyalog ve tek bir anahtar görür. Sistem tek bir bit görür.

Bu bit kalıcıdır. Yeniden başlatmalara dayanır, imzalı ikili dosyanın gelecekteki her çağrısına uygulanır ve sürecin nasıl başlatıldığına göre daraltılmaz. Salı günü tek bir proje klasörünü okuması gereken bir agent, Cuma günü bir indirme dizinindeki PDF'i özetlemesi istendiğinde hâlâ aynı yetkiye sahiptir.

Agent iş yükleri dönemseldir. Bir çalışmanın başlangıcı, bir planı, bir dizi tool call'ı ve bir sonu vardır. Çalışmanın ihtiyaç duyduğu şey ile yetkinin izin verdiği şey arasındaki fark risk yüzeyidir ve macOS'ta bu fark şu anda tüm home dizinidir.

Uygulama modeli neden uymuyor

Klasik macOS uygulamalarının sabit ve denetlenebilir bir özellik kümesi vardır. Bir fotoğraf düzenleyici görüntüleri okur. Bir mail istemcisi mail deposunu okur. İnceleyiciler izin hakkında akıl yürütebilir çünkü davranış ürünün amacıyla sınırlıdır.

Bir agent'ın okuma kümesi çalışma zamanında bir planner tarafından belirlenir. Aynı ikili dosya, iki kez çağrıldığında bir oturumda bir elektronik tabloyu, sonrakinde bir keychain dosyasını okuyabilir; çünkü plan prompt'tan ve ortamdan üretilir. Sürecin neye dokunacağını tanımlayan statik bir manifest yoktur.

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

Bu, prompt injection'ın başarısızlık modunu değiştirir. Geleneksel bir uygulamada injection kötü bir çıktıya yol açabilir. FDA'ya sahip bir agent'ta injection, herhangi bir yetki yükseltmesi olmadan meşru bir yetkiyi bir sızdırma yoluna dönüştürür: model zaten kimlik bilgilerini okumaya yetkilidir ve ağ aracı zaten byte göndermeye yetkilidir. Saldırganın sandbox'ı kırması gerekmez; planı yönlendirmesi yeterlidir.

Bu arada kullanıcıdan, görev "bu klasörü özetle" iken "tüm dosyalara erişim" diyen bir diyalog hakkında akıl yürütmesi istenir. Diyalog görevi ifade edemez çünkü işletim sistemi görevi bilmez. Dolayısıyla onay, önemli olan o özel anlamda bilinçsizdir: kullanıcının gerçekte verdiği karara kapsamlandırılmamıştır. Apple'ın bu kontrolleri sıkılaştırmasına ilişkin haberler uygulama geliştirici deneyimine odaklanmıştır (The Verge, TechCrunch); agent durumu yapısal olarak farklıdır çünkü istekte bulunan varlık sabit bir özellik kümesi değildir.

Göreve kapsamlandırılmış bir alternatif

Kontrol, ikili bir işletim sistemi izninden göreve kapsamlandırılmış bir yetenek sözleşmesine taşınmalıdır. İşletim sistemi yetkisi bir tavan hâline gelir; agent framework'ü onu daraltan uygulama noktası olur.

Somut bir mekanizma: çalışma başına kapsamlandırılmış bir handle verin. Handle, dört alanlı küçük bir kayıttır.

  • Yollar. Plan zamanında çözümlenen, yetki zamanında değil, açık bir dizin veya dosya allowlist'i. Symlink'ler çözümlenir ve kontrol edilen şey çözümlenmiş yoldur.
  • Zaman penceresi. Bir duvar saati sona erme süresi. Sonrasında, süreç hâlâ canlı olsa bile handle etkisizdir.
  • Byte bütçesi. Kümülatif bir okuma üst sınırı. Bütçe tükendiğinde, sonraki okumalar sessizce kesmek yerine fail closed yapar.
  • Terminal durumu. Tamamlanınca iptal etme kuralı. Çalışma bir terminal duruma ulaştığında (başarı, başarısızlık, zaman aşımı, iptal), handle yok edilir ve denetim kaydı mühürlenir.
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)

# her okuma dosya sisteminden değil, handle üzerinden geçer
blob = handle.read("~/work/reports/q3/summary.md")

Her okuma handle sınırında günlüğe kaydedilir; bu da denetim izini ikili dosya başına değil görev başına yapar. Bir şeyler ters gittiğinde, "bu çalışma neye dokundu" sorusunun süreç düzeyindeki telemetriden yeniden inşa edilmesi yerine doğrudan bir yanıtı olur.

Ödünleşim gerçektir ve açıkça belirtilmeye değer. Okumalara aracılık eden bir broker, başarısız olabilecek bir bileşen ekler ve çok dar bir byte bütçesi meşru uzun süreli işleri iptal eder. Bu nedenle framework, bütçeyi planner'a açmalıdır ki agent sınıra çarpmadan önce bir uzatma talep edebilsin, sınırı çalışma ortasında bir istisna olarak keşfetmesin. Bu, tek bir TCC anahtarından daha fazla hareketli parça demektir ve izni anlamlı kılmanın bedeli budur.

Bunun macOS agent geliştiricileri için anlamı

Geniş yetkinin caydırıldığı bir dünya için tasarlayın. Tek bir FDA onayı yerine belge seçicileri, security-scoped bookmark'ları ve dizin başına yetkileri tercih edin. Tek bir klasöre işaret eden bir bookmark, home dizini genelinde bir okumadan daha dar bir yetenektir ve her çalışmada kalıcı kılınıp yeniden doğrulanabilir.

Yetkinin kullanıcıya bir bildirimde görüneceğini varsayın ve o bildirimi anlamlı kılın. Sistem "bu agent Messages veritabanınızı okudu" diye gösteriyorsa, agent hangi görevin buna yol açtığını ve verinin ne için kullanıldığını söyleyebilmelidir. Kullanıcının üzerine işlem yapamadığı bir bildirim, onlara bildirimleri yok saymayı öğretir; bu da kontrolü diğer tüm uygulamalar için bozar.

Çalışma ortasında iptali planlayın. Bir handle sona erebilir, bir bookmark bayatlayabilir, kullanıcı agent çalışırken yetkiyi kapatabilir. Agent ölümcül değil, devam ettirilebilir olmalıdır: planı checkpoint'leyin, yeteneğini kaybeden adımı işaretleyin ve ya daha dar kapsamlı yeni bir handle isteyin ya da kısmi bir sonuçla temiz biçimde durun. İptali bir çökme olarak ele almak, bir güvenlik kontrolünü bir güvenilirlik olayına dönüştürür; kontroller bu şekilde devre dışı bırakılır.

Daha geniş nokta şu: güven birimi iş birimiyle eşleşmelidir. Bir agent çalışması iş birimidir. Bir ikili dosyanın ömrü değildir. İzin modeli bunu yansıtana kadar, macOS'taki her agent, görevinin hiç gerektirmediğinden fazlasını okumaya tek bir prompt injection uzaklıktadır.

İlgili okumalar

Bunun yanıtladığı sorular

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.