๐Ÿš XZ Utils ๋ฐฑ๋„์–ด (CVE-2024-3094) โ€” '์••์ถ• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ'๊ฐ€ sshd์˜ ๋ฌธ์„ ์—ด๋‹ค

2026-10-08 ยท Malware Deep-Dive (Supply-Chain Backdoor / CVE-2024-3094 / Build-Time Injection โ†’ sshd Auth Bypass)
๊ธฐ์ˆ  ์ •๋ณด
  • ์ฒด์ธ๋ช…: XZ Utils(liblzma) ๋ฐฑ๋„์–ด โ€” ์˜คํ”ˆ์†Œ์Šค ๊ณต๊ธ‰๋ง ์นจํˆฌ โ†’ ๋นŒ๋“œ ์‹œ์  ์ฝ”๋“œ ์ฃผ์ž… โ†’ OpenSSH ์ธ์ฆ ์šฐํšŒ
  • ํ•ต์‹ฌ ์ทจ์•ฝ์ : CVE-2024-3094 (CVSS 3.1 10.0 โ€” AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H)
  • ์˜ํ–ฅ ๋ฒ„์ „: xz/liblzma 5.6.0(2024-02-24) ยท 5.6.1(2024-03-09) ยท ์ˆ˜์ •: 5.6.2(2024-05-29)
  • ๋ฐœ๊ฒฌ: Andres Freund (Microsoft, PostgreSQL ๊ฐœ๋ฐœ์ž) โ€” Debian ๊ฐœ๋ฐœํŒ์—์„œ SSH ์ง€์—ฐยทCPU ๊ธ‰์ฆ์„ ์ถ”์ ํ•˜๋‹ค ๋ฐœ๊ฒฌ, 2024-03-29 ๊ณต๊ฐœ(Openwall oss-security)
  • ๊ณต๊ฒฉ์ž: 2๋…„๊ฐ„ ์‹ ๋ขฐ๋ฅผ ์Œ“์•„ ๊ณต๋™ ๊ด€๋ฆฌ์ž๊ฐ€ ๋œ ์œ„์žฅ ์ธ๋ฌผ "Jia Tan"(JiaT75) โ€” APT29(SVR) ์—ฐ๊ณ„ ์ถ”์ •, ๊ณต์‹ ๊ท€์†์€ ์—†์Œ
  • ๋ฐœ๋™ ์กฐ๊ฑด: x86-64 Linux + glibc + GCC + tarball๋กœ ๋นŒ๋“œ + sshd๊ฐ€ systemd(libsystemd)๋ฅผ ํ†ตํ•ด liblzma๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ™œ์„ฑ
  • ์‹ค์ œ ํ”ผํ•ด: ๋กค๋ง/๊ฐœ๋ฐœํŒ ๋ฐฐํฌํŒ์— ๊ตญํ•œ(Fedora Rawhideยท41, Debian sid, openSUSE Tumbleweed ๋“ฑ) โ€” ๋„“์€ ์‹คํ”ผํ•ด๋Š” ๋ฏธ๋ฐœ์ƒ, 'ํ•˜๋งˆํ„ฐ๋ฉด'์˜ ์‚ฌ๊ฑด

1. ๋ฐฐ๊ฒฝ/์—ญ์‚ฌ โ€” ๋ˆ„๊ตฌ๋‚˜ ์“ฐ์ง€๋งŒ ์•„๋ฌด๋„ ์•ˆ ๋ณด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

XZ Utils๋Š” ๋ฆฌ๋ˆ…์Šค์—์„œ ํŒŒ์ผ์„ ์••์ถ•ํ•˜๋Š” ์•„์ฃผ ํ”ํ•œ ๋„๊ตฌ์ด์ž, ๊ทธ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ liblzma๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ์— ๊น”๋ ค ์žˆ์ง€๋งŒ, ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” ๋ฌผ๋ก  ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๋„ ๊ทธ ์กด์žฌ๋ฅผ ์˜์‹ํ•˜์ง€ ์•Š๊ณ  ์ง€๋‚˜์นœ๋‹ค. ์ด๋Ÿฐ '๋ณด์ด์ง€ ์•Š๋Š” ์˜์กด์„ฑ'์ด ๋ฐ”๋กœ ๊ณต๊ธ‰๋ง ๊ณต๊ฒฉ์˜ ์ตœ์  ํ‘œ์ ์ด๋‹ค.

