macOS Process Abuse

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

Processes Basic Information

ํ”„๋กœ์„ธ์Šค๋Š” ์‹คํ–‰ ์ค‘์ธ ์‹คํ–‰ ํŒŒ์ผ์˜ ์ธ์Šคํ„ด์Šค์ด์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , ์ด๋“ค์€ ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ์„ธ์Šค๋Š” ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์œ„ํ•œ ์ปจํ…Œ์ด๋„ˆ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ, ์„ค๋ช…์ž, ํฌํŠธ, ๊ถŒํ•œ ๋“ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹คโ€ฆ

์ „ํ†ต์ ์œผ๋กœ, ํ”„๋กœ์„ธ์Šค๋Š” **fork**๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์‹œ์ž‘๋˜์—ˆ์œผ๋ฉฐ, ์ด๋Š” ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ์ •ํ™•ํ•œ ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•˜๊ณ , ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ **execve**๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด ์‹คํ–‰ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ, **vfork**๊ฐ€ ๋„์ž…๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ ์—†์ด ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ํ›„ **posix_spawn**์ด ๋„์ž…๋˜์–ด **vfork**์™€ **execve**๋ฅผ ํ•˜๋‚˜์˜ ํ˜ธ์ถœ๋กœ ๊ฒฐํ•ฉํ•˜๊ณ  ํ”Œ๋ž˜๊ทธ๋ฅผ ์ˆ˜์šฉํ•ฉ๋‹ˆ๋‹ค:

  • POSIX_SPAWN_RESETIDS: ์œ ํšจํ•œ ID๋ฅผ ์‹ค์ œ ID๋กœ ์žฌ์„ค์ •
  • POSIX_SPAWN_SETPGROUP: ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน ์†Œ์† ์„ค์ •
  • POSUX_SPAWN_SETSIGDEF: ์‹ ํ˜ธ ๊ธฐ๋ณธ ๋™์ž‘ ์„ค์ •
  • POSIX_SPAWN_SETSIGMASK: ์‹ ํ˜ธ ๋งˆ์Šคํฌ ์„ค์ •
  • POSIX_SPAWN_SETEXEC: ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ exec (๋” ๋งŽ์€ ์˜ต์…˜์ด ์žˆ๋Š” execve์™€ ์œ ์‚ฌ)
  • POSIX_SPAWN_START_SUSPENDED: ์‹œ์ž‘ ์‹œ ์ผ์‹œ ์ค‘์ง€
  • _POSIX_SPAWN_DISABLE_ASLR: ASLR ์—†์ด ์‹œ์ž‘
  • _POSIX_SPAWN_NANO_ALLOCATOR: libmalloc์˜ Nano ํ• ๋‹น๊ธฐ ์‚ฌ์šฉ
  • _POSIX_SPAWN_ALLOW_DATA_EXEC: ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ์—์„œ rwx ํ—ˆ์šฉ
  • POSIX_SPAWN_CLOEXEC_DEFAULT: exec(2)์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ํŒŒ์ผ ์„ค๋ช…์ž ๋‹ซ๊ธฐ
  • _POSIX_SPAWN_HIGH_BITS_ASLR: ASLR ์Šฌ๋ผ์ด๋“œ์˜ ๋†’์€ ๋น„ํŠธ ๋ฌด์ž‘์œ„ํ™”

๊ฒŒ๋‹ค๊ฐ€, posix_spawn์€ ์ƒ์„ฑ๋œ ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€ ์ธก๋ฉด์„ ์ œ์–ดํ•˜๋Š” posix_spawnattr ๋ฐฐ์—ด์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„ค๋ช…์ž์˜ ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด **posix_spawn_file_actions**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์— ๋ฐ˜ํ™˜ ์ฝ”๋“œ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค (๋ถ€๋ชจ๊ฐ€ ์ข…๋ฃŒ๋œ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๋ถ€๋ชจ๋Š” PID 1) ์‹ ํ˜ธ SIGCHLD์™€ ํ•จ๊ป˜. ๋ถ€๋ชจ๋Š” wait4() ๋˜๋Š” waitid()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด ๊ฐ’์„ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋ฉฐ, ๊ทธ๋•Œ๊นŒ์ง€ ์ž์‹์€ ์ข€๋น„ ์ƒํƒœ์— ๋จธ๋ฌผ๋ฉฐ ์—ฌ์ „ํžˆ ๋‚˜์—ด๋˜์ง€๋งŒ ์ž์›์„ ์†Œ๋ชจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

