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 ์ง€์›ํ•˜๊ธฐ

Caution

dyld์˜ ์ฝ”๋“œ๊ฐ€ ์˜คํ”ˆ ์†Œ์Šค์ด๋ฉฐ https://opensource.apple.com/source/dyld/์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ URL์„ ์‚ฌ์šฉํ•˜์—ฌ tar๋กœ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz

Dyld ํ”„๋กœ์„ธ์Šค

Dyld๊ฐ€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋‚ด์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์„ธ์š”:

macOS Dyld Process

DYLD_INSERT_LIBRARIES

์ด๊ฒƒ์€ Linux์˜ LD_PRELOAD์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‹คํ–‰๋  ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŠน์ • ๊ฒฝ๋กœ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜๋„๋ก ์ง€์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค(ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ).

์ด ๊ธฐ์ˆ ์€ ๋ชจ๋“  ์„ค์น˜๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด โ€œInfo.plistโ€œ๋ผ๋Š” plist๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” 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 ํ•จ์ˆ˜์˜ ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ์‹  ๋ฒ„์ „์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์€ ํ•จ์ˆ˜์˜ ์‹œ์ž‘ ๊ฒ€์‚ฌ์ž…๋‹ˆ๋‹ค(์ด๊ฒƒ์€ macOS์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ iOS ๋˜๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜๊ณผ ๊ด€๋ จ๋œ if๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒ€์ฆ

๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ DYLD_INSERT_LIBRARIES ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋”๋ผ๋„, ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋กœ๋“œํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„œ๋ช…์„ ํ™•์ธํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜๋ ค๋ฉด ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋‹ค์Œ ๊ถŒํ•œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค:

๋˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๊ฐ•ํ™”๋œ ๋Ÿฐํƒ€์ž„ ํ”Œ๋ž˜๊ทธ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒ€์ฆ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”์ด๋„ˆ๋ฆฌ์— ๊ฐ•ํ™”๋œ ๋Ÿฐํƒ€์ž„์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด codesign --display --verbose <bin>์„ ์‚ฌ์šฉํ•˜์—ฌ **CodeDirectory**์—์„œ ํ”Œ๋ž˜๊ทธ ๋Ÿฐํƒ€์ž„์„ ํ™•์ธํ•˜์„ธ์š”: 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๋ฅผ ํ•˜์ด์žฌํ‚นํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์‚ฌ์‹ค ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” TCC ๊ถŒํ•œ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ .app ๋ฒˆ๋“ค ๋‚ด์—์„œ ์“ฐ๊ธฐ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•˜์ด์žฌํ‚น์ด ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
๊ทธ๋Ÿฌ๋‚˜ MacOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ์‹์€ Windows๋ณด๋‹ค ๋” ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์•…์„ฑ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์—ฌ์ „ํžˆ ์ด ๊ธฐ์ˆ ์„ ์€ํ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ถŒํ•œ ์ƒ์Šน์„ ์•…์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์€ ํ›จ์”ฌ ๋‚ฎ์Šต๋‹ˆ๋‹ค.

์šฐ์„ , MacOS ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋กœ๋“œํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๋‘˜์งธ, MacOS๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์œ„ํ•ด $PATH์˜ ํด๋”๋ฅผ ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ์ฃผ์š” ์ฝ”๋“œ๋Š” **ImageLoader::recursiveLoadLibraries**์— ์žˆ์Šต๋‹ˆ๋‹ค ImageLoader.cpp.

macho ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” 4๊ฐ€์ง€ ๋‹ค๋ฅธ ํ—ค๋” ๋ช…๋ น์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • LC_LOAD_DYLIB ๋ช…๋ น์€ dylib๋ฅผ ๋กœ๋“œํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ช…๋ น์ž…๋‹ˆ๋‹ค.
  • LC_LOAD_WEAK_DYLIB ๋ช…๋ น์€ ์ด์ „ ๋ช…๋ น๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, dylib๊ฐ€ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜ ์—†์ด ์‹คํ–‰์ด ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.
  • LC_REEXPORT_DYLIB ๋ช…๋ น์€ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธฐํ˜ธ๋ฅผ ํ”„๋ก์‹œ(๋˜๋Š” ์žฌ์ˆ˜์ถœ)ํ•ฉ๋‹ˆ๋‹ค.
  • LC_LOAD_UPWARD_DYLIB ๋ช…๋ น์€ ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„œ๋กœ ์˜์กดํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค(์ด๋ฅผ _์ƒํ–ฅ ์˜์กด์„ฑ_์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค).

๊ทธ๋Ÿฌ๋‚˜ 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/`์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋“œ๋ฅผ ํ•˜์ด์žฌํ‚นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.**
- **๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ 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**์˜ **๊ฒฝ๋กœ**๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์•…์šฉํ•˜์—ฌ **๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•**์€ **๋ฃจํŠธ**์— ์˜ํ•ด ์‹คํ–‰๋˜๋Š” **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜**์ด ๊ณต๊ฒฉ์ž๊ฐ€ ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ํด๋”์—์„œ **๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ๋Š”** ๋“œ๋ฌธ ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

> [!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๋Š” ๋จผ์ € **ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ**๋ฅผ **์ฐพ์Šต๋‹ˆ๋‹ค**. ๋‹ค์Œ์œผ๋กœ, ํ˜ธ์ถœ๋œ macho ํŒŒ์ผ์ด๋‚˜ ์ฃผ ์‹คํ–‰ ํŒŒ์ผ์ด **`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 dylibs๋Š” **dyld ์บ์‹œ์— ๊ฒฐํ•ฉ๋˜์–ด** ์žˆ์œผ๋ฉฐ ๋””์Šคํฌ์— ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ OS dylib๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์‚ฌ์ „ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด **`stat()`**๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ **์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค**. ๊ทธ๋Ÿฌ๋‚˜ **`dlopen_preflight()`**๋Š” **`dlopen()`**๊ณผ ๋™์ผํ•œ ๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ mach-o ํŒŒ์ผ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

**๊ฒฝ๋กœ ํ™•์ธ**

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์˜ต์…˜์„ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:
```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**๊ฐ€ true๊ฐ€ ๋˜๊ณ  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

CS_REQUIRE_LV๊ฐ€ true์ธ ๊ฒฝ์šฐ, ๋ณ€์ˆ˜๋Š” ์ œ๊ฑฐ๋˜์ง€ ์•Š์ง€๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒ€์ฆ์€ ์›๋ž˜ ์ด์ง„ ํŒŒ์ผ๊ณผ ๋™์ผํ•œ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ œํ•œ ์‚ฌํ•ญ ํ™•์ธ

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

Section __RESTRICT with segment __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

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 ์ง€์›ํ•˜๊ธฐ