Sploitus

Exploit for CVE-2026-31431-Copy-Fail

kitploit ยท 2026-08-27

Exploit Code

MARKDOWN533 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-RIPPSEC-CVE-2026-31431-COPY-FAIL
# CVE-2026-31431 โ€” "Copy Fail": Linux ์ปค๋„ `algif_aead` ๋กœ์ปฌ ๊ถŒํ•œ ์ƒ์Šน

> **CISA KEV | CVSS 7.8 HIGH | Linux ์ปค๋„ 4.14 ~ 2026๋…„ ์ดˆ๋ฐ˜ ์˜ํ–ฅ (~9๋…„)**

* * *

## ๋ชฉ์ฐจ

  1. ์š”์•ฝ
  2. ์œ„ํ—˜ ํ‰๊ฐ€
  3. ๊ธฐ์ˆ  ์‹ฌ์ธต ๋ถ„์„
  4. ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•๋ก  โ€” ๋ ˆ๋“œ ํŒ€
  5. ํƒ์ง€ ๋ฐ ์‚ฌ๊ณ  ๋Œ€์‘ โ€” ๋ธ”๋ฃจ ํŒ€
  6. ํŒจ์น˜ ๋ฐ ์ˆ˜์ •
  7. ๋žฉ ํ™˜๊ฒฝ
  8. ์ฐธ๊ณ  ์ž๋ฃŒ



* * *

## 1\. ์š”์•ฝ

**CVE-2026-31431** ์€ **"Copy Fail"**์ด๋ผ๋Š” ๋ณ„์นญ์œผ๋กœ ๋ถˆ๋ฆฌ๋Š”, Linux ์ปค๋„์˜ ์•”ํ˜ธํ™” ํ•˜์œ„ ์‹œ์Šคํ…œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋†’์€ ์‹ฌ๊ฐ๋„์˜ ๋กœ์ปฌ ๊ถŒํ•œ ์ƒ์Šน(LPE) ์ทจ์•ฝ์ ์ž…๋‹ˆ๋‹ค. ๋‚ฎ์€ ๊ถŒํ•œ์˜ ๋กœ์ปฌ ์‚ฌ์šฉ์ž๋Š” ํŒจ์น˜๋˜์ง€ ์•Š์€ ๋ชจ๋“  ์‹œ์Šคํ…œ์—์„œ **์ˆ˜ ์ดˆ ๋‚ด์— root๋กœ ๊ถŒํ•œ์„ ์ƒ์Šน** ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ| ๊ฐ’  
---|---  
CVE| CVE-2026-31431  
๋ณ„์นญ| Copy Fail  
CVSS v3.1| **7.8 HIGH**  
๊ณต๊ฒฉ ๋ฒกํ„ฐ| ๋กœ์ปฌ  
ํ•„์š”ํ•œ ๊ถŒํ•œ| ๋‚ฎ์Œ  
์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ| ์—†์Œ  
๊ตฌ์„ฑ ์š”์†Œ| `crypto/algif_aead.c` โ€” `authencesn` ํ…œํ”Œ๋ฆฟ  
๋„์ž… ์‹œ์ | 2017๋…„ (์ปค๋ฐ‹ `72548b093ee3`)  
๊ณต๊ฐœ ์‹œ์ | 2026๋…„  
์ž ๋ณต ๊ธฐ๊ฐ„| ~9๋…„  
CISA KEV| **์˜ˆ**  
๊ณต๊ฐœ PoC| **์˜ˆ** (732๋ฐ”์ดํŠธ ๋…๋ฆฝํ˜• Python ์Šคํฌ๋ฆฝํŠธ)  
  
### ๋น„์ฆˆ๋‹ˆ์Šค ์˜ํ–ฅ

  * ํŒจ์น˜๋˜์ง€ ์•Š์€ ๋ชจ๋“  Linux ์„œ๋ฒ„, VM, ํด๋ผ์šฐ๋“œ ์ธ์Šคํ„ด์Šค ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํ˜ธ์ŠคํŠธ์—์„œ **root ์•ก์„ธ์Šค** ๊ฐ€๋Šฅ
  * Kubernetes ํŒŒ๋“œ์—์„œ **์ปจํ…Œ์ด๋„ˆ ํƒˆ์ถœ** โ€” ํŽ˜์ด์ง€ ์บ์‹œ๋Š” ํ˜ธ์ŠคํŠธ ์ปค๋„๊ณผ ๊ณต์œ ๋จ
  * **๋””์Šคํฌ ๋‚ด ํ”์  ์ œ๋กœ** โ€” ์•…์šฉ ์‹œ ํŒŒ์ผ ๋ณ€๊ฒฝ, ๋”ํ‹ฐ ํŽ˜์ด์ง€, ํ‘œ์ค€ ํŒŒ์ผ ๋ฌด๊ฒฐ์„ฑ ๋„๊ตฌ(Tripwire, AIDE)๋ฅผ ํ†ตํ•œ ๊ฐ์‚ฌ ์ถ”์ ์ด ๋‚จ์ง€ ์•Š์Œ
  * **Red Hat, Ubuntu, Debian, SUSE, Amazon Linux** ๋ฐ 2017๋…„ ์ดํ›„ ์ปค๋„์„ ์‹คํ–‰ํ•˜๋Š” ์‚ฌ์‹ค์ƒ ๋ชจ๋“  ์ฃผ์š” ๋ฐฐํฌํŒ์— ์˜ํ–ฅ