PIDs

PID, ํ”„๋กœ์„ธ์Šค ์‹๋ณ„์ž๋Š” ๊ณ ์œ ํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. XNU์—์„œ PIDs๋Š” 64๋น„ํŠธ๋กœ ๋‹จ์กฐ๋กญ๊ฒŒ ์ฆ๊ฐ€ํ•˜๋ฉฐ ์ ˆ๋Œ€ ๋žฉํ•‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๋‚จ์šฉ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด).

Process Groups, Sessions & Coalations

ํ”„๋กœ์„ธ์Šค๋Š” ๊ทธ๋ฃน์— ์‚ฝ์ž…๋˜์–ด ์ฒ˜๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์…ธ ์Šคํฌ๋ฆฝํŠธ์˜ ๋ช…๋ น์€ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน์— ์žˆ์œผ๋ฏ€๋กœ kill์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ๊ป˜ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์„ธ์…˜์— ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„ธ์…˜์„ ์‹œ์ž‘ํ•˜๋ฉด (setsid(2)), ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ์˜ ์„ธ์…˜์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” ํ•œ ์„ธ์…˜ ๋‚ด์— ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

Coalition์€ Darwin์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ฝ”์–ผ๋ฆฌ์…˜์— ๊ฐ€์ž…ํ•œ ํ”„๋กœ์„ธ์Šค๋Š” ํ’€ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์›์žฅ ๊ณต์œ  ๋˜๋Š” Jetsam์— ์ง๋ฉดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”์–ผ๋ฆฌ์…˜์€ ๋‹ค์–‘ํ•œ ์—ญํ• ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค: ๋ฆฌ๋”, XPC ์„œ๋น„์Šค, ํ™•์žฅ.

Credentials & Personae

๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ์‹œ์Šคํ…œ์—์„œ ๊ถŒํ•œ์„ ์‹๋ณ„ํ•˜๋Š” ์ž๊ฒฉ ์ฆ๋ช…์„ ๋ณด์œ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๋ณธ uid์™€ ํ•˜๋‚˜์˜ ๊ธฐ๋ณธ gid๋ฅผ ๊ฐ€์ง€๋ฉฐ (์—ฌ๋Ÿฌ ๊ทธ๋ฃน์— ์†ํ•  ์ˆ˜ ์žˆ์Œ).
์ด์ง„ ํŒŒ์ผ์ด setuid/setgid ๋น„ํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์‚ฌ์šฉ์ž ๋ฐ ๊ทธ๋ฃน ID๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด uid/gid๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ํ˜ธ์ถœ **persona**๋Š” ๋Œ€์ฒด ์ž๊ฒฉ ์ฆ๋ช… ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŽ˜๋ฅด์†Œ๋‚˜๋ฅผ ์ฑ„ํƒํ•˜๋ฉด uid, gid ๋ฐ ๊ทธ๋ฃน ๋ฉค๋ฒ„์‹ญ์„ ํ•œ ๋ฒˆ์— ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ์—์„œ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

struct kpersona_info { uint32_t persona_info_version;
uid_t    persona_id; /* overlaps with UID */
int      persona_type;
gid_t    persona_gid;
uint32_t persona_ngroups;
gid_t    persona_groups[NGROUPS];
uid_t    persona_gmuid;
char     persona_name[MAXLOGNAME + 1];

/* TODO: MAC policies?! */
}

