Series · 4 partsmacOS Security BoundariesPart 3 · You are here
  1. 1Uygulama Sandbox'taydı. XPC Sınırı Hâlâ Yetkilendirme İstiyordu
  2. 2İzin Verildi. Veri Kullanımı Hâlâ Politika Gerektiriyordu: macOS TCC
  3. 3Helper Kayıtlıydı. Yaşam Döngüsü Uygulamadan Uzun SürdüYou are here
  4. 4Olay Görünürdü. Tespitin Hâlâ Bağlama İhtiyacı Vardı: macOS Endpoint Security

60 saniyede macOS helper yaşam döngüsü

Görünür bir macOS uygulaması kapatıldığında bile onun login item’ı, launch agent’ı veya launch daemon’ı arka planda çalışmaya devam edebilir. Bu davranış meşru olabilir: Bir bulut senkronizasyon istemcisi arka plan işlerine, bir güvenlik ürünü sistem uzantısına (system extension), bir güncelleyici (updater) ise dar yetkili bir servise ihtiyaç duyabilir. Buradaki güvenlik sınırı bir helper’ın varlığı değildir. Asıl sınır; onu kimin paketlediği, kimin kaydettiği, kimin onayladığı, nerede çalıştığı, hangi girdileri kabul ettiği, nasıl güncellendiği ve nasıl sonlandırıldığı arasındaki ilişkidir.

Modern Service Management API’leri, bir uygulamanın imzalı uygulama paketi (bundle) içinde tutulan yardımcı yürütülebilir dosyaları (helper executables) yönetmesini sağlar. Apple’ın SMAppService dokümantasyonu login item, launch agent ve launch daemon bileşenlerini birbirinden ayırır; kayıt (registration), kaydı silme (unregistration) ve durum sorgulama imkanı tanır. Kayıt yapılması, servisin o servis türüne özgü kurallara ve onaylara tabi olarak başlatılabileceği anlamına gelir. Ancak her IPC istemcisinin yetkilendirildiği veya çalışma zamanı etkisinin kullanıcının beklentisiyle örtüştüğü anlamına gelmez.

Sızma testinin soracağı asıl faydalı soru şudur:

Uygulama penceresi, kullanıcı oturumu, sürüm, hesap veya ürünün kendisi artık aktif olmadığında hangi yetki hayatta kalmaya devam eder?

Bunu yanıtlamak bir Login Items ekran görüntüsünü değil; kişisel bir Mac’in arka plan servislerinin dökümünü de değil; yaşam döngüsü kanıtlarını gerektirir.

Paketleme, kayıt, onay ve çalıştırma ayrı durumlardır

Kulağa benzer gelen şu dört ifade tamamen farklı güvenlik anlamlarına sahiptir:

  1. Paketlenmiş (Packaged): Bir helper çalıştırılabilir dosyası ve property list (.plist), imzalı bir uygulama paketinin içinde mevcuttur.
  2. Kayıtlı (Registered): Uygulama, Service Management’tan helper’ı başlatılabilir kılmasını talep etmiştir.
  3. Onaylanmış (Approved): Kullanıcı veya sistem yöneticisi ilgili arka plan veya sistem düzeyindeki ögeye izin vermiştir.
  4. Çalışıyor (Running): launchd, belirli bir etki alanında (domain), kullanıcı bağlamında (UID) ve oturumda bir süreç başlatmıştır.

Apple, macOS 13 ve sonrasında SMAppService’in uygulama paketine gömülü login item’lar, launch agent’lar ve launch daemon’lar için resmi denetim mekanizması olduğunu belirtir. Detaylar farklılık gösterir: Bir login item hemen ve sonraki oturum açılışlarında başlayabilir. Kayıtlı bir launch agent kullanıcının oturumunda bootstrap edilebilir. Bir launch daemon ise yönetici onayı verilene kadar bootstrap edilmez ve sonraki sistem açılışlarında geri gelebilir. Kayıt dokümantasyonu, kaydın kullanıcı onayına tabi olduğunu açıkça vurgular.