### ๊ถŒ์žฅ ์ฆ‰์‹œ ์กฐ์น˜

  1. **์ž„์‹œ ์™„ํ™” ์กฐ์น˜** (์ง€๊ธˆ ๋ฐฐํฌ, ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์žฌ๋ถ€ํŒ… ๋ถˆํ•„์š”): ```bash echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf sudo rmmod algif_aead 2>/dev/null || true 

root@kitploit:~

  2. **์˜๊ตฌ์  ํ•ด๊ฒฐ์ฑ…** : ๋ฐฐํฌํŒ์˜ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ํ†ตํ•ด ์ปค๋„ ํŒจํ‚ค์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์žฌ๋ถ€ํŒ…ํ•ฉ๋‹ˆ๋‹ค.
  3. **๊ฒ€์ฆ** : ์กฐ์น˜ ์ „ํ›„์— `detection/check_vulnerable.sh`๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.



* * *

## 2\. ์œ„ํ—˜ ํ‰๊ฐ€

### CVSS 3.1 ๋ฒกํ„ฐ ๋ฌธ์ž์—ด```

CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

root@kitploit:~
    
    
    | Metric | Value | Rationale |
    |--------|-------|-----------|
    | Attack Vector | **Local** | ์…ธ ์•ก์„ธ์Šค ํ•„์š”(SSH, ์ปจํ…Œ์ด๋„ˆ exec, ๋ฌผ๋ฆฌ์  ์•ก์„ธ์Šค) |
    | Attack Complexity | **Low** | ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ณ  ์™„์ „ ์ž๋™ํ™” โ€” ๊ฒฝ์Ÿ ์กฐ๊ฑด ๋ถˆํ•„์š” |
    | Privileges Required | **Low** | ๊ถŒํ•œ ์—†๋Š” ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ๊ณ„์ • |
    | User Interaction | **None** | ํ”ผํ•ด์ž ์ƒํ˜ธ์ž‘์šฉ ๋ถˆํ•„์š” |
    | Confidentiality | **High** | ์ „์ฒด ์‹œ์Šคํ…œ ์žฅ์•… |
    | Integrity | **High** | ์ „์ฒด ์‹œ์Šคํ…œ ์žฅ์•… |
    | Availability | **High** | ์ „์ฒด ์‹œ์Šคํ…œ ์žฅ์•… |
    
    ### ์œ„ํ˜‘ ํ™˜๊ฒฝ
    
    | Factor | Assessment |
    |--------|-----------|
    | PoC Availability | ๊ณต๊ฐœ, ๋ฌด๊ธฐํ™”๋จ, 732๋ฐ”์ดํŠธ ๋…๋ฆฝํ˜• Python |
    | Exploit Reliability | ๋†’์Œ โ€” ์ˆ˜์ • ์—†์ด ํ…Œ์ŠคํŠธ๋œ ๋ฐฐํฌํŒ ์ „๋ฐ˜์—์„œ ์ž‘๋™ |
    | Detection Difficulty | ๋†’์Œ โ€” ๋””์Šคํฌ ์“ฐ๊ธฐ ์—†์Œ, ๋”ํ‹ฐ ํŽ˜์ด์ง€ ์—†์Œ |
    | Attacker Skill Required | ๋‚ฎ์Œ โ€” ๊ณต๊ฐœ PoC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ํ‚ค๋”” |
    | CISA KEV | 2026๋…„ ์ถ”๊ฐ€ โ€” ์ ๊ทน์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง๋จ |
    | Microsoft Defender | ํ™œ๋ฐœํ•œ ์กฐ์‚ฌ ์ค‘์œผ๋กœ ํ”Œ๋ž˜๊ทธ ์ง€์ •๋จ |
    
    ### ์˜ํ–ฅ๋ฐ›๋Š” ํ™˜๊ฒฝ
    
    | Environment | Risk |
    |-------------|------|
    | ๋ฒ ์–ด๋ฉ”ํƒˆ Linux ์„œ๋ฒ„ | Critical |
    | Linux VM(ํด๋ผ์šฐ๋“œ ๋˜๋Š” ์˜จํ”„๋ ˆ๋ฏธ์Šค) | Critical |
    | Kubernetes ๋…ธ๋“œ | Critical(์ปจํ…Œ์ด๋„ˆ ํƒˆ์ถœ๋„ ๊ฐ€๋Šฅ) |
    | Docker ํ˜ธ์ŠคํŠธ | Critical |
    | ๊ณต์œ  ํ˜ธ์ŠคํŒ… / ๋ฉ€ํ‹ฐ ํ…Œ๋„ŒํŠธ | Critical |
    | WSL2 / Windows์˜ Linux | ์ปค๋„ ๋ฒ„์ „๋ณ„ ํ‰๊ฐ€ |
    
    ---
    
    ## 3. ๊ธฐ์ˆ  ์‹ฌ์ธต ๋ถ„์„
    
    ### 3.1 ๋ฐฐ๊ฒฝ: AF_ALG ๋ฐ AEAD
    
    Linux ์ปค๋„์€ **AF_ALG ์†Œ์ผ“**(`AF_ALG = 38`)์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์— ์•”ํ˜ธํ™” ์ž‘์—…์„ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค(`algif_aead`)๋Š” ๊ถŒํ•œ ์—†๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค๋„ ๋ชจ๋“œ ์ฝ”๋“œ ์—†์ด ์ปค๋„ ์•”ํ˜ธํ™” ํ•˜๋“œ์›จ์–ด ๊ฐ€์†๊ธฐ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
    
    **AEAD**(์—ฐ๊ด€ ๋ฐ์ดํ„ฐ ์ธ์ฆ ์•”ํ˜ธํ™”) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ AES-GCM ๋ฐ ChaCha20-Poly1305๋Š” TLS, ๋””์Šคํฌ ์•”ํ˜ธํ™”, VPN ํ”„๋กœํ† ์ฝœ์— ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ทจ์•ฝํ•œ ํ…œํ”Œ๋ฆฟ์€ `authencesn` โ€” IPsec์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ™•์žฅ ์‹œํ€€์Šค ๋ฒˆํ˜ธ(ESN) ์ง€์›๊ณผ ํ•จ๊ป˜ `hmac(sha256)` + `cbc(aes)`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” AEAD ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.
    
    ### 3.2 ๊ทผ๋ณธ ์›์ธ
    
    2017๋…„, ์ปค๋ฐ‹ `72548b093ee3`์€ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋กœ `algif_aead`์— **์ œ์ž๋ฆฌ AEAD ์ž‘์—…**์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค โ€” ์•”ํ˜ธํ™” ์—”์ง„์ด ๋™์ผํ•œ ๋ฒ„ํผ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฒฐํ•จ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค:```
    The bug chain:
    
    1. Caller binds AF_ALG socket to:
          authencesn(hmac(sha256),cbc(aes))
    
    2. Caller sends a decryption request via sendmsg() with specific flags
    
    3. Caller uses splice() to feed PAGE CACHE PAGES from an open file
       descriptor directly into the socket's scatterlist
    
    4. The authencesn template, during ESN header processing, uses the
       OUTPUT BUFFER as scratch space โ€” writing 4 bytes past the
       expected output boundary
    
    5. Because the scatterlist contains page cache pages (not private
       copies), this scratch write lands DIRECTLY IN THE PAGE CACHE
    
    6. Page cache is shared kernel-wide โ€” all processes reading the
       same file now see the modified bytes
    
    Key insight: splice() is zero-copy โ€” it hands page cache references
    to the socket. The in-place "optimization" then writes INTO those
    pages. No dirty bit is set because the write goes through the crypto
    engine, not the normal write path.
    

### 3.3 ์“ฐ๊ธฐ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ

์ด ์ทจ์•ฝ์ ์€ ๊ณต๊ฒฉ์ž๊ฐ€ ์ฝ๊ธฐ์šฉ์œผ๋กœ ์—ด ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ์˜ **ํŽ˜์ด์ง€ ์บ์‹œ์— ๋Œ€ํ•œ ์ œ์–ด๋œ 4๋ฐ”์ดํŠธ ์“ฐ๊ธฐ** ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

์“ฐ๊ธฐ๋Š” ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค โ€” ์ต์Šคํ”Œ๋กœ์ž‡์€ ๋” ํฐ ์ฝ”๋“œ ์‹œํ€€์Šค๋ฅผ ํŒจ์น˜ํ•˜๊ธฐ ์œ„ํ•ด 4๋ฐ”์ดํŠธ ์“ฐ๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

### 3.4 ์ต์Šคํ”Œ๋กœ์ž‡ ์ฒด์ธ```

