FireAI Güvenlik Blogu

Yazan FireAI Security & Research Team · Yayınlandı

MacOS'ta Kalıcılığı Avcılık: LaunchAgent'lar, Oturum Açma Öğeleri ve Arka Plan Görevleri

MacOS'ta Kalıcılığı Avcılık: LaunchAgent'lar, Oturum Açma Öğeleri ve Arka Plan Görevleri

"Kalıcılık" belirli bir sorun için kullanılan güvenlik terimidir: Bir kez çalıştırılan kod, yeniden başlatma veya oturum açma sonrasında, kimsenin onu elle yeniden başlatmasına gerek kalmadan otomatik olarak yeniden çalışmayı nasıl ayarlar? macOS, meşru yazılıma tam olarak bunu yapmak için pek çok onaylanmış yol sunar (bir güncelleme denetleyicisi, bir menü çubuğu senkronizasyon istemcisi, bir yazıcı sürücüsü yardımcısı) ve bu mekanizmaların her biri, hiç çalıştırmamayı tercih ettiğiniz bir şey için eşit derecede kullanılabilir. Bu, gerçek komutlarla birlikte bakılacak gerçek yerlerin bir turu ve FireAI gibi ağ odaklı bir aracın bu resimde nereye ait olup olmadığına dair dürüst bir açıklamadır.

LaunchAgents ve LaunchDaemons: iki büyük olan

macOS hemen hemen her şeyi, az sayıda bilinen dizinlerdeki özellik listesi (.plist) dosyaları tarafından yönlendirilen launchd aracılığıyla başlatır. MITRE ATT&CK'nin T1543.001 tekniği, mekanizmayı açık bir şekilde açıklar: oturum açma sırasında, kullanıcı başına bir launchd işlemi, kullanıcı ve sistem LaunchAgents dizinlerinden plistleri yükler ve RunAtLoad true olarak ayarlanmış bir plist, yüklendiği anda otomatik olarak yürütülür - onu oraya koyanın başka bir işlem yapmasına gerek yoktur. Teknik, önemli olan üç konumu listeler: /System/Library/LaunchAgents, /Library/LaunchAgents ve ~/Library/LaunchAgents. MITRE, bu dosyaların listesinde gezinirken hatırlamaya değer bir şeye dikkat çekiyor: kalıcılık için yüklenen aracılar genellikle "gizleniyor[d]... meşru işletim sistemi veya yazılım bileşenlerine benzeyen adlar kullanıyor" — com.apple.something.plist gibi görünen dosya, bir tane almamaya çalıştığı için tam olarak ikinci bir göz atmaya değer.

İlgili teknik T1543.004 kapsamındaki LaunchDaemon'lar, sistem çapında, oturum açma gerektirmeyen sürümdür: önyüklemeden başlayarak /System/Library/LaunchDaemons/ veya /Library/LaunchDaemons/ adresinden root olarak çalışırlar. Oraya bir tane yüklemek başlangıçta yönetici ayrıcalıkları gerektirdiğinden, MITRE daemon rotasını, başlangıçtaki ayrıcalıklı bir dayanağı, yeniden başlatmadan sonra hayatta kalan, o andan itibaren kök düzeyinde erişimle çalışan bir şeye dönüştürmenin bir yolu olarak çerçeveler - bu aynı zamanda /Library/LaunchDaemons'da görünen yeni, alışılmadık bir dosyanın, kullanıcının kendi LaunchAgents klasöründe görünenden daha ağır bir sinyal olmasının nedenidir.

Terminal — gerçekte neyin kayıtlı olduğunu listeleme
ls -la ~/Library/LaunchAgents /Library/LaunchAgents /Library/LaunchDaemons
# compare this list against what you remember installing; anything you don't
# recognise is worth reading with: plutil -p /path/to/the.plist