ํ”„๋กœ์ ํŠธ๋Š” ์˜ค๋žœ ๊ธฐ๊ฐ„ Lasse Collin์ด ์‚ฌ์‹ค์ƒ ํ˜ผ์ž ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. 2021๋…„๋ถ€ํ„ฐ "Jia Tan"์ด๋ผ๋Š” ์ด๋ฆ„์˜ ๊ธฐ์—ฌ์ž๊ฐ€ ๋“ฑ์žฅํ•ด ๊พธ์ค€ํžˆ ํŒจ์น˜๋ฅผ ์ œ์ถœํ•˜๋ฉฐ ์‹ ๋ขฐ๋ฅผ ์Œ“์•˜๊ณ , ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ€์งœ (sock-puppet) ๊ณ„์ •์œผ๋กœ "๊ด€๋ฆฌ์ž๋ฅผ ๋” ๋‘์ž"๋Š” ์••๋ฐ• ์—ฌ๋ก ์„ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ฒฐ๊ตญ ๊ทธ๋Š” ํ”„๋กœ์ ํŠธ์˜ ๊ณต๋™ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ์–ป์—ˆ๊ณ , ๊ทธ ๊ถŒํ•œ์œผ๋กœ 2024๋…„ 2์›” 5.6.0 / 3์›” 5.6.1 ๋ฆด๋ฆฌ์Šค์— ๋ฐฑ๋„์–ด๋ฅผ ์‹ฌ์—ˆ๋‹ค.

2. ๊ฐ์—ผยท์ „ํŒŒ ๊ฒฝ๋กœ โ€” '์‚ฌ๋žŒ'์„ ๋šซ๊ณ  '๋นŒ๋“œ ์„œ๋ฒ„'๋กœ ๋“ค์–ด๊ฐ€๋‹ค

์ด ์‚ฌ๊ฑด์˜ '์ „ํŒŒ ๊ฒฝ๋กœ'๋Š” ๋„คํŠธ์›Œํฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ ๋ขฐ์™€ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์ด๋‹ค. ์•…์„ฑ์ฝ”๋“œ๋Š” ์‚ฌ์šฉ์ž PC๋กœ ์ง์ ‘ ๋ฐฐํฌ๋˜์ง€ ์•Š๊ณ , ๋ฐฐํฌํŒ์ด ์†Œ์Šค๋ฅผ ๋นŒ๋“œํ•˜๋Š” ์ˆœ๊ฐ„ ์‚ด์•„๋‚œ๋‹ค.

์ฆ‰ ์ „ํŒŒ์˜ ํ•ต์‹ฌ์€ 'ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ์œ„์žฅ โ†’ ๋นŒ๋“œ ์‹œ ์‹คํ–‰ โ†’ ์ •์ƒ ํŒจํ‚ค์ง€๋กœ ์œ„์žฅ'์ด๋ผ๋Š” 3์ค‘ ์œ„์žฅ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ทจ์•ฝํ•œ ๋ฒ„์ „์ด ๋ฐฐํฌํŒ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „๊นŒ์ง€ ๋ˆ„๊ตฌ๋„ ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ–ˆ๋‹ค.

3. ๋™์ž‘ ์›๋ฆฌ ์ƒ์„ธ ๋ถ„์„ โ€” ์™œ ์••์ถ• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ SSH๋ฅผ ๊ฑด๋“œ๋ฆฌ๋‚˜

๊ฐ€์žฅ ๋งŽ์ด ๋‚˜์˜ค๋Š” ์งˆ๋ฌธ์ด "์••์ถ• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ SSH ์ธ์ฆ์„ ์šฐํšŒํ•˜๋‚˜?"๋‹ค. ๋‹ต์€ liblzma๊ฐ€ sshd ํ”„๋กœ์„ธ์Šค ์•ˆ์— '๊ฐ™์ด ๋กœ๋“œ๋œ๋‹ค'๋Š” ์ ์— ์žˆ๋‹ค.