[1] Open /usr/bin/su (or any setuid-root binary) for reading โ†“ [2] Map a copy to find target instruction bytes (e.g., UID check, execve path, security gate) โ†“ [3] Compute exact page cache offset of target bytes โ†“ [4] Set up AF_ALG socket โ†’ authencesn(hmac(sha256),cbc(aes)) โ†“ [5] splice() the target binary's page cache into the socket โ†“ [6] Trigger decryption โ†’ authencesn scratch write patches the target bytes in page cache (4 bytes per iteration) โ†“ [7] Repeat for each 4-byte patch needed โ†“ [8] Execute /usr/bin/su โ†’ runs root-owned setuid binary but now with attacker-controlled code in page cache โ†“ [9] Root shell

root@kitploit:~
    
    
    ### 3.5 ํ‘œ์ค€ ๋ฐฉ์–ด ์ฒด๊ณ„๊ฐ€ ๋ฌด๋ ฅํ™”๋˜๋Š” ์ด์œ 
    
    | ๋ฐฉ์–ด ์ฒด๊ณ„ | ์šฐํšŒ ๊ฐ€๋Šฅ? | ์ด์œ  |
    |---------|-----------|--------|
    | ํŒŒ์ผ ๋ฌด๊ฒฐ์„ฑ ๋ชจ๋‹ˆํ„ฐ๋ง (Tripwire/AIDE) | **์˜ˆ** | ๋””์Šคํฌ์ƒ ๋ณ€๊ฒฝ ์—†์Œ |
    | IDS ํŒŒ์ผ ํ•ด์‹œ ๊ฒ€์‚ฌ | **์˜ˆ** | ๋””์Šคํฌ ๋ฐ”์ดํŠธ ๋ถˆ๋ณ€ |
    | `inotify` ํŒŒ์ผ ๊ฐ์‹œ | **์˜ˆ** | VFS ์“ฐ๊ธฐ ์ด๋ฒคํŠธ ์—†์Œ |
    | SELinux / AppArmor | **๋ถ€๋ถ„์ ** | ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜์ง€๋งŒ ์•”ํ˜ธํ™” ์—”์ง„์„ ํ†ตํ•œ ํŽ˜์ด์ง€ ์บ์‹œ ์“ฐ๊ธฐ๋Š” ์ œ์–ดํ•˜์ง€ ๋ชปํ•จ |
    | ์ฝ๊ธฐ ์ „์šฉ ๋งˆ์šดํŠธ | **์˜ˆ** | ํŽ˜์ด์ง€ ์บ์‹œ๊ฐ€ ๋งˆ์šดํŠธ๊ฐ€ ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์—์„œ ์ˆ˜์ •๋จ |
    | ๋ฐ”์ด๋„ˆ๋ฆฌ ๋Œ€์ƒ `auditd` ๊ฐ์‹œ | **์˜ˆ** | Audit์€ VFS ์“ฐ๊ธฐ๋ฅผ ๊ฐ์‹œ โ€” ์ด ๊ธฐ๋ฒ•์€ VFS๋ฅผ ์šฐํšŒํ•จ |
    
    ### 3.6 ์˜ํ–ฅ๋ฐ›๋Š” ์ปค๋„ ๋ฒ„์ „
    
    | ๋ธŒ๋žœ์น˜ | ์ทจ์•ฝํ•œ ๋ฒ„์ „ | ์ˆ˜์ •๋œ ๋ฒ„์ „ |
    |--------|-------------------|------------|
    | 4.14.x | ์ „์ฒด (์ทจ์•ฝ์  ๊ธฐ์›) | ์—…์ŠคํŠธ๋ฆผ ์ˆ˜์ • ์—†์Œ (EOL) |
    | 5.4.x (LTS) | ์ „์ฒด | ๋ฐฐํฌํŒ ๋ฐฑํฌํŠธ ํ•„์š” |
    | 5.10.x (LTS) | ์ „์ฒด | ๋ฐฐํฌํŒ ๋ฐฑํฌํŠธ ํ•„์š” |
    | 5.15.x (LTS) | ์ „์ฒด | ๋ฐฐํฌํŒ ๋ฐฑํฌํŠธ ํ•„์š” |
    | 6.1.x (LTS) | โ‰ค 6.1.129 | **6.1.130+** |
    | 6.6.x (LTS) | โ‰ค 6.6.86 | **6.6.87+** |
    | 6.12.x (LTS) | โ‰ค 6.12.22 | **6.12.23+** |
    | 6.15-rc | rc์—์„œ ์ˆ˜์ •๋จ | **6.15-rc+** |
    
    > ๋ฐฐํฌํŒ ์ปค๋„์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „ ๋ฒˆํ˜ธ๋กœ ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋ฐฑํฌํŠธํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ํ•ด๋‹น ๋ฐฐํฌํŒ์˜ ๋ณด์•ˆ ๊ถŒ๊ณ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
    
    ---
    
    ## 4. ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•๋ก  โ€” ๋ ˆ๋“œ ํŒ€
    
    > **๊ถŒํ•œ ํ•„์š”.** ์ด ์„น์…˜์€ ๋ฐฉ์–ด์ž๊ฐ€ ๊ณต๊ฒฉ์ž์˜ ๊ด€์ ์„ ์ดํ•ดํ•˜๋„๋ก ๋•๊ธฐ ์œ„ํ•ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์†Œ์œ ํ•œ ์‹œ์Šคํ…œ ๋˜๋Š” ๋ช…์‹œ์ ์ธ ์„œ๋ฉด ์Šน์ธ์„ ๋ฐ›์€ ์‹œ์Šคํ…œ์—์„œ๋งŒ ์‹คํ–‰ํ•˜์„ธ์š”.
    
    ### 4.1 ์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ
    
    - ๋Œ€์ƒ์—์„œ์˜ ๋‚ฎ์€ ๊ถŒํ•œ ์…ธ (SSH, ์ปจํ…Œ์ด๋„ˆ exec, RCE ์ฒด์ธ)
    - Python 3.10+ **๋˜๋Š”** ์ปดํŒŒ์ผ๋œ C ๋ฐ”์ด๋„ˆ๋ฆฌ
    - `algif_aead`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒจ์น˜๋˜์ง€ ์•Š์€ ์ปค๋„
    
    ### 4.2 ์ •์ฐฐ```bash
    # Check if vulnerable
    uname -r
    cat /proc/crypto | grep -A10 "authencesn"
    lsmod | grep algif_aead
    
    # Verify setuid target exists
    ls -la /usr/bin/su /usr/bin/sudo /usr/bin/passwd
    