Diskte var olan bir dosya ve gerçekte yüklenen bir iş iki farklı sorudur ve launchctl print ikinci soruyu yanıtlar. Kılavuz sayfası bunu, system/ veya gui/501/ (501 kullanıcının UID'sidir) gibi bir etki alanına işaret ederek "belirtilen hizmet veya etki alanı hakkında bilgi" yazdırmak olarak tanımlar; o bağlamda yüklü olan her hizmeti ve uç noktayı artı her birinin durumunu listeler:

Terminal — şu anda gerçekte yüklü olan şey
launchctl print gui/$(id -u)
# example output, trimmed — a real run lists every loaded agent for your session
	"com.apple.someAgent" => {
		active count = 1
		path = /Library/LaunchAgents/com.apple.someAgent.plist
		state = running
	}

Oturum açma öğeleri ve Arka Plan Görev Yönetimi

Bunların çoğu için kullanıcıya bakan yüzey, Sistem Ayarlarının Oturum Açma Öğeleri bölmesidir ve yalnızca komut satırını değil, kendi gözlerinizle kontrol etmeye değer. Apple'ın destek kılavuzu bunu doğrudan açıklıyor: "oturum açtığınızda otomatik olarak açılacak oturum açma öğelerini seçebilir", bunları buraya ekleyebilir veya kaldırabilirsiniz ve "uygulama açık olmadığında yazılım güncellemelerini kontrol etmek veya verileri senkronize etmek gibi görevleri gerçekleştiren" uygulamalara ayrı ayrı izin verebilir veya bunları reddedebilirsiniz - bu ikinci kategori, tam oturum açma öğeleri olmayan ancak yine de gözetimsiz çalışan arka plan yardımcılarını kapsar.

MacOS Ventura'dan beri, bu ayarlar bölmesinin altındaki sistem, güvenlik topluluğunda genellikle Arka Plan Görev Yönetimi (BTM) olarak adlandırılıyor: kendisini kaydederken her başlatma aracısını, başlatma arka plan programını ve oturum açma öğesini izleyen bir hizmet; bu, Sistem Ayarlarının size üç plist dizinini elle aramak zorunda kalmanız yerine canlı, merkezi bir liste göstermesini sağlayan şeydir. Bazı araştırmacıların bu veritabanını sfltool dumpbtm ile daha doğrudan sorgulamak için kullandıkları belgelenmemiş bir komut satırı aracı olan sfltool vardır - Apple bunun için bir kılavuz sayfası göndermez ve çıktı formatının sabit kalacağı garanti edilmez, bu nedenle bunu, etrafında bir iş akışı oluşturacak bir şey yerine, kendi makinenizde deneyebileceğiniz bir araştırma merakı olarak değerlendirin. Aynı bilgileri görmenin desteklenen ve istikrarlı yolu, Sistem Ayarlarındaki Oturum Açma Öğeleri bölmesi veya belirli bir işin canlı durumu için launchctl print'dir.

cron: daha yaşlı, daha sessiz, hâlâ orada

launchd uzun süredir Apple'ın tercih ettiği zamanlayıcı olmuştur, ancak eski Unix cron arka plan programı hala içinde planlanan her şeyi gönderiyor ve çalıştırmaya devam ediyor. Crontab kılavuz sayfası dosya formatını doğrudan açıklar: her satırda beş saat/tarih alanı bulunur - dakika, saat, ayın günü, ay, haftanın günü - ardından çalıştırma komutu gelir ve bazı sistemlerde bu beş alan yerine @reboot ve benzeri kısa yol dizeleri bulunur. crontab -l, crontab(1) kılavuz sayfasına göre, geçerli kullanıcı için "Geçerli crontab'ı standart çıktıda görüntüler":

Terminal — kendinizin ve kökünüzün crontab'ını kontrol etme
crontab -l
sudo crontab -l -u root

Her ikisi için de boş bir sonuç günümüzün çoğu Mac'inde normaldir; işte tam da bu nedenle oradaki her şey ilgiyi hak ediyor. cron gösterişten uzaktır ve nadiren kontrol edilir; olay yazılarında hala bir yedek kalıcılık konumu olarak görünmesinin nedeni tam olarak budur.

Yapılandırma profilleri: kağıt iziyle kalıcılık

Bir konfigürasyon profili bir LaunchDaemon kurabilir, gizlilik izinleri verebilir veya ayarları bir Mac filosuna aktarabilir; yasal olarak MDM (mobil cihaz yönetimi) bu şekilde çalışır. Yasal olmayan bir şekilde profil, bir plist dosyasına doğrudan dokunmadan değişikliklerin kalıcı olmasını sağlamanın belgelenmiş bir yoludur. profiles komut satırı aracı, yüklü olanları listeler: profiles list yüklü profilleri gösterir ve kılavuz sayfasında not edildiği gibi, onu -all ile root olarak çalıştırmak, yalnızca geçerli kullanıcınınki yerine "sistemdeki tüm yapılandırma profillerini listeler".

Terminal — Mac'teki tüm konfigürasyon profilleri
sudo profiles list -all
sudo profiles show -all

MDM kaydı olmayan kişisel bir Mac'te genellikle hiçbir kayıt bulunmamalı veya yalnızca bilinçli olarak yüklediğiniz kayıtlar (bir VPN yapılandırması, bir iş profili) bulunmalıdır. Yüklemeyi hatırlamadığınız bir profil, kaldırmadan önce araştırmaya değer çünkü profiles tam olarak bu adım için parola korumasıyla kaldırmayı da destekliyor.

Yetkilendirme eklentileri ve uzun kuyruk

Yukarıdaki büyük dörtlünün ötesinde, daha küçük, daha eski mekanizmaların uzun bir kuyruğu vardır: Dizin Hizmeti ve yetkilendirme eklentileri, Spotlight içe aktarıcıları, QuickLook oluşturucuları, Dock kutucuğu eklentileri ve her yeni terminal oturumu açıldığında çalışan kabuk başlangıç ​​dosyaları. Amaca yönelik olarak tasarlanmış bir aracın manuel kontrolden daha fazla yararlandığı yer burasıdır. Örneğin, Objective-See'nin KnockKnock'u, başlatma aracıları ve arka plan programları, oturum açma öğeleri, tarayıcı uzantıları, cron işleri, çekirdek ve sistem uzantıları ve yetkilendirme ve dizin hizmeti eklentileri dahil olmak üzere kalıcılık konumlarının yirmiden fazla kategorisini tek geçişte sıralar ve her birinde bulduğu şeylerin kod imzalama durumunu gösterir. Arkadaşı BlockBlock, aynı konum listesini alır ve onları sürekli izleyerek yeni bir şeyin kendisini kaydettiği anda uyarı verir; kendi açıklamasına göre, "ortak kalıcılık konumlarını izler ve yeni bir kalıcı bileşen eklendiğinde uyarı verir", sorumlu süreci, imzalama durumunu gösterir ve anında izin vermenize veya engellemenize olanak tanır.

Kabuk başlangıç ​​dosyaları: sessiz hepsini yakalama

Hiçbir pliste ve ayrıcalıklı kuruluma ihtiyaç duymadığından, doğrudan bakmaya değer bir konum daha: kabuk yapılandırma dosyaları. ~/.zshrc, ~/.zprofile ve ~/.bash_profile, eşleşen yeni bir terminal oturumu her açıldığında çalışır ve eklenen tek bir satır (bir komut dosyasına yönlendirme, ele geçirilen bir PATH'yi dışa aktarma, bir arka plan işlemi başlatma) Terminal'i her açtığınızda, launchd'e yüklenecek hiçbir şey ve launchctl print'in gösterecek hiçbir şeyi olmadan bir dayanak noktası yeniden oluşturmak için yeterlidir. Objective-See'nin KnockKnock'u, taramasında tam olarak bu kategoriyi içeriyor; başlatma aracıları ve oturum açma öğelerinin yanında kabuk yapılandırma dosyaları olarak listeleniyor; bu makaleye ait olmasıyla aynı nedenden dolayı: varsaymak yerine kontrol etmeye değer olacak kadar yaygın ve yeterince gösterişsiz.

Terminal - hızlı okuma, gerçekten okumanın yerini tutmaz
cat -A ~/.zshrc ~/.zprofile ~/.bash_profile 2>/dev/null | less
# -A shows non-printing characters, which surfaces anything hidden with
# trailing whitespace or a carriage return trying to push it off-screen

FireAI'nin uyduğu ve kasıtlı olarak uymadığı yerler

Bu konuda açık olmak gerekirse: FireAI /Library/LaunchDaemons'yi taramaz, plist dosyalarını okumaz ve yeni bir oturum açma öğesi veya yapılandırma profili algılama girişiminde bulunmaz. Bu, FireAI'nin yaptığından farklı bir disiplindir ve bunun için özel olarak geliştirilmiş araçlar (aralarında KnockKnock ve BlockBlock da var) bu işi zaten iyi bir şekilde yapıyor. FireAI'nin izlediği şey, kalıcılığın ardından gelen adımdır ve bu mekanizmaların her birinin, onu kuran kişiye faydalı olması için eninde sonunda ihtiyaç duyduğu adımdır: bir ağ bağlantısı. Her oturum açmada sessizce çalışan ancak ağla asla konuşmayan bir LaunchAgent, ağ güvenlik duvarının bakış açısından görünmezdir ve ayrıca pratikte bir saldırgan için çok daha az kullanışlıdır. Bir soket açtığı anda, FireAI'nin uygulama başına kuralları diğer işlemler gibi ona da uygulanır: Tanıdık olmayan, imzalı veya imzasız bir ikili dosya ilk bağlantısını kurarken bir istemi tetikler, cihazdaki modelin mantığı sade bir dille gösterilir ve her karar daha sonra görünür, geri alınamaz ve bir metin kuralı olarak dışa aktarılabilir.

İki disiplini bir araya getirmenin dürüst yolu: bu makaledeki konumları risk toleransınıza uygun bir programa göre kontrol edin - çoğu insan için aylık makuldür, çok sayıda üçüncü taraf yazılımı yüklüyorsanız haftalık - ve sessizce devam eden herhangi bir şeyin, cevap verdiği kişiye ulaşmak için eninde sonunda konuşmak zorunda kalacağı varsayımıyla, aradaki yükü bir ağ aracının taşımasına izin verin.

FireAI ve HisnLabs burada nereye oturuyor

FireAI does not scan for persistence — that is a different job, and tools like KnockKnock and BlockBlock already do it well; what FireAI watches is what that persisted code does the moment it opens a socket, which is the step every one of these mechanisms eventually has to take to be useful to whoever installed it.

FireAI, HisnLabs’in kendi ürünüdür: doğrudan Mac’inizde çalışan, yapay zekâ destekli bir güvenlik duvarı. Uygulamalarınızın kurduğu her bağlantıyı sade bir dille gösterir ve Mac’inizden neyin çıkacağına sizin karar vermenizi sağlar — yapay zekâsı yerel olarak çalışır, yani trafiğiniz asla bize ya da başka birine gönderilmez. HisnLabs güvenlik araştırma ekibi bu kararların isabetli kalmasını sağlayan ekiptir: hangi alan adlarının sıradan telemetri, hangilerinin gerçek bir hizmet olduğunu kataloglar, bir bağlantının ardındaki ülkeyi ve ağı izler ve cihaz üzerindeki modeli (Autopilot özelliği) gerçek trafik örüntüleriyle eğitir — üstelik bunların hiçbiri Mac’inizden dışarı çıkmadan.

Arkasındaki teknik kararları okuyabilir ya da FireAI’yi 17 gün boyunca deneyebilirsiniz: HisnLabs’ten FireAI.

Kaynaklar