Bu geçişler değerlendirme sırasında bir durum makinesine (state machine) dönüştürülmelidir:

paketlenmişİMZALI BUNDLE kayıtlıSERVİS KAYDI onaylanmışKULLANICI · ADMİN başlatılmışDOMAIN · UID · OTURUM runtime çalışmasıPEER · METOD · ETKİ güncellenmişYENİ KİMLİK kaydı silinmişYENİDEN BAŞLATMA YOK kaldırılmışDURUM TEMİZLENDİ hata veya retDEVRE DIŞI · GÖRÜNÜR YAŞAM DÖNGÜSÜ YETKİDİRyükleme ve kaldırma güvenlik geçişleridir
Helper bileşeni yalnızca 'var' ya da 'yok' değildir. Her durum geçişi onu kimin başlatabileceğini, hangi kimliğin çalıştığını ve arıza veya kaldırma sonrasında nelerin kaldığını değiştirir.

Tüm bilgisayardan değil, teslim edilen paketten başlayın

Gizliliğe saygılı bir inceleme, yetkilendirilmiş tek bir ürünü envanterler. Denetçinin kendi Mac’inde yüklü olan tüm kişisel login item’larını, ajanları, daemon’ları veya süreçleri listelemez.

İncelenen uygulama için şunları kaydedin:

  • Her bir helper dosyası ve bundle içindeki göreli konumu;
  • Kapsayıcı uygulamanın imzası ve her bir helper’ın kendi designated requirement tanımı;
  • Servis plist dosyasının adı, etiketi (label), program yolu, argümanları ve başlatma koşulları;
  • Login item, user agent, system daemon veya system extension rolü;
  • İncelenen ürün için geçerli kayıt ve onay durumu;
  • Launch domain, UID, oturum erişilebilirliği, sandbox durumu ve entitlement’lar;
  • XPC veya diğer mesajlaşma arayüzleri ve peer gereksinimleri;
  • Güncelleme, geri alma (rollback), kaldırma (uninstall) ve artık dosya temizleme yolları.

Salt okunur inceleme müşteri tarafından sağlanan ürün dosyasıyla başlayabilir:

find CustomerApp.app/Contents/Library -maxdepth 3 \
  \( -name 'LaunchAgents' -o -name 'LaunchDaemons' -o -name 'LoginItems' \) -print
codesign -dvvv --entitlements :- CustomerApp.app
plutil -p CustomerApp.app/Contents/Library/LaunchAgents/com.example.agent.plist

İmza incelemesini gerçek helper dosyası için tekrarlayın. Helper kimliğini asla ana uygulamanın pazarlama adından veya yalnızca Team ID’sinden yola çıkarak varsaymayın. Doğru şekilde imzalanmış iki bileşen tamamen farklı tanımlayıcılara, entitlement’lara, sandbox durumlarına ve güncelleme davranışlarına sahip olabilir.

Apple’ın migrasyon rehberliği, desteklenen helper kaynaklarının ve property list dosyalarının imzalı uygulama paketi içinde tutulmasını önerir. Bu durum değiştirilebilir kurulum materyalini azaltır; ancak servis yapılandırmasını veya çalışma zamanı arayüzünü doğrulama ihtiyacını ortadan kaldırmaz.

Başlatma alanlarını (launch domains) ve yetkiyi açıkça modelleyin

Bir login item, launch agent ve launch daemon birbirinin yerine geçebilen sıradan kalıcılık (persistence) etiketleri değildir:

BileşenTipik ömürBağlamKritik güvenlik sorusu
Login itemOturum açma ve kullanıcı oturumuOturum açmış kullanıcıGörünür özelliğin her oturum açılışında başlaması gerçekten gerekiyor mu?
Launch agentKullanıcı oturumu, talep anında veya kalıcıKullanıcı bazlı launch domainAynı oturumdaki hangi istemciler arayüzüne erişebilir?
Launch daemonSistem açılışı veya talep anındaSistem domain’i, çoğunlukla rootHangi kimliği doğrulanmış istemci istekleri sistem etkisine dönüştürebilir?
System extensionSistem tarafından yönetilen yaşam döngüsüKısıtlanmış uzantı bağlamıHangi entitlement, onay, olay kaynağı ve kapsayıcı uygulama onu yönetiyor?
Bundled XPC serviceGenellikle istemciye bağlıAyrı süreçSüreç ayrımı aynı zamanda peer ve metod yetkilendirmesini zorunlu kılıyor mu?