์Šค๋ ˆ๋“œ ๊ธฐ๋ณธ ์ •๋ณด

  1. POSIX ์Šค๋ ˆ๋“œ (pthreads): macOS๋Š” C/C++์˜ ํ‘œ์ค€ ์Šค๋ ˆ๋”ฉ API์˜ ์ผ๋ถ€์ธ POSIX ์Šค๋ ˆ๋“œ(pthreads)๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. macOS์—์„œ pthreads์˜ ๊ตฌํ˜„์€ /usr/lib/system/libsystem_pthread.dylib์— ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๊ณต๊ฐœ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ libpthread ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  2. ์Šค๋ ˆ๋“œ ์ƒ์„ฑ: pthread_create() ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ์ด ํ•จ์ˆ˜๋Š” XNU ์ปค๋„(์ฆ‰, macOS๊ฐ€ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ปค๋„)์— ํŠน์ •ํ•œ ์ €์ˆ˜์ค€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ธ bsdthread_create()๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ์Šค๋ ˆ๋“œ ๋™์ž‘์„ ์ง€์ •ํ•˜๋Š” pthread_attr(์†์„ฑ)์—์„œ ํŒŒ์ƒ๋œ ๋‹ค์–‘ํ•œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์Šค์ผ€์ค„๋ง ์ •์ฑ…๊ณผ ์Šคํƒ ํฌ๊ธฐ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ์Šคํƒ ํฌ๊ธฐ: ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ์˜ ๊ธฐ๋ณธ ์Šคํƒ ํฌ๊ธฐ๋Š” 512 KB๋กœ, ์ผ๋ฐ˜์ ์ธ ์ž‘์—…์—๋Š” ์ถฉ๋ถ„ํ•˜์ง€๋งŒ ๋” ๋งŽ์€ ๊ณต๊ฐ„์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ ์†์„ฑ์„ ํ†ตํ•ด ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. ์Šค๋ ˆ๋“œ ์ดˆ๊ธฐํ™”: __pthread_init() ํ•จ์ˆ˜๋Š” ์Šค๋ ˆ๋“œ ์„ค์ • ์ค‘์— ์ค‘์š”ํ•˜๋ฉฐ, env[] ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ์˜ ์œ„์น˜์™€ ํฌ๊ธฐ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

macOS์˜ ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ

  1. ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ: ์Šค๋ ˆ๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ pthread_exit()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ์ข…๋ฃŒ๋˜๋„๋ก ํ•˜๋ฉฐ, ํ•„์š”ํ•œ ์ •๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์Šค๋ ˆ๋“œ๊ฐ€ ๋ชจ๋“  ์กฐ์ธ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  2. ์Šค๋ ˆ๋“œ ์ •๋ฆฌ: pthread_exit()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด pthread_terminate() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ๋ชจ๋“  ๊ด€๋ จ ์Šค๋ ˆ๋“œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” Mach ์Šค๋ ˆ๋“œ ํฌํŠธ๋ฅผ ํ•ด์ œํ•˜๊ณ (Mach๋Š” XNU ์ปค๋„์˜ ํ†ต์‹  ํ•˜์œ„ ์‹œ์Šคํ…œ) ์Šค๋ ˆ๋“œ์™€ ๊ด€๋ จ๋œ ์ปค๋„ ์ˆ˜์ค€ ๊ตฌ์กฐ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ธ bsdthread_terminate๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜

