macOS TCC Bypasses
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
Bu bir bypass değil, TCC'nin nasıl çalıştığıdır: Yazmayı korumaz. Eğer Terminal bir kullanıcının Masaüstünü okumak için erişime sahip değilse, yine de oraya yazabilir:
The extended attribute com.apple.macl
yeni dosyaya eklenir, böylece yaratıcı uygulama onu okumak için erişim kazanır.
Kullanıcının bunu fark etmeden kabul etmesi için TCC isteminin üzerine bir pencere koymak mümkündür. Bir PoC'yi TCC-ClickJacking'de bulabilirsiniz.
Saldırgan, Info.plist
dosyasında herhangi bir isimle uygulama oluşturabilir (örneğin Finder, Google Chrome...) ve bunu bazı TCC korumalı konumlara erişim istemesi için ayarlayabilir. Kullanıcı, bu erişimi talep eden uygulamanın meşru olduğunu düşünecektir.
Ayrıca, meşru uygulamayı Dock'tan kaldırmak ve sahte olanı yerleştirmek mümkündür, böylece kullanıcı sahte olanı tıkladığında (aynı simgeyi kullanabilir) meşru olanı çağırabilir, TCC izinlerini isteyebilir ve bir kötü amaçlı yazılım çalıştırabilir, bu da kullanıcının meşru uygulamanın erişim talep ettiğine inanmasına neden olur.
Daha fazla bilgi ve PoC için:
macOS Privilege EscalationVarsayılan olarak, SSH üzerinden erişim "Tam Disk Erişimi" gerektiriyordu. Bunu devre dışı bırakmak için, listede yer alması ancak devre dışı bırakılması gerekir (listeden kaldırmak bu ayrıcalıkları kaldırmaz):
Bazı kötü amaçlı yazılımların bu korumayı nasıl aşabildiğine dair örnekler bulabilirsiniz:
Artık SSH'yi etkinleştirmek için Tam Disk Erişimi gerektiğini unutmayın.
com.apple.macl
niteliği, dosyalara belirli bir uygulamanın okuma izni vermek için verilir. Bu nitelik, bir dosyayı bir uygulamanın üzerine sürükleyip bıraktığınızda veya bir kullanıcı bir dosyayı çift tıkladığında varsayılan uygulama ile açmak için ayarlanır.
Bu nedenle, bir kullanıcı tüm uzantıları işlemek için kötü niyetli bir uygulama kaydedebilir ve herhangi bir dosyayı açmak için Launch Services'i çağırabilir (böylece kötü amaçlı dosya okuma erişimi kazanır).
com.apple.private.icloud-account-access
yetkisi ile com.apple.iCloudHelper
XPC servisi ile iletişim kurmak mümkündür, bu da iCloud token'ları sağlayacaktır.
iMovie ve Garageband bu yetkiye sahipti ve diğerleri de izin verdi.
Bu yetkiden icloud token'ları almak için istismara dair daha fazla bilgi için konuşmayı kontrol edin: #OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula
kTCCServiceAppleEvents
iznine sahip bir uygulama, diğer Uygulamaları kontrol edebilecektir. Bu, diğer Uygulamalara verilen izinleri istismar edebileceği anlamına gelir.
Apple Script'leri hakkında daha fazla bilgi için kontrol edin:
macOS Apple ScriptsÖrneğin, bir Uygulama iTerm
üzerinde Otomasyon iznine sahipse, bu örnekte Terminal
iTerm'e erişime sahiptir:
FDA'ya sahip olmayan Terminal, iTerm'i çağırabilir, bu da ona sahip ve eylemleri gerçekleştirmek için kullanılabilir:
Ya da bir uygulama Finder üzerinde erişime sahipse, bu gibi bir script kullanabilir:
Kullanıcı alanındaki tccd daemon HOME
env değişkenini $HOME/Library/Application Support/com.apple.TCC/TCC.db
adresinden TCC kullanıcı veritabanına erişmek için kullanıyor.
Tam bu Stack Exchange gönderisine göre ve TCC daemon'u mevcut kullanıcının alanında launchd
aracılığıyla çalıştığı için, ona iletilen tüm ortam değişkenlerini kontrol etmek mümkündür.
Böylece, bir saldırgan $HOME
ortam değişkenini launchctl
içinde kontrol edilen bir dizine işaret edecek şekilde ayarlayabilir, TCC daemon'unu yeniden başlatabilir ve ardından TCC veritabanını doğrudan değiştirebilir ve kendisine mevcut tüm TCC yetkilerini verebilir, bu işlemi son kullanıcıyı asla uyarmadan gerçekleştirebilir.
PoC:
Notlar TCC korumalı konumlara erişime sahipti ancak bir not oluşturulduğunda bu korumasız bir konumda oluşturuluyordu. Yani, notlardan korumalı bir dosyayı bir notta (yani korumasız bir konumda) kopyalamasını isteyebilir ve ardından dosyaya erişebilirsiniz:
/usr/libexec/lsd
ikili dosyası, nullfs montajı oluşturmasına izin veren com.apple.private.nullfs_allow
yetkisine sahipti ve her dosyaya erişim için kTCCServiceSystemPolicyAllFiles
ile com.apple.private.tcc.allow
yetkisine sahipti.
"Library" üzerine karantina niteliği eklemek, com.apple.security.translocation
XPC hizmetini çağırmak ve ardından Library'yi $TMPDIR/AppTranslocation/d/d/Library
olarak eşlemek mümkündü; burada Library içindeki tüm belgeler erişilebilir hale geliyordu.
Music
ilginç bir özelliğe sahiptir: Çalıştığında, ~/Music/Music/Media.localized/Automatically Add to Music.localized
konumuna bırakılan dosyaları kullanıcının "medya kütüphanesine" ithal eder. Dahası, rename(a, b);
gibi bir şey çağırır; burada a
ve b
şunlardır:
a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"
b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3"
Bu rename(a, b);
davranışı bir Race Condition'a karşı savunmasızdır, çünkü Automatically Add to Music.localized
klasörüne sahte bir TCC.db dosyası koymak ve ardından yeni klasör (b) oluşturulduğunda dosyayı kopyalamak, silmek ve ~/Library/Application Support/com.apple.TCC
'ye işaret etmek mümkündür.
Eğer SQLITE_SQLLOG_DIR="path/folder"
ise, bu temelde her açık veritabanının o yola kopyalanması anlamına gelir. Bu CVE'de bu kontrol, TCC veritabanını FDA ile açacak bir süreç içinde SQLite veritabanına yazmak için kötüye kullanıldı ve ardından SQLITE_SQLLOG_DIR
ile dosya adında bir sembolik bağlantı kullanılarak, o veritabanı açıldığında, kullanıcı TCC.db açılanla üst üste yazıldı.
Daha fazla bilgi yazıda ve sohbette.
Eğer ortam değişkeni SQLITE_AUTO_TRACE
ayarlanmışsa, libsqlite3.dylib
kütüphanesi tüm SQL sorgularını kaydetmeye başlayacaktır. Birçok uygulama bu kütüphaneyi kullandı, bu nedenle tüm SQLite sorgularını kaydetmek mümkündü.
Birçok Apple uygulaması, TCC korumalı bilgilere erişmek için bu kütüphaneyi kullandı.
Bu env değişkeni Metal
framework'ü tarafından kullanılır ve çeşitli programlar için bir bağımlılıktır, en önemlisi FDA'ya sahip olan Music
programıdır.
Aşağıdakileri ayarlayın: MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"
. Eğer path
geçerli bir dizinse, hata tetiklenecek ve programda neler olduğunu görmek için fs_usage
kullanabiliriz:
path/.dat.nosyncXXXX.XXXXXX
(X rastgele) adında bir dosya open()
edilecektir.
Bir veya daha fazla write()
dosyaya içerik yazacaktır (bunu kontrol edemiyoruz).
path/.dat.nosyncXXXX.XXXXXX
renamed()
olacak ve path/name
olarak değiştirilecektir.
Bu geçici bir dosya yazımıdır, ardından rename(old, new)
güvenli değildir.
Güvenli değildir çünkü eski ve yeni yolları ayrı ayrı çözmesi gerekir, bu da biraz zaman alabilir ve Race Condition'a karşı savunmasız olabilir. Daha fazla bilgi için xnu
fonksiyonu renameat_internal()
'a bakabilirsiniz.
Yani, temelde, eğer ayrı bir klasörden yeniden adlandırma yapan ayrıcalıklı bir işlem varsa, bir RCE kazanabilir ve farklı bir dosyaya erişmesini sağlayabilirsiniz veya bu CVE'de olduğu gibi, ayrıcalıklı uygulamanın oluşturduğu dosyayı açıp bir FD saklayabilirsiniz.
Eğer yeniden adlandırma, kontrol ettiğiniz bir klasöre erişirse, kaynak dosyayı değiştirdiğiniz veya ona bir FD sahip olduğunuz sürece, hedef dosyayı (veya klasörü) bir symlink'e işaret edecek şekilde değiştirirsiniz, böylece istediğiniz zaman yazabilirsiniz.
Bu CVE'deki saldırı şöyleydi: Örneğin, kullanıcının TCC.db
dosyasını üzerine yazmak için şunları yapabiliriz:
/Users/hacker/ourlink
oluşturun ve /Users/hacker/Library/Application Support/com.apple.TCC/
'a işaret etsin.
/Users/hacker/tmp/
dizinini oluşturun.
MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db
ayarlayın.
bu env değişkeni ile Music
çalıştırarak hatayı tetikleyin.
/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX
(X rastgele) dosyasının open()
işlemini yakalayın.
burada bu dosyayı yazma için de open()
ediyoruz ve dosya tanımlayıcısını tutuyoruz.
/Users/hacker/tmp
ile /Users/hacker/ourlink
'i bir döngü içinde atomik olarak değiştirin.
bunu, yarış penceresi oldukça dar olduğu için başarılı olma şansımızı artırmak için yapıyoruz, ancak yarışı kaybetmenin önemsiz bir dezavantajı var.
biraz bekleyin.
şansımızı test edin.
eğer şanslı değilsek, en baştan tekrar çalıştırın.
Daha fazla bilgi için https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html
Artık, MTL_DUMP_PIPELINES_TO_JSON_FILE
env değişkenini kullanmaya çalışırsanız, uygulamalar başlatılmayacaktır.
Root olarak bu hizmeti etkinleştirebilir ve ARD ajanı tam disk erişimine sahip olacaktır; bu da bir kullanıcı tarafından yeni bir TCC kullanıcı veritabanı kopyalamak için kötüye kullanılabilir.
TCC, kullanıcının kaynaklara erişimini kontrol etmek için kullanıcının HOME klasöründe bir veritabanı kullanır $HOME/Library/Application Support/com.apple.TCC/TCC.db. Bu nedenle, eğer kullanıcı TCC'yi farklı bir klasöre işaret eden bir $HOME env değişkeni ile yeniden başlatmayı başarırsa, kullanıcı /Library/Application Support/com.apple.TCC/TCC.db içinde yeni bir TCC veritabanı oluşturabilir ve TCC'yi herhangi bir uygulamaya herhangi bir TCC izni vermesi için kandırabilir.
Apple'ın, NFSHomeDirectory
niteliğindeki kullanıcının profilinde saklanan ayarı $HOME
değeri için kullandığını unutmayın, bu nedenle bu değeri değiştirme iznine sahip bir uygulamayı ele geçirirseniz (kTCCServiceSystemPolicySysAdminFiles
), bu seçeneği bir TCC bypass ile silahlandırabilirsiniz.
İlk POC, kullanıcının HOME klasörünü değiştirmek için dsexport ve dsimport kullanır.
Hedef uygulama için bir csreq blob alın.
Gerekli erişimle sahte bir TCC.db dosyası yerleştirin ve csreq blobunu ekleyin.
Kullanıcının Dizin Servisleri kaydını dsexport ile dışa aktarın.
Kullanıcının ana dizinini değiştirmek için Dizin Servisleri kaydını değiştirin.
Değiştirilen Dizin Servisleri kaydını dsimport ile içe aktarın.
Kullanıcının tccd sürecini durdurun ve süreci yeniden başlatın.
İkinci POC, com.apple.private.tcc.allow
değeri kTCCServiceSystemPolicySysAdminFiles
olan /usr/libexec/configd
kullanmıştır.
-t
seçeneği ile configd
çalıştırmak mümkün olduğundan, bir saldırgan yüklemek için özel bir Bundle belirtebilir. Bu nedenle, istismar, kullanıcının ana dizinini değiştirme yöntemini dsexport
ve dsimport
ile değiştiren bir configd
kod enjeksiyonu ile gerçekleştirilmiştir.
Daha fazla bilgi için orijinal rapora bakın.
Bir süreç içine kod enjekte etmenin ve TCC ayrıcalıklarını kötüye kullanmanın farklı teknikleri vardır:
macOS Process AbuseAyrıca, TCC'yi atlatmak için bulunan en yaygın süreç enjeksiyonu pluginler (load library) aracılığıyladır. Pluginler, genellikle kütüphaneler veya plist biçiminde olan ek kodlardır ve ana uygulama tarafından yüklenir ve onun bağlamında çalıştırılır. Bu nedenle, ana uygulama TCC kısıtlı dosyalara erişime sahip olduğunda (verilen izinler veya haklar aracılığıyla), özel kod da buna sahip olacaktır.
/System/Library/CoreServices/Applications/Directory Utility.app
uygulaması kTCCServiceSystemPolicySysAdminFiles
iznine sahipti, .daplug
uzantılı pluginler yükledi ve güçlendirilmiş çalışma zamanına sahip değildi.
Bu CVE'yi silahlandırmak için, NFSHomeDirectory
değiştirilir (önceki izni kötüye kullanarak) böylece kullanıcıların TCC veritabanını ele geçirebiliriz ve TCC'yi atlatabiliriz.
Daha fazla bilgi için orijinal rapora bakın.
İkili /usr/sbin/coreaudiod
com.apple.security.cs.disable-library-validation
ve com.apple.private.tcc.manager
izinlerine sahipti. İlk kod enjeksiyonuna izin verirken ikincisi TCC'yi yönetme erişimi sağlıyordu.
Bu ikili, /Library/Audio/Plug-Ins/HAL
klasöründen üçüncü taraf eklentileri yüklemeye izin veriyordu. Bu nedenle, bu PoC ile bir eklenti yüklemek ve TCC izinlerini kötüye kullanmak mümkündü:
Daha fazla bilgi için orijinal rapora bakın.
Core Media I/O aracılığıyla kamera akışını açan sistem uygulamaları (kTCCServiceCamera
ile uygulamalar) bu eklentileri /Library/CoreMediaIO/Plug-Ins/DAL
konumundan yükler (SIP kısıtlı değil).
Oraya ortak bir yapıcı ile bir kütüphane depolamak, kod enjekte etmek için işe yarayacaktır.
Birçok Apple uygulaması buna karşı savunmasızdı.
Firefox uygulaması com.apple.security.cs.disable-library-validation
ve com.apple.security.cs.allow-dyld-environment-variables
yetkilerine sahipti:
Daha fazla bilgi için orijinal rapora bakın.
İkili /system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl
com.apple.private.tcc.allow
ve com.apple.security.get-task-allow
yetkilerine sahipti, bu da sürece kod enjekte etmeye ve TCC ayrıcalıklarını kullanmaya olanak tanıyordu.
Telegram com.apple.security.cs.allow-dyld-environment-variables
ve com.apple.security.cs.disable-library-validation
yetkilerine sahipti, bu nedenle izinlerine erişim sağlamak için kötüye kullanılabiliyordu, örneğin kamerayla kayıt yapmak. Payload'ı yazımda bulabilirsiniz.
Bir kütüphaneyi yüklemek için env değişkeninin nasıl kullanılacağını not edin; bu kütüphaneyi enjekte etmek için özel bir plist oluşturuldu ve launchctl
kullanılarak başlatıldı:
Sandboxed olsalar bile open
komutunu çağırmak mümkündür.
Terminale Tam Disk Erişimi (FDA) vermek, teknoloji insanları tarafından kullanılan bilgisayarlarda oldukça yaygındır. Ve bununla .terminal
scriptlerini çağırmak mümkündür.
.terminal
scriptleri, CommandString
anahtarında yürütülecek komutla birlikte bu gibi plist dosyalarıdır:
Bir uygulama, /tmp gibi bir konumda bir terminal betiği yazabilir ve bunu şu şekilde başlatabilir:
Herhangi bir kullanıcı (hatta ayrıcalıksız olanlar bile) bir zaman makinesi anlık görüntüsü oluşturabilir ve monte edebilir ve o anlık görüntünün TÜM dosyalarına erişebilir.
Gerekli olan tek ayrıcalık, kullanılan uygulamanın (örneğin Terminal
) Tam Disk Erişimi (FDA) erişimine sahip olmasıdır (kTCCServiceSystemPolicyAllfiles
), bu da bir yönetici tarafından verilmelidir.
Daha ayrıntılı bir açıklama orijinal raporda bulunabilir.
TCC DB dosyası korunsa bile, yeni bir TCC.db dosyasını dizinin üzerine monte etmek mümkündü:
Check the full exploit in the original writeup.
The tool /usr/sbin/asr
allowed to copy the whole disk and mount it in another place bypassing TCC protections.
There is a third TCC database in /var/db/locationd/clients.plist
to indicate clients allowed to access location services.
The folder /var/db/locationd/
wasn't protected from DMG mounting so it was possible to mount our own plist.
In several occasions files will store sensitive information like emails, phone numbers, messages... in non protected locations (which count as a vulnerability in Apple).
This doesn't work anymore, but it did in the past:
Another way using CoreGraphics events:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)