Yalnızca RunAtLoad değerine bakıp bir risk puanı atamak yerine, geçerli property list semantiğini kaydedin. Talep üzerine çalışan servisler, genel bir Mach servisi onları sürekli uyandırıyorsa pratikte yine kalıcıdır. Düzgün bir şekilde sonlanan bir süreç, bir arıza sonrasında sistem tarafından yeniden başlatılabilir. Tersine, diskte var olan ancak devre dışı bırakılmış ve erişilemeyen bir daemon, aktif bir güvenlik etkisi kanıtlamaz.

Yetki grafiği şu bağlantıyı kurmalıdır: Başlatma tetikleyicisi → Runtime süjesi → Çağrılabilir arayüz → Sistem etkisi. Erişilebilir bir metodu olmayan bir root etiketi tek başına bulgu değildir; geniş gizlilik erişimine ve kimlik doğrulaması yapmayan bir arayüze sahip bir kullanıcı ajanı (user agent) çok daha ağır sonuçlar doğurabilir.

Kayıt olmak, XPC çağrıcısını yetkilendirmez

Service Management servisin nasıl ve ne zaman başlatılabileceğine karar verir. XPC ise süreçlerin nasıl mesajlaşacağını belirler. Alıcı taraf; peer kimlik doğrulamasını, işlem yetkilendirmesini, girdi doğrulamasını ve etki kontrolünü bizzat yapmak zorundadır.

Çağrılabilen her metod için şu soruları sorun:

  1. Bağlanan sürecin karşılaması gereken kod imzalama gereksinimi (code requirement) nedir?
  2. Bu kimliğin mevcut ürün ve kullanıcı durumunda bu metodu çağırmasına izin veriliyor mu?
  3. Hangi argümanlar çağrıcı tarafından seçilmektedir?
  4. Servis nihai dosyaları ve nesneleri kendi bağlamında güvenli bir şekilde çözümlüyor mu?
  5. Daha düşük yetkiye sahip bir istemci, daha yüksek yetkili bir etki talep edebilir mi?
  6. Hangi denetim kaydı istek, karar, sonuç ve gerçek etkiyi birbirinden ayırır?

İlk bölümde kullanılan sentetik XPC laboratuvarı, bir sistem daemon’ına dokunmadan bu sınırı açıkça ortaya koyar. Geçici bir kullanıcı alanı servisi, farklı imzalanmış iki istemciden aynı zararsız girdiyi kabul etti. Sunucu beklenen imza tanımlayıcısını kabul edip metod çalıştırılmadan önce uyumsuz olanı reddetti; ardından servis sistemden kaldırıldı. Bu bir test yapı taşıdır; üçüncü taraf bir ürünün zafiyet içerdiğinin kanıtı değildir.

kayıtlı helperTEST DOMAIN onaylı peerMETODA İZİN VER sınırlandırılmış etkiSENTETİK İŞARETÇİ uyumsuz peerÇAĞRI ÖNCESİ RET uygulama kapanırBEKLENEN ÖMÜR güncelleme veya retGÜVENLİ ARIZA kaydı silYENİDEN BAŞLATMA YOK · TEMİZ GEÇİŞLERİ TEKRAR TEST EDİNyalnızca ilk başarılı başlatmayı değil
Bir yaşam döngüsü testi hedeflenen çalışma yolunu, reddedilen peer'ı, uygulama kapandıktan veya güncellendikten sonraki davranışı ve kaydın eksiksiz silindiğini kanıtlar.

Güncelleme ve geri alma kimlik geçişleridir