### 4.3 ๊ณต๊ฐœ PoC

์›๋ž˜ ์—ฐ๊ตฌ์ž๋“ค(Theori)์€ ์™„์ „ํžˆ ์ž‘๋™ํ•˜๋Š” 732๋ฐ”์ดํŠธ ๋…๋ฆฝํ˜• Python PoC๋ฅผ ๊ณต๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค:

  * **์ €์žฅ์†Œ** : https://github.com/theori-io/copy-fail-CVE-2026-31431
  * **์›น์‚ฌ์ดํŠธ** : https://copy.fail
  * **ํŒŒ์ผ** : `copy_fail_exp.py````bash



# Default: targets /usr/bin/su

python3 copy_fail_exp.py

# Custom target

python3 copy_fail_exp.py /usr/bin/passwd

root@kitploit:~
    
    
    ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ์€ `exploit/poc.py`์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์  ๋ถ„์„์€ `exploit/README.md`๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
    
    ### 4.4 ์ปจํ…Œ์ด๋„ˆ ํƒˆ์ถœ ์‹œ๋‚˜๋ฆฌ์˜ค
    
    Linux ํŽ˜์ด์ง€ ์บ์‹œ๋Š” ๋™์ผํ•œ ํ˜ธ์ŠคํŠธ์˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค(ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ํฌํ•จ) ๊ฐ„์— ๊ณต์œ ๋˜๋ฏ€๋กœ:```
    Attacker in container โ†’ patches /usr/bin/su in HOST page cache
    Host user runs su โ†’ executes attacker code as root on host
    