ํ•ญ๋ชฉ๋‚ด์šฉ
์ฃผ์ž… ๊ฒฝ๋กœ๋ฆด๋ฆฌ์Šค tarball์˜ build-to-host.m4 (git ์ €์žฅ์†Œ์—๋Š” ์—†์Œ)
์œ„์žฅ ์ˆ˜๋‹จtests/files/์˜ '์ •์ƒ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ'๋กœ ์œ„์žฅํ•œ ์••์ถ• ํŒŒ์ผ
์‹คํ–‰ ์‹œ์ ํŒจํ‚ค์ง• ๋นŒ๋“œ ์‹œ(์˜ค๋ธŒ์ ํŠธ ๊ต์ฒด) + sshd ์‹œ์ž‘ ์‹œ(IFUNC ๋ฆฌ์กธ๋ฒ„)
ํ›„ํ‚น ๋Œ€์ƒOpenSSL RSA_public_decrypt ๋“ฑ ์ธ์ฆ ํ•จ์ˆ˜
์ธ์ฆ ์šฐํšŒ ํ‚ค๊ณต๊ฒฉ์ž๊ฐ€ ๋ณด์œ ํ•œ ํŠน์ • Ed448 ๊ฐœ์ธํ‚ค
๋ฐœ๋™ ์กฐ๊ฑดx86-64ยทglibcยทGCCยทtarball ๋นŒ๋“œ + sshd์˜ liblzma ๋กœ๋“œ
โš ๏ธ ์•ˆ์ „ ๊ทœ์น™: ์ด ๊ธ€์˜ PoC๋Š” ๋™์ž‘ ์›๋ฆฌ ์žฌํ˜„์šฉ ๊ต์œก์šฉ ๋ชจ์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฐฑ๋„์–ด ํŽ˜์ด๋กœ๋“œยท์‹ค์ œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผยท์‹ค์ œ Ed448 ์šฐํšŒ ํ‚คยท์‹ค์ œ OpenSSL ํ›„ํ‚น ์ฝ”๋“œ๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‹ค์Šต์€ ์ธํ„ฐ๋„ท๊ณผ ๋ถ„๋ฆฌ๋œ ๊ฒฉ๋ฆฌ ๋žฉ VM์„ ์ „์ œ๋กœ ํ•˜๋ฉฐ, ํƒ€์ธ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์‹คํ–‰์€ ๋ถˆ๋ฒ•์ž…๋‹ˆ๋‹ค.

4. ํ”ผํ•ด ๊ทœ๋ชจ/์˜ํ–ฅ โ€” '๋Œ€์žฌ์•™'์ด ๋  ๋ป”ํ•œ ์‚ฌ๊ฑด

5. PoC (๊ฐœ๋… ์ฆ๋ช…) โ€” ๊ต์œก์šฉ ๋ชจ์˜ ์žฌํ˜„ 4์ข…

์•„๋ž˜ ์ฝ”๋“œ๋Š” ์‹ค์ œ ์•…์„ฑ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์•ˆ์ „ํ•œ ๋ชจ์˜ ๊ฐ์ฒด๋กœ ์žฌํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฐฑ๋„์–ด ํŽ˜์ด๋กœ๋“œยท์‹ค์ œ ํ›„ํ‚น ์ฝ”๋“œยท์‹ค์ œ ์šฐํšŒ ํ‚ค๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฉ๋ฆฌ๋œ ๋žฉ ํ™˜๊ฒฝ(์ธํ„ฐ๋„ท ์ฐจ๋‹จ VM)์—์„œ๋งŒ ์‹คํ–‰ํ•˜์„ธ์š”.

PoC โ‘  ๋นŒ๋“œ ์‹œ์  ์ฃผ์ž… โ€” 'ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ'๊ฐ€ ์˜ค๋ธŒ์ ํŠธ๋กœ ๋ฐ”๋€Œ๋Š” ์ˆœ๊ฐ„

import base64, zlib
# ์ €์žฅ์†Œ์—๋Š” '๋ฌดํ•ดํ•œ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ'์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ์••์ถ•+base64๋กœ ์œ„์žฅํ•ด ์ปค๋ฐ‹ํ•œ๋‹ค.
_MOCK_PAYLOAD = b"[MOCK] replace crc64_fast.o with attacker object"  # ๊ต์œก์šฉ ๋ชจ์˜ ๋ฌธ์ž์—ด
CAMOUFLAGED = base64.b64encode(zlib.compress(_MOCK_PAYLOAD))
print("์ €์žฅ์†Œ์— ์ปค๋ฐ‹๋œ 'ํ…Œ์ŠคํŠธ ํŒŒ์ผ':", CAMOUFLAGED[:48].decode(), "...")

# ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ๊ฐ„(=autoreconf / make) ํŽ˜์ด๋กœ๋“œ๊ฐ€ ๊บผ๋‚ด์ง„๋‹ค.
def build_time_extract(blob):
    return zlib.decompress(base64.b64decode(blob))

injected = build_time_extract(CAMOUFLAGED)
print("๋นŒ๋“œ ์‹œ์ ์— ๊บผ๋‚ด์ง„ ๋‚ด์šฉ:", injected.decode())

# ์ •์ƒ ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ(clean .o)์„ ์ด ๋‚ด์šฉ์œผ๋กœ '๊ต์ฒด'ํ•œ๋‹ค (๋ชจ์˜)
def compile_step(real_obj, injected):
    return injected

print("๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ:", compile_step(b"crc64_fast.o (clean)", injected).decode())

์‹คํ–‰ ๊ฒฐ๊ณผ(์ด๋ฒˆ ์‹คํ–‰ ์‹ค์ œ ์ถœ๋ ฅ):

์ €์žฅ์†Œ์— ์ปค๋ฐ‹๋œ 'ํ…Œ์ŠคํŠธ ํŒŒ์ผ': eJyL9vV39o5VKEotyElMTlVILko2M4lPSywu0ctXKM8syVBI ...
๋นŒ๋“œ ์‹œ์ ์— ๊บผ๋‚ด์ง„ ๋‚ด์šฉ: [MOCK] replace crc64_fast.o with attacker object
๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ: [MOCK] replace crc64_fast.o with attacker object

PoC โ‘ก IFUNC ๋ฆฌ์กธ๋ฒ„ โ€” 'main ์‹คํ–‰ ์ „'์— ์ฝ”๋“œ๊ฐ€ ๋„๋Š” ๊ตฌ์กฐ

/* hook_demo.c : IFUNC๋กœ ์‹ฌ๋ณผ์„ ๊ฐ€๋กœ์ฑ„๋Š” '๊ธฐ๋ฒ•'๋งŒ ์žฌํ˜„ (์‹ค์ œ ์•”ํ˜ธ ํ•จ์ˆ˜๋Š” ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Œ)
 * build: gcc -O0 -o hook_demo hook_demo.c && ./hook_demo */
#define _GNU_SOURCE
#include <stdio.h>

static int real_check(int x) { return x * 2; }            /* ์ •์ƒ ๊ตฌํ˜„ */

/* ์‹ฌ๋ณผ์ด '์ฒ˜์Œ ์ฐธ์กฐ๋˜๋Š” ์ˆœ๊ฐ„' ๋กœ๋”๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๋ฆฌ์กธ๋ฒ„ = ๋ฐฑ๋„์–ด ์ง„์ž…์ (๋ชจ์˜) */
static int (*resolve_check(void))(int) {
    fprintf(stderr, "[hook] ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋“œ ์‹œ์ ์— ๋ฆฌ์กธ๋ฒ„ ์‹คํ–‰ -> ๊ณต๊ฒฉ์ž ์ฝ”๋“œ ์ง„์ž…(๋ชจ์˜)\n");
    return real_check;
}

/* check()๋ฅผ IFUNC๋กœ ์„ ์–ธ: ๋กœ๋”๊ฐ€ ์‹œ์ž‘๋  ๋•Œ resolve_check()๋ฅผ ํ˜ธ์ถœํ•ด ์‹ค์ œ ํ•จ์ˆ˜ ์ฃผ์†Œ๋ฅผ ์–ป๋Š”๋‹ค */
int check(int) __attribute__((ifunc("resolve_check")));

int main(void) {
    printf("check(21) = %d\n", check(21));
    return 0;
}

์‹คํ–‰ ๊ฒฐ๊ณผ(์ด๋ฒˆ ์‹คํ–‰ ์‹ค์ œ ์ถœ๋ ฅ): โ€” main()์ด ์ถœ๋ ฅํ•˜๋Š” ๊ฐ’๋ณด๋‹ค '๋กœ๋“œ ์‹œ์ ' ๋ฉ”์‹œ์ง€๊ฐ€ ๋จผ์ € ๋‚˜์˜ค๋Š” ๊ฒƒ์— ์ฃผ๋ชฉ.

[hook] ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋“œ ์‹œ์ ์— ๋ฆฌ์กธ๋ฒ„ ์‹คํ–‰ -> ๊ณต๊ฒฉ์ž ์ฝ”๋“œ ์ง„์ž…(๋ชจ์˜)
check(21) = 42