Bir güncelleme; kapsayıcı uygulamayı, helper dosyasını, servis plist’ini, protokol sürümünü ve kod imzalama gereksinimini aynı anda değiştirebilir. Bu süreci bir güvenlik migrasyonu olarak test edin.

Kritik test senaryoları şunları içerir:

  • Eski uygulama ile eski helper;
  • Yeni uygulama ile yeni helper;
  • Hâlâ çalışan eski helper ile karşılaşan yeni uygulama;
  • Bundle değişimi ile servis geçişi arasında kesintiye uğrayan güncelleme;
  • Daha eski bir protokole veya imza gereksinimine geri dönme (rollback);
  • Uygulamanın kayıttan sonra başka bir dosya yoluna taşınması;
  • Migrasyon sırasında helper çökmesi;
  • Yükseltme sırasında arka plan izninin iptal edilmesi veya devre dışı bırakılması.

Kurtarılamaz bir sistem durumu yaratmadan güvenli şekilde hata verin (fail-closed). Yeni bir istemci, geride kalan rastgele bir süreçle konuşabilmek uğruna peer doğrulama gereksinimini sessizce gevşetmemelidir. Eski bir helper doğrulayamadığı yeni işlemleri kabul etmemelidir. Güncelleyici hem kaynak hem de hedef dosyaları doğrulamalı ve net bir geri alma sınırı tanımlamalıdır.

XPC protokolünü sürümleyin ve desteklenmeyen kombinasyonları açıkça reddedin. Yüksek etkili işlemleri, aynı geliştirici tarafından imzalanmış herhangi bir binary’yi kabul etmek yerine, o anda yüklü olan ürün durumuna bağlayın. Geliştirici kimliği genellikle metod yetkilendirmesi için gereğinden fazla geniştir; designated requirement hedeflenen ürünü ve izin verilen migrasyon pencerelerini açıkça belirtmelidir.

Kaldırma (Uninstall) bir güvenlik özelliğidir

Görünür .app dosyasını Çöp Sepeti’ne atmak, her helper’ın durduğunun veya arkada bıraktığı durumun silindiğinin kanıtı değildir. Ürün; servislerin kaydını silen, arka plan işlerini durduran, kimlik bilgilerini geçersiz kılan ve verileri kullanıcının tercihine göre temizleyen resmi bir kaldırma yoluna sahip olmalıdır.

Kaldırma işlemini dört katmanda doğrulayın:

  • Kayıt: Service Management ürünün helper’ının artık kayıtlı olmadığını raporlar;
  • Çalışma zamanı: Tanımlı servis yeniden başlatılamaz ve IPC adına ulaşılamaz;
  • Artık dosyalar: Ürüne ait helper dosyaları ve yapılandırmalar belgelendiği şekilde kaldırılmıştır;
  • Yetki: Token’lar, bookmark’lar, ayrıcalıklı onaylar, kuyruklar ve uzak kayıtlar artık hiçbir etki yaratmaz.

Geniş kapsamlı bir launchctl veya dosya sistemi dökümünü kanıt saymayın. Doğrudan ürün etiketini veya test domain’i tanımlayıcısını sorgulayın. Bu hem daha güvenilirdir hem de cihaz sahibinin gizliliğine saygılıdır.

Kanıt matrisi