๊ณต์œ  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๊ด€๋ฆฌํ•˜๊ณ  ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด macOS๋Š” ์—ฌ๋Ÿฌ ๋™๊ธฐํ™” ์›์‹œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์ค‘ ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค:

  1. ๋ฎคํ…์Šค:
  • ์ผ๋ฐ˜ ๋ฎคํ…์Šค (์„œ๋ช…: 0x4D555458): ๋ฉ”๋ชจ๋ฆฌ ํ’‹ํ”„๋ฆฐํŠธ๊ฐ€ 60๋ฐ”์ดํŠธ(๋ฎคํ…์Šค 56๋ฐ”์ดํŠธ ๋ฐ ์„œ๋ช… 4๋ฐ”์ดํŠธ)์ธ ํ‘œ์ค€ ๋ฎคํ…์Šค์ž…๋‹ˆ๋‹ค.
  • ๋น ๋ฅธ ๋ฎคํ…์Šค (์„œ๋ช…: 0x4d55545A): ์ผ๋ฐ˜ ๋ฎคํ…์Šค์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋” ๋น ๋ฅธ ์ž‘์—…์„ ์œ„ํ•ด ์ตœ์ ํ™”๋œ ๋ฎคํ…์Šค์ด๋ฉฐ, ํฌ๊ธฐ๋Š” 60๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค.
  1. ์กฐ๊ฑด ๋ณ€์ˆ˜:
  • ํŠน์ • ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ํฌ๊ธฐ๋Š” 44๋ฐ”์ดํŠธ(40๋ฐ”์ดํŠธ ๋ฐ 4๋ฐ”์ดํŠธ ์„œ๋ช… ํฌํ•จ)์ž…๋‹ˆ๋‹ค.
  • ์กฐ๊ฑด ๋ณ€์ˆ˜ ์†์„ฑ (์„œ๋ช…: 0x434e4441): ์กฐ๊ฑด ๋ณ€์ˆ˜์˜ ๊ตฌ์„ฑ ์†์„ฑ์œผ๋กœ, ํฌ๊ธฐ๋Š” 12๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค.
  1. ํ•œ ๋ฒˆ ๋ณ€์ˆ˜ (์„œ๋ช…: 0x4f4e4345):
  • ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ํฌ๊ธฐ๋Š” 12๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค.
  1. ์ฝ๊ธฐ-์“ฐ๊ธฐ ์ž ๊ธˆ:
  • ์—ฌ๋Ÿฌ ๋…์ž๊ฐ€ ๋™์‹œ์— ๋˜๋Š” ํ•œ ๋ช…์˜ ์ž‘์„ฑ์ž๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํšจ์œจ์ ์ธ ์ ‘๊ทผ์„ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ๊ธฐ ์“ฐ๊ธฐ ์ž ๊ธˆ (์„œ๋ช…: 0x52574c4b): ํฌ๊ธฐ๋Š” 196๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค.
  • ์ฝ๊ธฐ ์“ฐ๊ธฐ ์ž ๊ธˆ ์†์„ฑ (์„œ๋ช…: 0x52574c41): ์ฝ๊ธฐ-์“ฐ๊ธฐ ์ž ๊ธˆ์˜ ์†์„ฑ์œผ๋กœ, ํฌ๊ธฐ๋Š” 20๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค.

Tip

์ด๋Ÿฌํ•œ ๊ฐ์ฒด์˜ ๋งˆ์ง€๋ง‰ 4๋ฐ”์ดํŠธ๋Š” ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ณ€์ˆ˜ (TLV)

**์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ณ€์ˆ˜ (TLV)**๋Š” Mach-O ํŒŒ์ผ(์ฆ‰, macOS์˜ ์‹คํ–‰ ํŒŒ์ผ ํ˜•์‹)๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ ์Šค๋ ˆ๋“œ์— ํŠน์ •ํ•œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ€์ˆ˜์˜ ๋ณ„๋„ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ง€๋„๋ก ํ•˜์—ฌ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ณ  ๋ฎคํ…์Šค์™€ ๊ฐ™์€ ๋ช…์‹œ์  ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์—†์ด ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

C ๋ฐ ๊ด€๋ จ ์–ธ์–ด์—์„œ๋Š” __thread ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์˜ˆ์ œ์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค:

cCopy code__thread int tlv_var;

void main (int argc, char **argv){
tlv_var = 10;
}