PoC โ‘ข '์™œ ์–ด๋–ค ์‹œ์Šคํ…œ๋งŒ ์˜ํ–ฅ๋ฐ›๋‚˜' โ€” sshd์˜ liblzma ์—ฐ๊ฒฐ ์ ๊ฒ€

# xz ๋ฐฑ๋„์–ด๋Š” liblzma๊ฐ€ sshd ํ”„๋กœ์„ธ์Šค์— '๋กœ๋“œ๋  ๋•Œ๋งŒ' ๋™์ž‘ํ•œ๋‹ค.
# systemd ๋ฐฐํฌํŒ์€ sshd -> libsystemd -> liblzma ์ˆœ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋Œ์–ด์˜จ๋‹ค.
# ์•„๋ž˜๋Š” '๋‚ด sshd์— liblzma๊ฐ€ ๋กœ๋“œ๋˜๋Š”๊ฐ€'๋ฅผ ํ™•์ธํ•˜๋Š” ์ฝ๊ธฐ ์ „์šฉ ์ ๊ฒ€ (๊ฒฉ๋ฆฌ ๋žฉ ์ „์ œ).
echo "== liblzma/xz ํŒจํ‚ค์ง€ =="
(pacman -Q xz 2>/dev/null || dpkg -l 'liblzma*' 2>/dev/null | awk '/^ii/{print $2,$3}') 
echo "== sshd์˜ liblzma ์—ฐ๊ฒฐ =="
ldd "$(command -v sshd 2>/dev/null)" 2>/dev/null | grep -i lzma || echo "liblzma ๋ฏธ์—ฐ๊ฒฐ (์˜ํ–ฅ ์—†์Œ)"

์‹คํ–‰ ๊ฒฐ๊ณผ(์ด๋ฒˆ ์‹คํ–‰ ์‹ค์ œ ์ถœ๋ ฅ โ€” Arch Linux ๋žฉ VM):

== liblzma/xz ํŒจํ‚ค์ง€ ==
xz 5.8.3-1
== sshd์˜ liblzma ์—ฐ๊ฒฐ ==
liblzma ๋ฏธ์—ฐ๊ฒฐ (์˜ํ–ฅ ์—†์Œ)

์ด ๋žฉ ํ™˜๊ฒฝ์˜ xz๋Š” ์ด๋ฏธ ํŒจ์น˜๋œ 5.8.3์ด๊ณ , sshd์— liblzma๊ฐ€ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•„ ๋‘ ์กฐ๊ฑด ๋ชจ๋‘ ์•ˆ์ „ํ•˜๋‹ค. ์‹ค์ œ ์‚ฌ๊ฑด์—์„œ๋Š” ์ด '์—ฐ๊ฒฐ' ์—ฌ๋ถ€๊ฐ€ ์ทจ์•ฝ/๋น„์ทจ์•ฝ์„ ๊ฐˆ๋ž๋‹ค.

PoC โ‘ฃ ๊ณต๊ธ‰๋ง ๊ฒ€์ฆ โ€” '๋ฆด๋ฆฌ์Šค tarball'๊ณผ 'git'์˜ ์ฐจ์ด ์ฐพ๊ธฐ

import difflib
# git ์ €์žฅ์†Œ์—๋Š” ์—†๊ณ  '๋ฐฐํฌ tar ํŒŒ์ผ'์—๋งŒ ๋“ค์–ด์žˆ๋˜ ๋ณ€์กฐ ๋ผ์ธ์„ ์ฐพ์•„๋‚ด๋Š” ๊ฒ€์ฆ (๋ชจ์˜)
git_version = """AC_DEFUN([AM_INIT_AUTOMAKE],
[ ... ์ •์ƒ์ ์ธ ๋นŒ๋“œ ์„ค์ • ... ])
# (์ •์ƒ) ํŠน๋ณ„ํ•œ ์€๋‹‰ ๋™์ž‘ ์—†์Œ"""