İddiaPozitif kanıtNegatif kontrolNeler kanıtlanmamış kalır
Helper beyan edildiği gibi paketlenmiştirBundle içi yol, çalıştırılabilir dosya imzası, plist hash’iDeğiştirilmiş kopya imza doğrulamasını geçemezBaşka bir Mac’teki çalışma zamanı onayı
Kayıt hedeflenen servisi oluştururKesin SMAppService durumu ve adlandırılmış servis yanıtıKaydı silinmiş durum başlatılamazİncelemeye sunulmayan eski yükleyici (installer) yolları
Runtime kimliği tasarımla örtüşürTanımlı launch domain, UID, entitlement’lar, protokol sürümüYanlış oturum veya yanlış peer reddedilirTüm kurumsal yönetim kombinasyonları
Yüksek yetkili metodlar arayanı doğrularOnaylanmış kod gereksinimi sentetik tek bir etkiye ulaşırUyumsuz imza tanımlayıcısı metod gövdesinden önce reddedilirAynı geliştiricinin gelecekteki bilinmeyen imzalı ürünleri
Güncelleme sınırı korurEskiden yeniye ve kesintiye uğrayan güncelleme senaryoları tanımlıdırDesteklenmeyen istemci/helper çifti güvenle kapanırKapsam dışındaki üretici güncelleme altyapısı
Kaldırma işlemi kalıcılığı tamamen silerServis kaydı silinir, yeniden başlayamaz, ürün durumu temizlenirYeniden başlatma veya oturum açma göstergeyi yeniden üretmezBelgelenmiş politika gereği kasıtlı tutulan veriler

Kanıtlar yapılandırma, gözlem ve etkiyi birbirinden ayırmalıdır. Bir property list istenen yapılandırmayı gösterir. Bir süreç listesi tek bir andaki gözlemi gösterir. Sınırlandırılmış bir test ise belirli bir istemcinin belirli bir sonuca neden olup olamayacağını kanıtlar. Bunların hiçbiri tek başına tüm yaşam döngüsünü kanıtlamaya yetmez.

İyileştirme öncelikleri

Çoğu bulgu için başarısız olan en dar geçişi onarın:

  • Desteklendiği durumlarda değişken yükleyici betikleri yerine güncel Service Management modelini kullanın;
  • Helper dosyalarını imzalı paket içinde tutun ve her çalıştırılabilir dosyanın kimliğini ayrı ayrı doğrulayın;
  • Kayıt talebini alakasız bir kurulum gürültüsü olarak değil, arka plan özelliğinin mantığı kullanıcıya açıklandığı anda yapın;
  • XPC peer’larını dar bir kod gereksinimi ile doğrulayın ve her metodu bağımsız olarak yetkilendirin;
  • Daemon işlemlerini en aza indirin; rastgele komutlar yerine dosya tanıtıcıları (handles) veya yapılandırılmış niyetler aktarın;
  • Protokolleri sürümleyin ve güvensiz eski/yeni kombinasyonlarını reddedin;
  • Devre dışı bırakılmış, reddedilmiş ve çökmüş durumları kullanıcıyı zorlayan kayıt döngülerine sokmadan görünür kılın;
  • Yaşam döngüsü kararlarını ürün kapsamındaki tanımlayıcılarla ve kişisel içerik barındırmadan günlüğe kaydedin;
  • Eksiksiz bir kayıt silme ve temizleme davranışı sağlayın, ardından bunu oturum açma ve yeniden başlatma senaryolarında regresyon testine tabi tutun.

Kalıcılık (persistence) otomatik olarak kötü amaçlı değildir; kullanıcı onayı da tek başına yeterli bir güvenlik garantisi değildir. Yüksek kaliteli bir macOS ürünü, helper bileşeninin amacını, yetkisini, mevcut durumunu ve sistemden nasıl kaldırılacağını görünür uygulamanın kendisi kadar şeffaf hale getirir.

Kaynaklar

Bu çalışma, kaynakları gözden geçirilmiş bir değerlendirme metodolojisidir. Yerel örneğinde geçici bir kullanıcı alanı servisi ve sentetik girdiler kullanılmıştır; kişisel bir Mac’in arka plan ögelerini listelemez veya üçüncü taraf bir kalıcılık zafiyeti iddia etmez.

Kaynaklar ve güncellik

Bu teknik not ne kadar güncel?

Kontrol edilen kaynaklar30 Ağustos 2026

En son kaynak incelemesi, içerik güncellemesi veya yayın tarihi gösterilmektedir.

İnceleme DurumuKamuya açık kaynaklar incelendi

Birincil kamu kayıtları kontrol edildi. Ortama özgü davranış, ayrıca yeniden üretilmedikçe iddianın dışındadır.