์ด ์Šค๋‹ˆํŽซ์€ tlv_var๋ฅผ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ณ€์ˆ˜๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ์ž์‹ ์˜ tlv_var๋ฅผ ๊ฐ€์ง€๋ฉฐ, ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ tlv_var์— ๊ฐ€ํ•œ ๋ณ€๊ฒฝ์€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์˜ tlv_var์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Mach-O ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ณ€์ˆ˜์™€ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋Š” ํŠน์ • ์„น์…˜์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  • __DATA.__thread_vars: ์ด ์„น์…˜์€ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ๋ณ€์ˆ˜์˜ ์œ ํ˜• ๋ฐ ์ดˆ๊ธฐํ™” ์ƒํƒœ์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • __DATA.__thread_bss: ์ด ์„น์…˜์€ ๋ช…์‹œ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ณ€์ˆ˜์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ œ๋กœ ์ดˆ๊ธฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•ด ๋”ฐ๋กœ ์„ค์ •๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

Mach-O๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด **tlv_atexit**๋ผ๋Š” ํŠน์ • API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ์†Œ๋ฉธ์ž๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„

์Šค๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ์šด์˜ ์ฒด์ œ๊ฐ€ ์–ด๋–ค ์Šค๋ ˆ๋“œ๋ฅผ ์–ธ์ œ ์‹คํ–‰ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฐ์ •์€ ๊ฐ ์Šค๋ ˆ๋“œ์— ํ• ๋‹น๋œ ์šฐ์„ ์ˆœ์œ„ ์ˆ˜์ค€์— ์˜ํ•ด ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. macOS ๋ฐ ์œ ๋‹‰์Šค ๊ณ„์—ด ์‹œ์Šคํ…œ์—์„œ๋Š” nice, renice, ๋ฐ ์„œ๋น„์Šค ํ’ˆ์งˆ(QoS) ํด๋ž˜์Šค์™€ ๊ฐ™์€ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Nice ๋ฐ Renice

  1. Nice:
  • ํ”„๋กœ์„ธ์Šค์˜ nice ๊ฐ’์€ ์šฐ์„ ์ˆœ์œ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ˆซ์ž์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋Š” -20(๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„)์—์„œ 19(๊ฐ€์žฅ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„)๊นŒ์ง€์˜ nice ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๊ธฐ๋ณธ nice ๊ฐ’์€ ์ผ๋ฐ˜์ ์œผ๋กœ 0์ž…๋‹ˆ๋‹ค.
  • ๋‚ฎ์€ nice ๊ฐ’( -20์— ๊ฐ€๊นŒ์šด)์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋” โ€œ์ด๊ธฐ์ โ€œ์œผ๋กœ ๋งŒ๋“ค์–ด, ๋” ๋†’์€ nice ๊ฐ’์„ ๊ฐ€์ง„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ๋น„ํ•ด ๋” ๋งŽ์€ CPU ์‹œ๊ฐ„์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
  1. Renice:
  • renice๋Š” ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ nice ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋™์ ์œผ๋กœ ์กฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ƒˆ๋กœ์šด nice ๊ฐ’์— ๋”ฐ๋ผ CPU ์‹œ๊ฐ„ ํ• ๋‹น์„ ์ฆ๊ฐ€์‹œํ‚ค๊ฑฐ๋‚˜ ๊ฐ์†Œ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ๋” ๋งŽ์€ CPU ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด renice๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ nice ๊ฐ’์„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค ํ’ˆ์งˆ(QoS) ํด๋ž˜์Šค