This works even from non-privileged containers, as long as the host kernel is vulnerable.

### 4.5 MITRE ATT&CK ๋งคํ•‘

* * *

## 5\. ํƒ์ง€ ๋ฐ ์‚ฌ๊ณ  ๋Œ€์‘ โ€” ๋ธ”๋ฃจ ํŒ€

> **์ด ์ €์žฅ์†Œ์˜ ์ฃผ์š” ์ดˆ์ ์ž…๋‹ˆ๋‹ค.**

### 5.1 ์ทจ์•ฝ์  ํƒ์ง€

ํƒ์ง€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ชจ๋“  Linux ์‹œ์Šคํ…œ์—์„œ ์‹คํ–‰ํ•˜์„ธ์š”:```bash chmod +x detection/check_vulnerable.sh sudo ./detection/check_vulnerable.sh

root@kitploit:~
    
    
    **๊ฒ€์‚ฌ ํ•ญ๋ชฉ:**
    - ์•Œ๋ ค์ง„ ์ทจ์•ฝ ๋ฒ„์ „ ๋ฒ”์œ„์— ๋Œ€ํ•œ ์ปค๋„ ๋ฒ„์ „
    - `algif_aead` ๋ชจ๋“ˆ ๋กœ๋“œ ์ƒํƒœ ๋ฐ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ์ƒํƒœ
    - `/proc/crypto`์—์„œ `authencesn` ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€
    - setuid ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ํŽ˜์ด์ง€ ์บ์‹œ ๋ฌด๊ฒฐ์„ฑ (root ๊ถŒํ•œ ํ•„์š”)
    - ๋ฐฐํฌํŒ๋ณ„ ํŒจ์น˜ ์ƒํƒœ
    - ํ™œ์„ฑ ์ต์Šคํ”Œ๋กœ์ž‡ ์ง•ํ›„์— ๋Œ€ํ•œ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค
    
    ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ํฌํ•จ๋œ ๋ณด๊ณ ์„œ๋Š” `/tmp/cve-2026-31431-report-*.txt`์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
    
    ### 5.2 YARA ํƒ์ง€
    
    `detection/yara/`์— ๋‘ ๊ฐœ์˜ YARA ๊ทœ์น™์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค:
    
    | ๊ทœ์น™ ํŒŒ์ผ | ์šฉ๋„ |
    |-----------|---------|
    | `cve_2026_31431_base.yar` | ์•Œ๋ ค์ง„ ๊ณต๊ฐœ PoC์™€ ์ •ํ™•ํžˆ ์ผ์น˜ |
    | `cve_2026_31431_enhanced.yar` | ๋‚œ๋…ํ™”, ์ปดํŒŒ์ผ ๋ฐ ๋ณ€ํ˜• ์ต์Šคํ”Œ๋กœ์ž‡ ํƒ์ง€ |```bash
    # Install YARA
    apt-get install yara   # Debian/Ubuntu
    dnf install yara       # RHEL/Fedora
    apk add yara           # Alpine
    
    # Scan running process executables
    sudo yara -r detection/yara/cve_2026_31431_enhanced.yar /proc/*/exe 2>/dev/null
    
    # Scan common dropper locations
    sudo yara -r detection/yara/cve_2026_31431_enhanced.yar /home /tmp /var/tmp /dev/shm
    
    # Scan uploaded files / quarantine
    yara detection/yara/cve_2026_31431_base.yar <suspect_file>
    

**๊ฐ•ํ™”๋œ ๊ทœ์น™์ด ์ค‘์š”ํ•œ ์ด์œ ** : ๊ณต๊ฒฉ์ž๋Š” ๊ณต๊ฐœ๋œ Python PoC๋ฅผ ๋‚œ๋…ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(base64 ์ธ์ฝ”๋”ฉ ๋ฌธ์ž์—ด, XOR ์ธ์ฝ”๋”ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ฆ„, C ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ปดํŒŒ์ผ, ์‹ฌ๋ณผ ์ œ๊ฑฐ). ๊ฐ•ํ™”๋œ ๊ทœ์น™์€ ์ต์Šคํ”Œ๋กœ์ž‡์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ ๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋Š” ๋ถˆ๋ณ€ ์š”์†Œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ณ€ํ˜•์„ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค:

  * ์ปค๋„์€ ๋ฐ˜๋“œ์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ฆ„์œผ๋กœ `authesn`์„ ์ˆ˜์‹ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
  * ์ต์Šคํ”Œ๋กœ์ž‡์€ ๋ฐ˜๋“œ์‹œ `splice()`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๋กœ์นดํ”ผ ํŽ˜์ด์ง€ ์บ์‹œ ์ ‘๊ทผ์„ ๋‹ฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
  * ์ต์Šคํ”Œ๋กœ์ž‡์€ ๋ฐ˜๋“œ์‹œ AF_ALG ์†Œ์ผ“(ํŒจ๋ฐ€๋ฆฌ `38`)์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค



### 5.3 Auditd ๊ทœ์น™

`/etc/audit/rules.d/cve-2026-31431.rules`์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค:```bash

# Detect AF_ALG socket creation (family 38 = 0x26)

-a always,exit -F arch=b64 -S socket -F a0=38 -k cve_2026_31431_afalg

# Detect splice() calls โ€” used to feed page cache into the socket

-a always,exit -F arch=b64 -S splice -k cve_2026_31431_splice

# Monitor algif_aead module loading

-a always,exit -F arch=b64 -S init_module -S finit_module -k cve_2026_31431_modload

# Detect setuid binary execution by non-root users

-a always,exit -F arch=b64 -S execve -F euid=0 -F auid>=1000 -k cve_2026_31431_suid_exec

root@kitploit:~
    
    
    Reload:```bash
    augenrules --load && service auditd restart
    

์ฟผ๋ฆฌ ๊ธฐ๋ฐ˜ ๊ณต๊ฒฉ ์‹œ๋„ ํƒ์ƒ‰:```bash

# Look for AF_ALG socket creation

ausearch -k cve_2026_31431_afalg --start today

# Correlate: same PID doing AF_ALG socket + splice

ausearch -k cve_2026_31431_afalg -k cve_2026_31431_splice --start today

root@kitploit:~
    
    
    ### 5.4 Falco / eBPF ํƒ์ง€
    
    `/etc/falco/rules.d/cve-2026-31431.yaml`์— ์ถ”๊ฐ€:```yaml
    - rule: CVE-2026-31431 AF_ALG Socket Creation
      desc: Detects unprivileged process creating AF_ALG socket (family 38) โ€” required step for Copy Fail exploit
      condition: >
        syscall.type = socket and
        evt.arg.domain = 38 and
        not user.uid = 0 and
        not proc.name in (known_crypto_daemons)
      output: >
        CVE-2026-31431 exploitation attempt - AF_ALG socket (user=%user.name
        uid=%user.uid pid=%proc.pid cmd=%proc.cmdline)
      priority: CRITICAL
      tags: [cve-2026-31431, lpe, kernel, crypto]
    
    - list: known_crypto_daemons
      items: [strongswan, charon, pluto, openssl]
    
    - rule: CVE-2026-31431 Splice After AF_ALG
      desc: Detects splice() syscall shortly after AF_ALG socket creation โ€” exploitation sequence
      condition: >
        syscall.type = splice and
        not user.uid = 0 and
        evt.elapsed < 5000000000
      output: >
        CVE-2026-31431 splice after AF_ALG socket (user=%user.name pid=%proc.pid)
      priority: CRITICAL
      tags: [cve-2026-31431, lpe]
    

### 5.5 ํŽ˜์ด์ง€ ์บ์‹œ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์‚ฌ

์ต์Šคํ”Œ๋กœ์ž‡์ด **๋””์Šคํฌ์— ์“ฐ์ง€ ์•Š๊ณ ** ํŽ˜์ด์ง€ ์บ์‹œ๋ฅผ ์ˆ˜์ •ํ•˜๋ฏ€๋กœ, ํ‘œ์ค€ FIM ๋„๊ตฌ๋Š” ์ด๋ฅผ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒ€์‚ฌ๋Š” ํ™œ์„ฑ ์ต์Šคํ”Œ๋กœ์ž‡์„ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค:```bash #!/bin/bash

# Compare in-memory binary against on-disk binary

SETUID_BINS=("/usr/bin/su" "/usr/bin/sudo" "/usr/bin/passwd")

for binary in "${SETUID_BINS[@]}"; do [[ -f "$binary" ]] || continue LIVE_HASH=$(sha256sum "$binary" | awk '{print $1}') echo 3 | sudo tee /proc/sys/vm/drop_caches > /dev/null # flush page cache DISK_HASH=$(sha256sum "$binary" | awk '{print $1}') if [[ "$LIVE_HASH" != "$DISK_HASH" ]]; then echo "CRITICAL: Page cache tampering detected on $binary" echo " Pre-flush: $LIVE_HASH" echo " Post-flush: $DISK_HASH" else echo "OK: $binary page cache matches disk" fi done

root@kitploit:~
    
    
    **์šด์˜ ์ฐธ๊ณ  ์‚ฌํ•ญ:** `drop_caches`๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์œ ์ง€๋ณด์ˆ˜ ์‹œ๊ฐ„๋Œ€์— ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์‹œ์Šคํ…œ์—์„œ ๋จผ์ € ์‹คํ–‰ํ•˜์„ธ์š”.
    
    ### 5.6 ์นจํ•ด ์ง€ํ‘œ(IoC)
    
    | IoC ์œ ํ˜• | ์ง€ํ‘œ | ์‹ ๋ขฐ๋„ |
    |----------|-----------|-----------|
    | ๋ฌธ์ž์—ด(๋ฐ”์ด๋„ˆ๋ฆฌ/์Šคํฌ๋ฆฝํŠธ) | `authencesn(hmac(sha256),cbc(aes))` | ๋†’์Œ |
    | 16์ง„์ˆ˜ ๋ฐ”์ดํŠธ | `78 DA AB 77 F5 71 63 62 64 64` (zlib ํŽ˜์ด๋กœ๋“œ ํ—ค๋”) | ๋†’์Œ |
    | ์‹œ์Šคํ…œ ์ฝœ ์‹œํ€€์Šค | `socket(38,5,0)` โ†’ `bind()` โ†’ `splice()` | ๋†’์Œ |
    | ๋„คํŠธ์›Œํฌ | ์—†์Œ โ€” ์ˆœ์ˆ˜ ๋กœ์ปฌ ์ „์šฉ | ํ•ด๋‹น ์—†์Œ |
    | ํŒŒ์ผ | ๋””์Šคํฌ ์“ฐ๊ธฐ ์—†์Œ(์€๋‹‰) | โ€” |
    | ํ”„๋กœ์„ธ์Šค | AF_ALG ์†Œ์ผ“์„ ๊ฐ€์ง„ ์ˆ˜๋ช…์ด ์งง์€ Python/C ํ”„๋กœ์„ธ์Šค | ์ค‘๊ฐ„ |
    | ํŽ˜์ด์ง€ ์บ์‹œ | setuid ๋ฐ”์ด๋„ˆ๋ฆฌ ํŽ˜์ด์ง€ ์บ์‹œ โ‰  ๋””์Šคํฌ ํ•ด์‹œ | ์‹ฌ๊ฐ |
    
    ### 5.7 SIEM ํƒ์ง€ ์ฟผ๋ฆฌ
    
    **Splunk(auditd ์†Œ์Šค):**```spl
    index=linux_audit sourcetype=auditd action=SYSCALL syscall=socket a0="0x26"
    | join pid [
        search index=linux_audit sourcetype=auditd action=SYSCALL syscall=splice
      ]
    | where (_time - join_time) < 30
    | table _time host user pid cmd a0
    | eval severity="CRITICAL"
    

**Elastic KQL:** ```kql event.action: "SYSCALL" AND process.args: "socket" AND auditd.data.a0: "0x26" AND NOT user.id: "0"

root@kitploit:~
    
    
    **Microsoft Sentinel (KQL):**```kql
    Syslog
    | where Facility == "kern" or ProcessName == "audit"
    | where SyslogMessage contains "socket" and SyslogMessage contains "a0=0x26"
    | extend UserName = extract("uid=([0-9]+)", 1, SyslogMessage)
    | where UserName != "0"
    | project TimeGenerated, Computer, UserName, SyslogMessage
    | order by TimeGenerated desc
    

* * *

## 6\. ํŒจ์น˜ ๋ฐ ์ˆ˜์ •

์ž๋™ ํŒจ์น˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:```bash chmod +x patch/patch.sh sudo ./patch/patch.sh

root@kitploit:~
    
    
    ### 6.1 ์ฆ‰์‹œ ์™„ํ™” ์กฐ์น˜ (์žฌ๋ถ€ํŒ… ๋ถˆํ•„์š”*)```bash
    # Blacklist the module permanently
    echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
    echo "install authencesn /bin/false" | sudo tee -a /etc/modprobe.d/disable-algif-aead.conf
    
    # Unload if currently loaded
    sudo rmmod algif_aead 2>/dev/null || echo "Not loaded โ€” mitigation active after config"
    
    # Verify
    lsmod | grep algif_aead && echo "WARNING: still loaded โ€” reboot needed" || echo "OK: not loaded"
    

*`algif_aead`๊ฐ€ ์ด๋ฏธ ๋กœ๋“œ๋œ ๊ฒฝ์šฐ, ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๊ฐ€ ์™„์ „ํžˆ ์ ์šฉ๋˜๋ ค๋ฉด ์žฌ๋ถ€ํŒ…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

**๋ถ€์ž‘์šฉ:** AF_ALG๋ฅผ ํ†ตํ•ด ์ปค๋„ AEAD ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๋“œ๋ฌผ์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„ OpenSSL ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์„ ์‚ฌ์šฉ)์€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ TLS, ๋””์Šคํฌ ์•”ํ˜ธํ™”, VPN ๋„๊ตฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

### 6.2 ์˜๊ตฌ ์ˆ˜์ • โ€” ์ปค๋„ ์—…๋ฐ์ดํŠธ

### 6.3 Kubernetes ํด๋Ÿฌ์Šคํ„ฐ```bash

# Check all node kernel versions

kubectl get nodes -o wide

# Drain โ†’ update node kernel โ†’ uncordon (one node at a time)

kubectl drain  \--ignore-daemonsets --delete-emptydir-data

# SSH into node and run kernel update

kubectl uncordon 

root@kitploit:~
    
    
    ๋…ธ๋“œ ์ž๋™ ์—…๊ทธ๋ ˆ์ด๋”(Karpenter, Managed Node Groups)๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ ํ’€ ๋กœํ…Œ์ด์…˜์„ ํ™œ์šฉํ•˜์„ธ์š”.
    
    ### 6.4 ํŒจ์น˜ ํ›„ ๊ฒ€์ฆ```bash
    # Re-run detection script
    sudo ./detection/check_vulnerable.sh
    
    # Quick manual verification
    uname -r                          # confirm new kernel version
    lsmod | grep algif_aead           # should be empty
    cat /proc/crypto | grep authencesn  # should return nothing (or still listed but module blacklisted)
    

* * *

## 7\. ์‹คํ—˜ ํ™˜๊ฒฝ

ํƒ์ง€ ๋„๊ตฌ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ Alpine Docker ์‹คํ—˜ ํ™˜๊ฒฝ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.```bash cd lab/ docker compose up -d docker exec -it cve-2026-31431-lab /bin/sh

# Inside container:

/cve-2026-31431/detection/check_vulnerable.sh

root@kitploit:~
    
    
    > **์ค‘์š”:** Docker ์ปจํ…Œ์ด๋„ˆ๋Š” ํ˜ธ์ŠคํŠธ ์ปค๋„์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹ค์Šต์€ **ํ˜ธ์ŠคํŠธ ์ปค๋„์˜** ์ทจ์•ฝ์  ์ƒํƒœ๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. ์ทจ์•ฝ์  ๊ฒฐ๊ณผ๋Š” ์‹ค์ œ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค โ€” ์ด๋Š” ํ˜„์‹ค์ ์ธ ํ‰๊ฐ€๋ฅผ ์œ„ํ•œ ์˜๋„๋œ ๋™์ž‘์ž…๋‹ˆ๋‹ค.
    
    ํŠน์ • ์ทจ์•ฝํ•œ ์ปค๋„ ๋ฒ„์ „์œผ๋กœ ๊ฒฉ๋ฆฌ๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์ปค๋„์„ ๊ณ ์ •ํ•œ ์ „์šฉ VM์„ ์‚ฌ์šฉํ•˜์„ธ์š”. VM ์„ค์ • ์ง€์นจ์€ `lab/README.md`๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
    
    ---
    
    ## 8. ์ฐธ๊ณ  ์ž๋ฃŒ
    
    | ๋ฆฌ์†Œ์Šค | ๋งํฌ |
    |----------|------|
    | NVD ๊ถŒ๊ณ  | https://nvd.nist.gov/vuln/detail/CVE-2026-31431 |
    | ์›๋ณธ ์—ฐ๊ตฌ | https://copy.fail |
    | ๊ธฐ์ˆ  ๋ถ„์„ ๋ฌธ์„œ | https://xint.io/blog/copy-fail-linux-distributions |
    | ๊ณต๊ฐœ PoC | https://github.com/theori-io/copy-fail-CVE-2026-31431 |
    | CISA KEV ์นดํƒˆ๋กœ๊ทธ | https://www.cisa.gov/known-exploited-vulnerabilities-catalog |
    | ์ปค๋„ ์ˆ˜์ • โ€” ์ปค๋ฐ‹ ๋˜๋Œ๋ฆฌ๊ธฐ | `a664bf3d603d` / `fafe0fa2995a` |
    | ์ทจ์•ฝ ์ปค๋ฐ‹ | `72548b093ee3` |
    | Microsoft Defender ๊ถŒ๊ณ  | Microsoft Defender ์œ„ํ˜‘ ์ธํ…”๋ฆฌ์ „์Šค ๋ธ”๋กœ๊ทธ |
    
    ---
    
    ## ์ €์žฅ์†Œ ๊ตฌ์กฐ```
    cve-2026-31431/
    โ”œโ”€โ”€ README.md                          โ† This document
    โ”œโ”€โ”€ exploit/
    โ”‚   โ”œโ”€โ”€ README.md                      โ† Technical exploit breakdown
    โ”‚   โ””โ”€โ”€ poc.py                         โ† Public PoC (theori-io, for reference)
    โ”œโ”€โ”€ detection/
    โ”‚   โ”œโ”€โ”€ README.md                      โ† Detection guide
    โ”‚   โ”œโ”€โ”€ check_vulnerable.sh            โ† Vulnerability & IoC detection script
    โ”‚   โ””โ”€โ”€ yara/
    โ”‚       โ”œโ”€โ”€ cve_2026_31431_base.yar    โ† Detects known public PoC
    โ”‚       โ””โ”€โ”€ cve_2026_31431_enhanced.yar โ† Detects obfuscated/compiled variants
    โ”œโ”€โ”€ patch/
    โ”‚   โ”œโ”€โ”€ README.md                      โ† Remediation guide
    โ”‚   โ””โ”€โ”€ patch.sh                       โ† Automated patch/mitigation script
    โ””โ”€โ”€ lab/
        โ”œโ”€โ”€ README.md                      โ† Lab setup guide
        โ”œโ”€โ”€ Dockerfile                     โ† Alpine-based lab container
        โ””โ”€โ”€ docker-compose.yml             โ† Lab orchestration
    

* * *

_๋ณธ ์—ฐ๊ตฌ๋Š” ๊ต์œก ๋ฐ ๋ฐฉ์–ด์  ๋ณด์•ˆ ๋ชฉ์ ์œผ๋กœ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋„๊ตฌ๋Š” ๋ฐฉ์–ด์ž๊ฐ€ ๋ณดํ˜ธ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‹œ์Šคํ…œ์—์„œ CVE-2026-31431์„ ํƒ์ง€ํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค._

_์ €์žฅ์†Œ๋Š”rippsec์ด(๊ฐ€) ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค._