macOS Dirty NIB
Reading time: 9 minutes
tip
Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Dirty NIB verwys na die misbruik van Interface Builder-lĂȘers (.xib/.nib) binne 'n ondertekende macOS-app-bundel om aanvaller-beheerde logika binne die teikenproses uit te voer, en sodoende sy entitlements en TCC-permissies te erf. Hierdie tegniek is oorspronklik gedokumenteer deur xpn (MDSec) en later gegeneraliseer en beduidend uitgebrei deur Sector7, wat ook Apple se mitigasies in macOS 13 Ventura en macOS 14 Sonoma behandel het. Vir agtergrond en diepgaande ontledings, sien die verwysings aan die einde.
TL;DR âą Before macOS 13 Ventura: replacing a bundleâs 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): firstâlaunch deep verification, bundle protection, Launch Constraints, and the new TCC âApp Managementâ permission largely prevent postâlaunch nib tampering by unrelated apps. Attacks may still be feasible in niche cases (e.g., sameâdeveloper tooling modifying own apps, or terminals granted App Management/Full Disk Access by the user).
Wat is NIB/XIB files
Nib (short for NeXT Interface Builder) files is geserialiseerde UI-objectgrafieke wat deur AppKit-apps gebruik word. Moderne Xcode stoor wysigbare XML .xib-lĂȘers wat by build-tyd na .nib gekompileer word. 'n Tipiese app laai sy hoof-UI via NSApplicationMain()
wat die NSMainNibFile
sleutel uit die app se Info.plist lees en die objekgrafiek by runtime instantiate.
Belangrike punte wat die aanval moontlik maak:
- NIB loading instantiate willekeurige ObjectiveâC-klasse sonder om te vereis dat hulle aan NSSecureCoding voldoen (Appleâs nib loader val terug op
init
/initWithFrame:
wanneerinitWithCoder:
nie beskikbaar is nie). - Cocoa Bindings kan misbruik word om metodes aan te roep terwyl nibs geĂŻnstantieer word, insluitend geketende oproepe wat geen gebruikersinteraksie vereis nie.
Dirty NIB injection process (attacker view)
Die klassieke preâVentura-vloei:
- Create a malicious .xib
- Voeg 'n
NSAppleScript
object by (of ander âgadgetâ klasse soosNSTask
). - Voeg 'n
NSTextField
by wie se title die payload bevat (bv., AppleScript of opdragargumente). - Voeg een of meer
NSMenuItem
objects by wat via bindings bedraad is om metodes op die teikenobject aan te roep.
- Autoâtrigger without user clicks
- Gebruik bindings om 'n menu-item se target/selector te stel en roep dan die private
_corePerformAction
metode aan sodat die aksie outomaties afvuur wanneer die nib laai. Dit verwyder die behoefte vir 'n gebruiker om op 'n knoppie te klik.
Minimal example of an autoâtrigger chain inside a .xib (abridged for clarity):
<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>
Dit bewerkstellig arbitrĂȘre AppleScriptâuitvoering in die teikenproses wanneer die nib gelaai word. Gevorderde kettings kan:
- Instansieer arbitrĂȘre AppKitâklasse (bv.,
NSTask
) en roep metodes sonder argumente soos-launch
. - Roep arbitrĂȘre selectors met objekargumente via die bindingâtruuk hierbo.
- Laai AppleScriptObjC.framework om na ObjectiveâC te brug en selfs gekose C APIs aan te roep.
- Op ouer stelsels wat steeds Python.framework insluit, brug na Python en gebruik dan
ctypes
om arbitrĂȘre Câfunksies aan te roep (Sector7âs research).
- Vervang die app se nib
- Kopieer target.app na 'n skryfbare ligging, vervang bv.
Contents/Resources/MainMenu.nib
met die kwaadwillige nib, en voer target.app uit. PreâVentura, na 'n eenmalige Gatekeeperâassessering, het daaropvolgende laaibeurte slegs oppervlakkige handtekeningkontroles uitgevoer, so nieâuitvoerbare hulpbronne (soos .nib) is nie weer gevalideer nie.
Example AppleScript payload for a visible test:
set theDialogText to "PWND"
display dialog theDialogText
Moderne macOS-beskermings (Ventura/Monterey/Sonoma/Sequoia)
Apple het verskeie sistemiese mitigasies bekendgestel wat die uitvoerbaarheid van Dirty NIB in moderne macOS drasties verminder:
- Eersteâaanvang diep verifikasie en bundelbeskerming (macOS 13 Ventura)
- On first run of any app (quarantined or not), a deep signature check covers all bundle resources. Afterwards, the bundle becomes protected: only apps from the same developer (or explicitly allowed by the app) may modify its contents. Other apps require the new TCC âApp Managementâ permission to write into another appâs bundle.
- Launch Constraints (macOS 13 Ventura)
- System/Appleâbundled apps canât be copied elsewhere and launched; this kills the âcopy to /tmp, patch, runâ approach for OS apps.
- Improvements in macOS 14 Sonoma
- Apple hardened App Management and fixed known bypasses (e.g., CVEâ2023â40450) noted by Sector7. Python.framework was removed earlier (macOS 12.3), breaking some privilegeâescalation chains.
- Gatekeeper/Quarantine changes
- For a broader discussion of Gatekeeper, provenance, and assessment changes that impacted this technique, see the page referenced below.
Praktiese implikasie âą Op Ventura+ kan jy oor die algemeen nie ân derdeâparty app se .nib wysig nie, tensy jou proses App Management het of deur dieselfde Team ID as die teiken geteken is (bv. developer tooling). âą Om App Management of Full Disk Access aan shells/terminals te verleen heropen effektief hierdie aanvalsvlak vir enigiets wat kode binne daardie terminal se konteks kan uitvoer.
Aanpak van Launch Constraints
Launch Constraints blokkeer die uitvoering van baie Appleâapps vanaf nieâstandaard liggings sedert Ventura. As jy op preâVentura werkvloei vertrou het soos om ân Appleâapp na ân temp directory te kopieer, MainMenu.nib
te wysig, en dit te loods, verwag dat dit op >= 13.0 sal misluk.
Enumerasie van teikens en nibs (nuttig vir navorsing / ouer stelsels)
- Vind apps waarvan die UI nibâgedrewe is:
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 {} +
- Vind kandidaat nib hulpbronne binne 'n bundel:
find target.app -type f \( -name "*.nib" -o -name "*.xib" \) -print
- Valideer code signatures deeglik (sal misluk as jy hulpbronne gemanipuleer het en nie weer re-sign het nie):
codesign --verify --deep --strict --verbose=4 target.app
Let op: Op moderne macOS sal jy ook deur bundleâbeskerming/TCC geblokkeer word as jy probeer in 'n ander app se bundle skryf sonder behoorlike magtiging.
Opsporing en DFIRâwenke
- LĂȘerâintegriteitsmonitering op bundleâhulpbronne
- Kyk uit vir mtime/ctimeâwysigings aan
Contents/Resources/*.nib
en ander nieâuitvoerbare hulpbronne in geĂŻnstalleerde apps. - Gekonsolideerde logs en prosesgedrag
- Moniteer vir onverwagte AppleScriptâuitvoering binne GUIâapps en vir prosesse wat AppleScriptObjC of Python.framework laai. Voorbeeld:
log stream --info --predicate 'processImagePath CONTAINS[cd] ".app/Contents/MacOS/" AND (eventMessage CONTAINS[cd] "AppleScript" OR eventMessage CONTAINS[cd] "loadAppleScriptObjectiveCScripts")'
- Proaktiewe assesserings
- Voer periodiek
codesign --verify --deep
oor kritieke apps uit om te verseker dat hulpbronne intak bly. - Privilegieâkonteks
- Kontroleer wie/wat TCC âApp Managementâ of Full Disk Access het (veral terminals en bestuursagenten). Deur hierdie toestemmings uit algemene shells te verwyder, voorkom jy dat Dirty NIBâstyl knoei triviaal weer geaktiveer word.
Verdedigende verharding (ontwikkelaars en verdedigers)
- Gebruik by voorkeur programmatiese UI of beperk wat uit nibs geĂŻnstantieer word. Vermy om kragtige klasse (bv.
NSTask
) in nibâgrafieke in te sluit en vermy bindings wat indirek selectors op ewekansige objekte aanroep. - Gebruik die hardened runtime met Library Validation (reeds standaard vir moderne apps). Al keer dit nibâinspuiting op sigself nie, blokkeer dit maklike native kodelading en dwing aanvalleerders na slegs skripâpayloads.
- Moet nie in algemene gereedskap wye App Managementâtoestemmings versoek of daarop staatmaak nie. As MDM App Management vereis, skei daardie konteks van gebruikerâgedrewe shells.
- Verifieer gereeld jou appâbundle se integriteit en maak jou opdateringsmeganismes selfherstellend vir bundleâhulpbronne.
Related reading in HackTricks
Lees meer oor Gatekeeper, kwarantyn en provenanceâveranderings wat hierdie tegniek beĂŻnvloed:
macOS Gatekeeper / Quarantine / XProtect
References
- xpn â DirtyNIB (oorspronklike uiteensetting met Pagesâvoorbeeld): 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/
tip
Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.