QoS ํด๋ž˜์Šค๋Š” ํŠนํžˆ **Grand Central Dispatch (GCD)**๋ฅผ ์ง€์›ํ•˜๋Š” macOS์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ์—์„œ ์Šค๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ณด๋‹ค ํ˜„๋Œ€์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. QoS ํด๋ž˜์Šค๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์—…์˜ ์ค‘์š”์„ฑ์ด๋‚˜ ๊ธด๊ธ‰์„ฑ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์ˆ˜์ค€์œผ๋กœ ์ž‘์—…์„ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. macOS๋Š” ์ด๋Ÿฌํ•œ QoS ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šค๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค:

  1. ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ:
  • ์ด ํด๋ž˜์Šค๋Š” ํ˜„์žฌ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉ ์ค‘์ด๊ฑฐ๋‚˜ ์ฆ‰๊ฐ์ ์ธ ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•œ ์ž‘์—…์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ˜์‘์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌ๋ฐ›์Šต๋‹ˆ๋‹ค(์˜ˆ: ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋˜๋Š” ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ).
  1. ์‚ฌ์šฉ์ž ์‹œ์ž‘:
  • ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์ž‘ํ•˜๊ณ  ์ฆ‰๊ฐ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ์ž‘์—…์œผ๋กœ, ๋ฌธ์„œ๋ฅผ ์—ด๊ฑฐ๋‚˜ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€์ง€๋งŒ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ๋ณด๋‹ค๋Š” ๋‚ฎ์Šต๋‹ˆ๋‹ค.
  1. ์œ ํ‹ธ๋ฆฌํ‹ฐ:
  • ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ์žฅ๊ธฐ ์‹คํ–‰๋˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์ง„ํ–‰ ํ‘œ์‹œ๊ธฐ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ, ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ). ์ด๋“ค์€ ์‚ฌ์šฉ์ž ์‹œ์ž‘ ์ž‘์—…๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์œผ๋ฉฐ ์ฆ‰์‹œ ์™„๋ฃŒ๋  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  1. ๋ฐฑ๊ทธ๋ผ์šด๋“œ:
  • ์ด ํด๋ž˜์Šค๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋ณด์ด์ง€ ์•Š๋Š” ์ž‘์—…์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ์ธ๋ฑ์‹ฑ, ๋™๊ธฐํ™” ๋˜๋Š” ๋ฐฑ์—…๊ณผ ๊ฐ™์€ ์ž‘์—…์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ๊ฐ€์žฅ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋ฉฐ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ์ตœ์†Œํ™”๋ฉ๋‹ˆ๋‹ค.

QoS ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ์ •ํ™•ํ•œ ์šฐ์„ ์ˆœ์œ„ ์ˆซ์ž๋ฅผ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ์ž‘์—…์˜ ์„ฑ๊ฒฉ์— ์ง‘์ค‘ํ•˜๊ณ  ์‹œ์Šคํ…œ์ด CPU ๋ฆฌ์†Œ์Šค๋ฅผ ์ตœ์ ํ™”ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋ง ์ •์ฑ…์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๊ณ ๋ คํ•  ์Šค์ผ€์ค„๋ง ๋งค๊ฐœ๋ณ€์ˆ˜ ์ง‘ํ•ฉ์„ ์ง€์ •ํ•˜๋Š” ํ๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด๋Š” thread_policy_[set/get]๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฒฝ์Ÿ ์กฐ๊ฑด ๊ณต๊ฒฉ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MacOS ํ”„๋กœ์„ธ์Šค ๋‚จ์šฉ

MacOS๋Š” ๋‹ค๋ฅธ ์šด์˜ ์ฒด์ œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ , ํ†ต์‹ ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๊ณผ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์€ ํšจ์œจ์ ์ธ ์‹œ์Šคํ…œ ๊ธฐ๋Šฅ์— ํ•„์ˆ˜์ ์ด์ง€๋งŒ, ์œ„ํ˜‘ ํ–‰์œ„์ž์— ์˜ํ•ด ์•…์˜์ ์ธ ํ™œ๋™์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋‚จ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฃผ์ž…

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฃผ์ž…์€ ๊ณต๊ฒฉ์ž๊ฐ€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•…์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ฃผ์ž…๋œ ํ›„, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค์˜ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ๊ณต๊ฒฉ์ž์—๊ฒŒ ํ”„๋กœ์„ธ์Šค์™€ ๋™์ผํ•œ ๊ถŒํ•œ๊ณผ ์ ‘๊ทผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

macOS Library Injection

ํ•จ์ˆ˜ ํ›„ํ‚น

ํ•จ์ˆ˜ ํ›„ํ‚น์€ ์†Œํ”„ํŠธ์›จ์–ด ์ฝ”๋“œ ๋‚ด์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€๋กœ์ฑ„๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ํ›„ํ‚นํ•จ์œผ๋กœ์จ ๊ณต๊ฒฉ์ž๋Š” ํ”„๋กœ์„ธ์Šค์˜ ๋™์ž‘์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜, ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€์ฐฐํ•˜๊ฑฐ๋‚˜, ์‹คํ–‰ ํ๋ฆ„์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

macOS Function Hooking

ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ 

ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ (IPC)์€ ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๊ตํ™˜ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. IPC๋Š” ๋งŽ์€ ํ•ฉ๋ฒ•์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์ˆ˜์ ์ด์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค ๊ฒฉ๋ฆฌ๋ฅผ ๋ฌด๋„ˆ๋œจ๋ฆฌ๊ฑฐ๋‚˜ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์œ ์ถœํ•˜๊ฑฐ๋‚˜ ๋ฌด๋‹จ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋‚จ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

macOS IPC - Inter Process Communication

Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฃผ์ž…

ํŠน์ • ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰๋œ Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ”„๋กœ์„ธ์Šค ์ฃผ์ž…์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

macOS Electron Applications Injection

Chromium ์ฃผ์ž…

--load-extension ๋ฐ --use-fake-ui-for-media-stream ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ๋‚ด ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ํ‚ค ์ž…๋ ฅ, ํŠธ๋ž˜ํ”ฝ, ์ฟ ํ‚ค๋ฅผ ํ›”์น˜๊ณ  ํŽ˜์ด์ง€์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

macOS Chromium Injection

๋”๋Ÿฌ์šด NIB

NIB ํŒŒ์ผ์€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI) ์š”์†Œ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋“ค์€ ์ž„์˜์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, NIB ํŒŒ์ผ์ด ์ˆ˜์ •๋˜๋ฉด ์ด๋ฏธ ์‹คํ–‰๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰์„ Gatekeeper๊ฐ€ ๋ง‰์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋“ค์€ ์ž„์˜์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์ž„์˜์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

macOS Dirty NIB

Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฃผ์ž…

ํŠน์ • Java ๊ธฐ๋Šฅ(์˜ˆ: _JAVA_OPTS ํ™˜๊ฒฝ ๋ณ€์ˆ˜)์„ ๋‚จ์šฉํ•˜์—ฌ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž„์˜์˜ ์ฝ”๋“œ/๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

macOS Java Applications Injection

.Net ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฃผ์ž…

.Net ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์„ ๋‚จ์šฉํ•˜์—ฌ .Net ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋Š” macOS ๋ณดํ˜ธ(๋Ÿฐํƒ€์ž„ ๊ฐ•ํ™”)๋กœ ๋ณดํ˜ธ๋˜์ง€ ์•Š์Œ).

macOS .Net Applications Injection

Perl ์ฃผ์ž…

Perl ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค:

macOS Perl Applications Injection

Ruby ์ฃผ์ž…

Ruby ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋‚จ์šฉํ•˜์—ฌ ์ž„์˜์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

macOS Ruby Applications Injection

Python ์ฃผ์ž…

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ **PYTHONINSPECT**๊ฐ€ ์„ค์ •๋˜๋ฉด Python ํ”„๋กœ์„ธ์Šค๋Š” ์™„๋ฃŒ๋˜๋ฉด Python CLI๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ **PYTHONSTARTUP**์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€ํ™”ํ˜• ์„ธ์…˜ ์‹œ์ž‘ ์‹œ ์‹คํ–‰ํ•  Python ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ **PYTHONINSPECT**๊ฐ€ ๋Œ€ํ™”ํ˜• ์„ธ์…˜์„ ์ƒ์„ฑํ•  ๋•Œ PYTHONSTARTUP ์Šคํฌ๋ฆฝํŠธ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

