macOS Library Injection
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
Caution
dyldã®ã³ãŒãã¯ãªãŒãã³ãœãŒã¹ã§ãããhttps://opensource.apple.com/source/dyld/ã§èŠã€ããããšãã§ããURLã®ãããªãã®ã§tarãšããŠããŠã³ããŒãã§ããŸãïŒhttps://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz
Dyldããã»ã¹
Dyldããã€ããªå ã§ã©ã€ãã©ãªãã©ã®ããã«ããŒãããããèŠãŠã¿ãŸããã:
DYLD_INSERT_LIBRARIES
ããã¯Linuxã®LD_PRELOADã®ãããªãã®ã§ããç¹å®ã®ã©ã€ãã©ãªããã¹ããããŒãããããã«å®è¡ãããããã»ã¹ãæå®ããããšãã§ããŸãïŒç°å¢å€æ°ãæå¹ãªå ŽåïŒã
ãã®æè¡ã¯ããã¹ãŠã®ã€ã³ã¹ããŒã«ãããã¢ããªã±ãŒã·ã§ã³ã«ãInfo.plistããšåŒã°ããplistããããLSEnvironmentalãšããããŒã䜿çšããŠç°å¢å€æ°ãå²ãåœãŠãããšãã§ãããããASEPæè¡ãšããŠã䜿çšãããå¯èœæ§ããããŸãã
Tip
2012幎以éãAppleã¯
DYLD_INSERT_LIBRARIESã®æš©éãå€§å¹ ã«å¶éããŸãããã³ãŒãã確èªãã**
src/dyld.cppããã§ãã¯ããŠãã ããã颿°pruneEnvironmentVariablesã§ã¯ãDYLD_***倿°ãåé€ãããããšãããããŸãã颿°**
processRestricted**ã§ã¯ãå¶éã®çç±ãèšå®ãããŸãããã®ã³ãŒãã確èªãããšãçç±ã¯æ¬¡ã®ãšããã§ãïŒ
- ãã€ããªã
setuid/setgidã§ãã- machoãã€ããªã«
__RESTRICT/__restrictã»ã¯ã·ã§ã³ãååšãã- ãœãããŠã§ã¢ã
com.apple.security.cs.allow-dyld-environment-variablesæš©éãªãã«æš©éãæã£ãŠããïŒããŒãã³ãããã©ã³ã¿ã€ã ïŒ- ãã€ããªã®æš©éã確èªããã«ã¯ïŒ
codesign -dv --entitlements :- </path/to/bin>ããæ°ããããŒãžã§ã³ã§ã¯ããã®ããžãã¯ã¯é¢æ°**
configureProcessRestrictionsã®åŸåéšåã«ãããŸãããã ããæ°ããããŒãžã§ã³ã§å®è¡ãããã®ã¯ã颿°ã®æåã®ãã§ãã¯**ã§ãïŒiOSãã·ãã¥ã¬ãŒã·ã§ã³ã«é¢é£ããifãåé€ã§ããŸãããããã¯macOSã§ã¯äœ¿çšãããŸããïŒã
ã©ã€ãã©ãªã®æ€èšŒ
ãã€ããªã**DYLD_INSERT_LIBRARIES**ç°å¢å€æ°ã®äœ¿çšãèš±å¯ããŠããŠãããã€ããªãã©ã€ãã©ãªã®çœ²åããã§ãã¯ããå Žåãã«ã¹ã¿ã ã©ã€ãã©ãªã¯ããŒããããŸããã
ã«ã¹ã¿ã ã©ã€ãã©ãªãããŒãããã«ã¯ããã€ããªã次ã®ããããã®æš©éãæã£ãŠããå¿ èŠããããŸãïŒ
com.apple.security.cs.disable-library-validationcom.apple.private.security.clear-library-validation
ãŸãã¯ããã€ããªã¯ããŒãã³ãããã©ã³ã¿ã€ã ãã©ã°ãŸãã¯ã©ã€ãã©ãªæ€èšŒãã©ã°ãæã£ãŠããªãå¿ èŠããããŸãã
ãã€ããªãããŒãã³ãããã©ã³ã¿ã€ã ãæã£ãŠãããã©ããã¯ãcodesign --display --verbose <bin>ã䜿çšããŠãCodeDirectoryå
ã®ãã©ã°runtimeã確èªã§ããŸãïŒCodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded
ãã€ããªãšåãèšŒææžã§çœ²åãããã©ã€ãã©ãªãããŒãããããšãã§ããŸãã
ãã®æ¹æ³ãïŒæªçšïŒããäŸãèŠã€ããå¶éã確èªããã«ã¯ïŒ
macOS Dyld Hijacking & DYLD_INSERT_LIBRARIES
Dylibãã€ãžã£ãã¯
Caution
以åã®ã©ã€ãã©ãªæ€èšŒå¶éãDylibãã€ãžã£ãã¯æ»æãå®è¡ããããã«é©çšãããããšãå¿ããªãã§ãã ããã
Windowsãšåæ§ã«ãMacOSã§ãdylibsããã€ãžã£ãã¯ããŠã¢ããªã±ãŒã·ã§ã³ãä»»æã®ã³ãŒããå®è¡ããããšãã§ããŸãïŒå®éã«ã¯ãéåžžã®ãŠãŒã¶ãŒããã¯äžå¯èœãããããŸããã.appãã³ãã«å
ã«æžã蟌ãããã«TCCã®æš©éãå¿
èŠã«ãªãå¯èœæ§ããããŸãïŒã
ãã ããMacOSã¢ããªã±ãŒã·ã§ã³ãã©ã€ãã©ãªãããŒãããæ¹æ³ã¯Windowsãããå¶éãããŠããŸããããã¯ããã«ãŠã§ã¢éçºè
ããã®æè¡ãé 坿§ã®ããã«äœ¿çšã§ããå¯èœæ§ãããããšãæå³ããŸãããæš©éãææ Œãããããã«æªçšã§ããå¯èœæ§ã¯ã¯ããã«äœãã§ãã
ãŸã第äžã«ãMacOSãã€ããªãã©ã€ãã©ãªãããŒãããããã«ãã«ãã¹ã瀺ãããšãããäžè¬çã§ãã第äºã«ãMacOSã¯ã©ã€ãã©ãªã®ããã«$PATHã®ãã©ã«ããæ€çŽ¢ããŸããã
ãã®æ©èœã«é¢é£ããã³ãŒãã®äž»ãªéšåã¯ãImageLoader.cppã®**ImageLoader::recursiveLoadLibraries**ã«ãããŸãã
machoãã€ããªãã©ã€ãã©ãªãããŒãããããã«äœ¿çšã§ãã4ã€ã®ç°ãªãããããŒã³ãã³ãããããŸãïŒ
- **
LC_LOAD_DYLIB**ã³ãã³ãã¯dylibãããŒãããããã®äžè¬çãªã³ãã³ãã§ãã - **
LC_LOAD_WEAK_DYLIB**ã³ãã³ãã¯åã®ãã®ãšåæ§ã«æ©èœããŸãããdylibãèŠã€ãããªãå Žåãå®è¡ã¯ãšã©ãŒãªãã§ç¶è¡ãããŸãã - **
LC_REEXPORT_DYLIB**ã³ãã³ãã¯ãç°ãªãã©ã€ãã©ãªããã·ã³ãã«ããããã·ïŒãŸãã¯åãšã¯ã¹ããŒãïŒããŸãã - **
LC_LOAD_UPWARD_DYLIB**ã³ãã³ãã¯ã2ã€ã®ã©ã€ãã©ãªãäºãã«äŸåããŠããå Žåã«äœ¿çšãããŸãïŒããã¯_äžåãäŸåé¢ä¿_ãšåŒã°ããŸãïŒã
ãã ããdylibãã€ãžã£ãã¯ã«ã¯2çš®é¡ãããŸãïŒ
- æ¬ èœããŠãã匱ãªã³ã¯ã©ã€ãã©ãªïŒããã¯ãã¢ããªã±ãŒã·ã§ã³ãLC_LOAD_WEAK_DYLIBã§æ§æãããååšããªãã©ã€ãã©ãªãããŒãããããšããããšãæå³ããŸããæ¬¡ã«ãæ»æè ãdylibãæåŸ ãããå Žæã«é 眮ãããšããããããŒããããŸãã
- ãªã³ã¯ãã匱ãããšããããšã¯ãã©ã€ãã©ãªãèŠã€ãããªããŠãã¢ããªã±ãŒã·ã§ã³ã¯å®è¡ãç¶ããããšãæå³ããŸãã
- ããã«é¢é£ããã³ãŒãã¯ã
ImageLoaderMachO::doGetDependentLibrariesã®é¢æ°å ã«ãããlib->requiredã¯**LC_LOAD_WEAK_DYLIB**ãtrueã®ãšãã®ã¿falseã§ãã - ãã€ããªå ã®åŒ±ãªã³ã¯ã©ã€ãã©ãªãèŠã€ããã«ã¯ïŒåŸã§ãã€ãžã£ãã¯ã©ã€ãã©ãªãäœæããæ¹æ³ã®äŸããããŸãïŒïŒ
-
otool -l </path/to/bin> | grep LC_LOAD_WEAK_DYLIB -A 5 cmd LC_LOAD_WEAK_DYLIB cmdsize 56 name /var/tmp/lib/libUtl.1.dylib (offset 24) time stamp 2 Wed Jun 21 12:23:31 1969 current version 1.0.0 compatibility version 1.0.0
- **@rpathã§æ§æããã**ïŒMach-Oãã€ããªã¯**`LC_RPATH`**ããã³**`LC_LOAD_DYLIB`**ã³ãã³ããæã€ããšãã§ããŸãããããã®ã³ãã³ãã®**å€**ã«åºã¥ããŠã**ã©ã€ãã©ãª**ã¯**ç°ãªããã£ã¬ã¯ããª**ãã**ããŒã**ãããŸãã
- **`LC_RPATH`**ã¯ããã€ããªã«ãã£ãŠã©ã€ãã©ãªãããŒãããããã«äœ¿çšãããããã€ãã®ãã©ã«ãã®ãã¹ãå«ã¿ãŸãã
- **`LC_LOAD_DYLIB`**ã¯ãããŒãããç¹å®ã®ã©ã€ãã©ãªãžã®ãã¹ãå«ã¿ãŸãããããã®ãã¹ã«ã¯**`@rpath`**ãå«ãŸããå Žåãããã**`LC_RPATH`**ã®å€ã§**眮ãæããããŸã**ã**`LC_RPATH`**ã«è€æ°ã®ãã¹ãããå Žåããã¹ãŠãã©ã€ãã©ãªãããŒãããããã«äœ¿çšãããŸããäŸïŒ
- **`LC_LOAD_DYLIB`**ã«`@rpath/library.dylib`ãå«ãŸãã**`LC_RPATH`**ã«`/application/app.app/Contents/Framework/v1/`ããã³`/application/app.app/Contents/Framework/v2/`ãå«ãŸããŠããå Žåãäž¡æ¹ã®ãã©ã«ãã`library.dylib`ãããŒãããããã«äœ¿çšãããŸãã**`[...] /v1/`ã«ã©ã€ãã©ãªãååšããªãå Žåãæ»æè
ã¯ããã«é
眮ããŠ`[...] /v2/`ã®ã©ã€ãã©ãªã®ããŒãããã€ãžã£ãã¯ã§ããŸãã** **`LC_LOAD_DYLIB`**ã®ãã¹ã®é åºãå®ãããŸãã
- ãã€ããªå
ã®**rpathãã¹ãšã©ã€ãã©ãªãèŠã€ãã**ã«ã¯ïŒ`otool -l </path/to/binary> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5`
> [!NOTE] > **`@executable_path`**ïŒã¯**ã¡ã€ã³å®è¡ãã¡ã€ã«**ãå«ããã£ã¬ã¯ããªãžã®**ãã¹**ã§ãã
>
> **`@loader_path`**ïŒã¯**ããŒãã³ãã³ã**ãå«ã**Mach-Oãã€ããª**ãå«ã**ãã£ã¬ã¯ããª**ãžã®**ãã¹**ã§ãã
>
> - å®è¡å¯èœãã¡ã€ã«ã§äœ¿çšãããå Žåã**`@loader_path`**ã¯å®è³ªçã«**`@executable_path`**ãšåãã§ãã
> - **dylib**ã§äœ¿çšãããå Žåã**`@loader_path`**ã¯**dylib**ãžã®**ãã¹**ãæäŸããŸãã
ãã®æ©èœãæªçšããŠ**æš©éãææ Œããã**æ¹æ³ã¯ã**root**ã«ãã£ãŠå®è¡ãããŠãã**ã¢ããªã±ãŒã·ã§ã³**ããæ»æè
ãæžãèŸŒã¿æš©éãæã€ãã©ã«ãå
ã®**ã©ã€ãã©ãªãæ¢ããŠãã**ãšããçšãªã±ãŒã¹ã§ãã
> [!TIP]
> ã¢ããªã±ãŒã·ã§ã³å
ã®**æ¬ èœããŠããã©ã€ãã©ãª**ãèŠã€ããããã®åªãã**ã¹ãã£ããŒ**ã¯[**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html)ãŸãã¯[**CLIããŒãžã§ã³**](https://github.com/pandazheng/DylibHijack)ã§ãã\
> ãã®æè¡ã«é¢ãã**æè¡ç詳现ãå«ãåªããã¬ããŒã**ã¯[**ãã¡ã**](https://www.virusbulletin.com/virusbulletin/2015/03/dylib-hijacking-os-x)ã§èŠã€ããããšãã§ããŸãã
**äŸ**
<a class="content_ref" href="macos-dyld-hijacking-and-dyld_insert_libraries.md"><span class="content_ref_label">macOS Dyld Hijacking & DYLD_INSERT_LIBRARIES</span></a>
## Dlopenãã€ãžã£ãã¯
> [!CAUTION]
> **以åã®ã©ã€ãã©ãªæ€èšŒå¶éãDlopenãã€ãžã£ãã¯æ»æãå®è¡ããããã«é©çšãããããšãå¿ããªãã§ãã ãã**ã
**`man dlopen`**ããïŒ
- ãã¹ã«**ã¹ã©ãã·ã¥æåãå«ãŸããŠããªã**å ŽåïŒã€ãŸããåãªããªãŒãåã®å ŽåïŒã**dlopen()ã¯æ€çŽ¢ãè¡ããŸã**ã**`$DYLD_LIBRARY_PATH`**ãèµ·åæã«èšå®ãããŠããå Žåãdyldã¯æåã«ãã®ãã£ã¬ã¯ããªã**æ¢ããŸã**ãæ¬¡ã«ãåŒã³åºãå
ã®mach-oãã¡ã€ã«ãŸãã¯ã¡ã€ã³å®è¡å¯èœãã¡ã€ã«ã**`LC_RPATH`**ãæå®ããŠããå Žåãdyldã¯**ãããã®**ãã£ã¬ã¯ããªã**æ¢ããŸã**ãæ¬¡ã«ãããã»ã¹ã**å¶éãããŠããªã**å Žåãdyldã¯**çŸåšã®äœæ¥ãã£ã¬ã¯ããª**ãæ€çŽ¢ããŸããæåŸã«ãå€ããã€ããªã®å Žåãdyldã¯ããã€ãã®ãã©ãŒã«ããã¯ã詊ã¿ãŸãã**`$DYLD_FALLBACK_LIBRARY_PATH`**ãèµ·åæã«èšå®ãããŠããå Žåãdyldã¯**ãããã®ãã£ã¬ã¯ããª**ãæ€çŽ¢ããŸããããã§ãªãå Žåãdyldã¯**`/usr/local/lib/`**ïŒããã»ã¹ãå¶éãããŠããªãå ŽåïŒãæ€çŽ¢ãããã®åŸ**`/usr/lib/`**ãæ€çŽ¢ããŸãïŒãã®æ
å ±ã¯**`man dlopen`**ããååŸãããŸããïŒã
1. `$DYLD_LIBRARY_PATH`
2. `LC_RPATH`
3. `CWD`ïŒå¶éãããŠããªãå ŽåïŒ
4. `$DYLD_FALLBACK_LIBRARY_PATH`
5. `/usr/local/lib/`ïŒå¶éãããŠããªãå ŽåïŒ
6. `/usr/lib/`
> [!CAUTION]
> ååã«ã¹ã©ãã·ã¥ããªãå Žåããã€ãžã£ãã¯ãè¡ãæ¹æ³ã¯2ã€ãããŸãïŒ
>
> - ããããã®**`LC_RPATH`**ã**æžã蟌ã¿å¯èœ**ã§ããå ŽåïŒãã ã眲åããã§ãã¯ããããããããã«ã¯ãã€ããªãå¶éãããŠããªãå¿
èŠããããŸãïŒ
> - ãã€ããªã**å¶éãããŠããªã**å ŽåãCWDããäœããããŒãããããšãå¯èœã§ãïŒãŸãã¯åè¿°ã®ç°å¢å€æ°ã®ãããããæªçšããããšãã§ããŸãïŒ
- ãã¹ã**ãã¬ãŒã ã¯ãŒã¯ã®ããã«èŠãã**å ŽåïŒäŸïŒ`/stuff/foo.framework/foo`ïŒã**`$DYLD_FRAMEWORK_PATH`**ãèµ·åæã«èšå®ãããŠããå Žåãdyldã¯æåã«ãã®ãã£ã¬ã¯ããªã§**ãã¬ãŒã ã¯ãŒã¯éšåãã¹**ïŒäŸïŒ`foo.framework/foo`ïŒãæ¢ããŸããæ¬¡ã«ãdyldã¯**æäŸããããã¹ããã®ãŸãŸ**詊ã¿ãŸãïŒçžå¯Ÿãã¹ã®å Žåã¯çŸåšã®äœæ¥ãã£ã¬ã¯ããªã䜿çšïŒãæåŸã«ãå€ããã€ããªã®å Žåãdyldã¯ããã€ãã®ãã©ãŒã«ããã¯ã詊ã¿ãŸãã**`$DYLD_FALLBACK_FRAMEWORK_PATH`**ãèµ·åæã«èšå®ãããŠããå Žåãdyldã¯ãããã®ãã£ã¬ã¯ããªãæ€çŽ¢ããŸããããã§ãªãå Žåã**`/Library/Frameworks`**ïŒmacOSã§ããã»ã¹ãå¶éãããŠããªãå ŽåïŒã次ã«**`/System/Library/Frameworks`**ãæ€çŽ¢ããŸãã
1. `$DYLD_FRAMEWORK_PATH`
2. æäŸããããã¹ïŒå¶éãããŠããªãå Žåã¯çžå¯Ÿãã¹ã«çŸåšã®äœæ¥ãã£ã¬ã¯ããªã䜿çšïŒ
3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
4. `/Library/Frameworks`ïŒå¶éãããŠããªãå ŽåïŒ
5. `/System/Library/Frameworks`
> [!CAUTION]
> ãã¬ãŒã ã¯ãŒã¯ãã¹ã®å Žåããã€ãžã£ãã¯ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãïŒ
>
> - ããã»ã¹ã**å¶éãããŠããªã**å ŽåãCWDããã®**çžå¯Ÿãã¹**ãæªçšããããšãã§ããŸããåè¿°ã®ç°å¢å€æ°ïŒããã»ã¹ãå¶éãããŠããå ŽåãDYLD_*ç°å¢å€æ°ã¯åé€ããããããããã¥ã¡ã³ãã«ã¯èšèŒãããŠããŸããïŒã
- ãã¹ã«**ã¹ã©ãã·ã¥ãå«ãŸããŠããããã¬ãŒã ã¯ãŒã¯ãã¹ã§ã¯ãªã**å ŽåïŒã€ãŸããdylibãžã®ãã«ãã¹ãŸãã¯éšåãã¹ïŒãdlopen()ã¯æåã«ïŒèšå®ãããŠããå ŽåïŒ**`$DYLD_LIBRARY_PATH`**ã§ïŒãã¹ã®ãªãŒãéšåã䜿çšããŠïŒæ¢ããŸããæ¬¡ã«ãdyldã¯**æäŸããããã¹ã詊ã¿ãŸã**ïŒçžå¯Ÿãã¹ã®å Žåã¯çŸåšã®äœæ¥ãã£ã¬ã¯ããªã䜿çšããŸãããå¶éãããŠããªãããã»ã¹ã®å Žåã®ã¿ïŒãæåŸã«ãå€ããã€ããªã®å Žåãdyldã¯ãã©ãŒã«ããã¯ã詊ã¿ãŸãã**`$DYLD_FALLBACK_LIBRARY_PATH`**ãèµ·åæã«èšå®ãããŠããå Žåãdyldã¯ãããã®ãã£ã¬ã¯ããªãæ€çŽ¢ããŸããããã§ãªãå Žåãdyldã¯**`/usr/local/lib/`**ïŒããã»ã¹ãå¶éãããŠããªãå ŽåïŒãæ€çŽ¢ãããã®åŸ**`/usr/lib/`**ãæ€çŽ¢ããŸãã
1. `$DYLD_LIBRARY_PATH`
2. æäŸããããã¹ïŒå¶éãããŠããªãå Žåã¯çžå¯Ÿãã¹ã«çŸåšã®äœæ¥ãã£ã¬ã¯ããªã䜿çšïŒ
3. `$DYLD_FALLBACK_LIBRARY_PATH`
4. `/usr/local/lib/`ïŒå¶éãããŠããªãå ŽåïŒ
5. `/usr/lib/`
> [!CAUTION]
> ååã«ã¹ã©ãã·ã¥ãããããã¬ãŒã ã¯ãŒã¯ã§ãªãå Žåããã€ãžã£ãã¯ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãïŒ
>
> - ãã€ããªã**å¶éãããŠããªã**å ŽåãCWDãŸãã¯`/usr/local/lib`ããäœããããŒãããããšãå¯èœã§ãïŒãŸãã¯åè¿°ã®ç°å¢å€æ°ã®ãããããæªçšããããšãã§ããŸãïŒã
> [!TIP]
> 泚æïŒ**dlopenæ€çŽ¢ãå¶åŸ¡ãã**ããã®èšå®ãã¡ã€ã«ã¯**ãããŸãã**ã
>
> 泚æïŒã¡ã€ã³å®è¡å¯èœãã¡ã€ã«ã**set\[ug]idãã€ããªãŸãã¯æš©éã§ã³ãŒããµã€ã³ãããŠãã**å Žåã**ãã¹ãŠã®ç°å¢å€æ°ã¯ç¡èŠãã**ããã«ãã¹ã®ã¿ã䜿çšã§ããŸãïŒè©³çްæ
å ±ã«ã€ããŠã¯[DYLD_INSERT_LIBRARIESå¶éã確èªããŠãã ãã](macos-dyld-hijacking-and-dyld_insert_libraries.md#check-dyld_insert_librery-restrictions)ïŒã
>
> 泚æïŒAppleãã©ãããã©ãŒã ã¯ã32ããããš64ãããã®ã©ã€ãã©ãªãçµã¿åãããããã«ããŠãããŒãµã«ããã¡ã€ã«ã䜿çšããŸããããã¯ã**32ããããš64ãããã®æ€çŽ¢ãã¹ãå¥ã
ã«ååšããªã**ããšãæå³ããŸãã
>
> 泚æïŒAppleãã©ãããã©ãŒã ã§ã¯ãã»ãšãã©ã®OS dylibã**dyldãã£ãã·ã¥ã«çµ±åãã**ããã£ã¹ã¯äžã«ã¯ååšããŸããããããã£ãŠãOS dylibãååšãããã©ãããäºå確èªããããã«**`stat()`**ãåŒã³åºãããšã¯**æ©èœããŸãã**ããã ãã**`dlopen_preflight()`**ã¯ãäºææ§ã®ããmach-oãã¡ã€ã«ãèŠã€ããããã«**`dlopen()`**ãšåãæé ã䜿çšããŸãã
**ãã¹ã確èªãã**
次ã®ã³ãŒãã䜿çšããŠããã¹ãŠã®ãªãã·ã§ã³ã確èªããŸãããïŒ
```c
// gcc dlopentest.c -o dlopentest -Wl,-rpath,/tmp/test
#include <dlfcn.h>
#include <stdio.h>
int main(void)
{
void* handle;
fprintf("--- No slash ---\n");
handle = dlopen("just_name_dlopentest.dylib",1);
if (!handle) {
fprintf(stderr, "Error loading: %s\n\n\n", dlerror());
}
fprintf("--- Relative framework ---\n");
handle = dlopen("a/framework/rel_framework_dlopentest.dylib",1);
if (!handle) {
fprintf(stderr, "Error loading: %s\n\n\n", dlerror());
}
fprintf("--- Abs framework ---\n");
handle = dlopen("/a/abs/framework/abs_framework_dlopentest.dylib",1);
if (!handle) {
fprintf(stderr, "Error loading: %s\n\n\n", dlerror());
}
fprintf("--- Relative Path ---\n");
handle = dlopen("a/folder/rel_folder_dlopentest.dylib",1);
if (!handle) {
fprintf(stderr, "Error loading: %s\n\n\n", dlerror());
}
fprintf("--- Abs Path ---\n");
handle = dlopen("/a/abs/folder/abs_folder_dlopentest.dylib",1);
if (!handle) {
fprintf(stderr, "Error loading: %s\n\n\n", dlerror());
}
return 0;
}
ããã³ã³ãã€ã«ããŠå®è¡ãããšãåã©ã€ãã©ãªãã©ãã§èŠã€ãããªãã£ãããèŠãããšãã§ããŸãããŸããFSãã°ããã£ã«ã¿ãªã³ã°ããããšãã§ããŸã:
sudo fs_usage | grep "dlopentest"
çžå¯Ÿãã¹ãã€ãžã£ãã¯
ç¹æš©ã®ãããã€ããª/ã¢ããªïŒSUIDã匷åãªæš©éãæã€ãã€ããªãªã©ïŒãçžå¯Ÿãã¹ã©ã€ãã©ãªïŒäŸãã°ã@executable_pathã@loader_pathã䜿çšïŒãèªã¿èŸŒãã§ãããã©ã€ãã©ãªæ€èšŒãç¡å¹ã«ãªã£ãŠããå Žåãæ»æè
ããã€ããªãç§»åãããçžå¯Ÿãã¹ã§èªã¿èŸŒãŸããã©ã€ãã©ãªã倿Žããããã»ã¹ã«ã³ãŒããæ³šå
¥ããããšãå¯èœã«ãªããããããŸããã
DYLD_*ããã³LD_LIBRARY_PATHç°å¢å€æ°ã®åé€
ãã¡ã€ã«dyld-dyld-832.7.1/src/dyld2.cppã«ã¯ã**pruneEnvironmentVariablesãšãã颿°ããããDYLD_ã§å§ãŸãç°å¢å€æ°ãšLD_LIBRARY_PATH=**ãåé€ããŸãã
ãã®é¢æ°ã¯ãç¹ã«suidããã³sgidãã€ããªã®ããã«ãç°å¢å€æ°**DYLD_FALLBACK_FRAMEWORK_PATHãšDYLD_FALLBACK_LIBRARY_PATHãnull**ã«èšå®ããŸãã
ãã®é¢æ°ã¯ãOSXãã¿ãŒã²ããã«ããå Žåãåããã¡ã€ã«ã®**_main**颿°ããåŒã³åºãããŸãã
#if TARGET_OS_OSX
if ( !gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache ) {
pruneEnvironmentVariables(envp, &apple);
ãã®ããŒã«ãã©ã°ã¯ãã³ãŒãå ã®åããã¡ã€ã«ã«èšå®ãããŠããŸã:
#if TARGET_OS_OSX
// support chrooting from old kernel
bool isRestricted = false;
bool libraryValidation = false;
// any processes with setuid or setgid bit set or with __RESTRICT segment is restricted
if ( issetugid() || hasRestrictedSegment(mainExecutableMH) ) {
isRestricted = true;
}
bool usingSIP = (csr_check(CSR_ALLOW_TASK_FOR_PID) != 0);
uint32_t flags;
if ( csops(0, CS_OPS_STATUS, &flags, sizeof(flags)) != -1 ) {
// On OS X CS_RESTRICT means the program was signed with entitlements
if ( ((flags & CS_RESTRICT) == CS_RESTRICT) && usingSIP ) {
isRestricted = true;
}
// Library Validation loosens searching but requires everything to be code signed
if ( flags & CS_REQUIRE_LV ) {
isRestricted = false;
libraryValidation = true;
}
}
gLinkContext.allowAtPaths = !isRestricted;
gLinkContext.allowEnvVarsPrint = !isRestricted;
gLinkContext.allowEnvVarsPath = !isRestricted;
gLinkContext.allowEnvVarsSharedCache = !libraryValidation || !usingSIP;
gLinkContext.allowClassicFallbackPaths = !isRestricted;
gLinkContext.allowInsertFailures = false;
gLinkContext.allowInterposing = true;
ãã€ããªãsuidãŸãã¯sgidã§ããããããããŒã«RESTRICTã»ã°ã¡ã³ããããããCS_RESTRICTãã©ã°ã§çœ²åãããŠããå Žåã**!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache**ãçãšãªããç°å¢å€æ°ã¯åé€ãããŸãã
CS_REQUIRE_LVãçã§ããå Žåã倿°ã¯åé€ãããŸããããã©ã€ãã©ãªã®æ€èšŒã¯ããããå ã®ãã€ããªãšåãèšŒææžã䜿çšããŠãããã©ããã確èªããŸãã
å¶éã®ç¢ºèª
SUID & SGID
# Make it owned by root and suid
sudo chown root hello
sudo chmod +s hello
# Insert the library
DYLD_INSERT_LIBRARIES=inject.dylib ./hello
# Remove suid
sudo chmod -s hello
ã»ã¯ã·ã§ã³ __RESTRICT ãšã»ã°ã¡ã³ã __restrict
gcc -sectcreate __RESTRICT __restrict /dev/null hello.c -o hello-restrict
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-restrict
Hardened runtime
Keychainã«æ°ããèšŒææžãäœæããããã䜿çšããŠãã€ããªã«çœ²åããŸã:
# Apply runtime proetction
codesign -s <cert-name> --option=runtime ./hello
DYLD_INSERT_LIBRARIES=inject.dylib ./hello #Library won't be injected
# Apply library validation
codesign -f -s <cert-name> --option=library ./hello
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed #Will throw an error because signature of binary and library aren't signed by same cert (signs must be from a valid Apple-signed developer certificate)
# Sign it
## If the signature is from an unverified developer the injection will still work
## If it's from a verified developer, it won't
codesign -f -s <cert-name> inject.dylib
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed
# Apply CS_RESTRICT protection
codesign -f -s <cert-name> --option=restrict hello-signed
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
Caution
泚æããŠãã ããã
0x0(none)ãã©ã°ã§çœ²åããããã€ããªããã£ãŠããå®è¡æã«CS_RESTRICTãã©ã°ãåçã«èšå®ãããå¯èœæ§ãããããããã®æè¡ã¯ãããã«ã¯é©çšã§ããŸãããããã»ã¹ããã®ãã©ã°ãæã£ãŠãããã©ããã¯ã(get csops here) ã§ç¢ºèªã§ããŸãïŒ
csops -status <pid>ãã®åŸããã©ã° 0x800 ãæå¹ã«ãªã£ãŠãããã©ããã確èªããŸãã
References
- https://theevilbit.github.io/posts/dyld_insert_libraries_dylib_injection_in_macos_osx_deep_dive/
- *OS Internals, Volume I: User Mode. By Jonathan Levin
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