tarball_version = """AC_DEFUN([AM_INIT_AUTOMAKE],
[ ... ์ •์ƒ์ ์ธ ๋นŒ๋“œ ์„ค์ • ... ])
# --- ์•„๋ž˜๋Š” tarball์—๋งŒ ์กด์žฌํ•˜๋Š” ์€๋‹‰ ๋ผ์ธ (๋ฌธ์„œํ™”๋œ ์‹ค์ œ ํŒจํ„ด์„ ์ถ•์•ฝ) ---
gl_am_configmake=`grep -aErls "#{4}[[:alnum:]]{5}#{4}$" $srcdir/ 2>/dev/null`
xz -dc $srcdir/tests/files/good-large_compressed.lzma | sed ... > liblzma_la-crc64-fast.o"""

injected = [l for l in tarball_version.splitlines() if l not in git_version.splitlines()]
print("tarball์—๋งŒ ์กด์žฌํ•˜๋Š” ์˜์‹ฌ ๋ผ์ธ:", len(injected), "๊ฐœ")
for l in injected:
    print("  +", l.strip()[:72])

์‹คํ–‰ ๊ฒฐ๊ณผ(์ด๋ฒˆ ์‹คํ–‰ ์‹ค์ œ ์ถœ๋ ฅ):

tarball์—๋งŒ ์กด์žฌํ•˜๋Š” ์˜์‹ฌ ๋ผ์ธ: 3 ๊ฐœ
  + # --- ์•„๋ž˜๋Š” tarball์—๋งŒ ์กด์žฌํ•˜๋Š” ์€๋‹‰ ๋ผ์ธ (๋ฌธ์„œํ™”๋œ ์‹ค์ œ ํŒจํ„ด์„ ์ถ•์•ฝ) ---
  + gl_am_configmake=`grep -aErls "#{4}[[:alnum:]]{5}#{4}$" $srcdir/ 2>/dev/null`
  + xz -dc $srcdir/tests/files/good-large_compressed.lzma | sed ... > liblzma_la-crc64-fast.o

6. ๋ฐฉ์–ด ๋ฐฉ๋ฒ•/๊ตํ›ˆ โ€” ๋ฌด์—‡์„ ๋ฐฐ์šฐ๋‚˜

7. ์ถœ์ฒ˜

โ€ป ๋ณธ๋ฌธ์˜ PoC ์ฝ”๋“œ๋Š” ๊ตฌ์กฐ ์ดํ•ด ๋ชฉ์ ์˜ ๊ต์œก์šฉ ๋ชจ์˜ ์ฝ”๋“œ์ด๋ฉฐ, ์‹ค์ œ ๋ฐฑ๋„์–ด ํŽ˜์ด๋กœ๋“œยท์‹ค์ œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผยท ์‹ค์ œ Ed448 ์šฐํšŒ ํ‚คยท์‹ค์ œ OpenSSL ํ›„ํ‚น ์ฝ”๋“œ๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‹ค์Šต์€ ์ธํ„ฐ๋„ท๊ณผ ๋ถ„๋ฆฌ๋œ ๊ฒฉ๋ฆฌ ๋žฉ VM์„ ์ „์ œ๋กœ ํ•˜๋ฉฐ, ์‹ค์ œ ์‹œ์Šคํ…œยทํƒ€์ธ ์ž์‚ฐ์— ๋Œ€ํ•œ ์‹คํ–‰์€ ๋ถˆ๋ฒ•์ž…๋‹ˆ๋‹ค.

ํ•จ๊ป˜ ์ฝ๊ธฐ: ๐Ÿฆ… SolarWinds SUNBURST (2020) โ€” ๊ณต๊ธ‰๋ง์„ ๋ฌด๊ธฐ๋กœ ์‹ ๋ขฐ๋ฅผ ๋šซ์€ ๋ฐฑ๋„์–ด ยท ๐ŸŒ Log4Shell (2021) โ€” ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•œ ์ค„์ด ๊ณต๊ธ‰๋ง์„ ํ”๋“  ์ œ๋กœ๋ฐ์ด ยท Malware Deep-Dive: MOVEit / Cl0p (CVE-2023-34362) โ€” '์‹ ๋ขฐํ•˜๋˜ ์†Œํ”„ํŠธ์›จ์–ด'๋กœ ์กฐ์ง์„ ๋Œ€๋Ÿ‰ ์œ ์ถœ ยท โšก Industroyer / CrashOverride โ€” ํ”„๋กœํ† ์ฝœ์„ ๊ทธ๋Œ€๋กœ ๋งํ•œ ์‚ฐ์—…์ œ์–ด ํŒŒ๊ดดํ˜• ๊ณต๊ฒฉ

๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