PYTHONPATH ๋ฐ **PYTHONHOME**๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋„ Python ๋ช…๋ น์ด ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

**pyinstaller**๋กœ ์ปดํŒŒ์ผ๋œ ์‹คํ–‰ ํŒŒ์ผ์€ ๋‚ด์žฅ Python์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Caution

์ „๋ฐ˜์ ์œผ๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋‚จ์šฉํ•˜์—ฌ Python์ด ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ Homebrew๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Python์„ ์„ค์น˜ํ•˜๋ฉฐ, ์ด๋Š” ๊ธฐ๋ณธ ๊ด€๋ฆฌ์ž ์‚ฌ์šฉ์ž์—๊ฒŒ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ์œ„์น˜์— Python์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old
cat > /opt/homebrew/bin/python3 <<EOF
#!/bin/bash
# ์ถ”๊ฐ€ ํƒˆ์ทจ ์ฝ”๋“œ
/opt/homebrew/bin/python3.old "$@"
EOF
chmod +x /opt/homebrew/bin/python3

์‹ฌ์ง€์–ด root๋„ Python์„ ์‹คํ–‰ํ•  ๋•Œ ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํƒ์ง€

Shield

Shield (Github)๋Š” ํ”„๋กœ์„ธ์Šค ์ฃผ์ž… ์ž‘์—…์„ ํƒ์ง€ํ•˜๊ณ  ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ ์†Œ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค:

  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ: ๋‹ค์Œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜์˜ ์กด์žฌ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค: DYLD_INSERT_LIBRARIES, CFNETWORK_LIBRARY_PATH, RAWCAMERA_BUNDLE_PATH ๋ฐ ELECTRON_RUN_AS_NODE
  • task_for_pid ํ˜ธ์ถœ ์‚ฌ์šฉ: ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ์ž‘์—… ํฌํŠธ๋ฅผ ์–ป์œผ๋ ค๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ์„ธ์Šค์— ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  • Electron ์•ฑ ๋งค๊ฐœ๋ณ€์ˆ˜: ๋ˆ„๊ตฐ๊ฐ€ --inspect, --inspect-brk ๋ฐ --remote-debugging-port ๋ช…๋ น์ค„ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ฒ„๊น… ๋ชจ๋“œ์—์„œ Electron ์•ฑ์„ ์‹œ์ž‘ํ•˜๊ณ , ๋”ฐ๋ผ์„œ ์ฝ”๋“œ ์ฃผ์ž…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๋˜๋Š” ํ•˜๋“œ ๋งํฌ ์‚ฌ์šฉ: ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ํ”ํ•œ ๋‚จ์šฉ์€ ์šฐ๋ฆฌ ์‚ฌ์šฉ์ž ๊ถŒํ•œ์œผ๋กœ ๋งํฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋” ๋†’์€ ๊ถŒํ•œ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์˜ ๊ถŒํ•œ ์ˆ˜์ค€์ด ๋Œ€์ƒ ํŒŒ์ผ๊ณผ ๋‹ค๋ฅด๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์˜ ๊ฒฝ์šฐ, ์ƒ์„ฑ ์ „์— ๋งํฌ์˜ ๋ชฉ์ ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฐจ๋‹จ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Apple์˜ EndpointSecurity ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•œ๊ณ„์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ ๋งŒ๋“  ํ˜ธ์ถœ

์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ task_name_for_pid ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ”„๋กœ์„ธ์Šค์— ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ทธ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ uid์—ฌ์•ผ ํ•˜๊ฑฐ๋‚˜ root์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์ด ํ•จ์ˆ˜๋Š” ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋‹™๋‹ˆ๋‹ค).

์ฐธ๊ณ ์ž๋ฃŒ

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