## https://sploitus.com/exploit?id=EA3E95E5-93C9-52DF-978D-44DD40B00972
# AI ์ค์ผ์คํธ๋ ์ด์
๊ธฐ๋ฐ CVE ๋ถ์ โ CVE-2021-41773
> **AI์๊ฒ CVE ๋ถ์์ ์ํค๊ณ , AI๊ฐ ๋ธ ์ค๋ฅ 6๊ฑด์ ์ ๋ถ ์ก์๋ด ์ฌ๋ฐ ๋ฐฉ์ง ์ ์ฐจ๋ก ๋ฐ๊พผ ๊ธฐ๋ก.**
Apache HTTP Server 2.4.49์ ๊ฒฝ๋ก ์ ๊ทํ ๊ฒฐํจ(CVE-2021-41773)์ ๊ณต์ ์๋ฌธ๋ง์ผ๋ก ๋ถ์ํ๊ณ ,
๊ทธ ๊ณผ์ ์์ AI๊ฐ ๋ง๋ค์ด๋ธ ์ค๋ฅ๋ฅผ ์ฌ๋์ด ๊ฒ์ฆยท๊ต์ ํ ์ ๊ณผ์ ์ Evidence๋ก ๋จ๊ธด ์ ์ฅ์์
๋๋ค.
**๊ฒฐ๋ก ๋ณด๋ค ๊ฒ์ฆ ๊ณผ์ ์ด ์ด ์ ์ฅ์์ ๋ด์ฉ์
๋๋ค.**
| | |
|---|---|
| ๊ธฐ๊ฐ | 2026-08-11 (D1) |
| ๋์ | CVE-2021-41773 ยท Apache HTTP Server 2.4.49 ยท CWE-22 |
| ๋๊ตฌ | Claude Code (Opus 4.8), manual approval mode |
| ๊ฒ์ฆ | `D1 Gate = GO (exit 0)` ยท `tests 34/34` ยท `validate = GO` |
| ํ์ฌ | D1 ์๋ฃ. D2(๋ก์ปฌ Lab ์คํ) / D3(๋ณด๊ณ ์ยท์ฌํ) ์งํ ์์ |
---
## 1. ์ด ์ค์ต์ ๊ท์ฝ
CVE 1๊ฑด์ **D1(์ ์ ๋ถ์) โ D2(๋ก์ปฌ ๊ด์ฐฐ) โ D3(๋ณด๊ณ ยท์ฌํ)** 3๋จ๊ณ๋ก ์งํํ๋ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
ํต์ฌ ๊ท์ฝ์ ๋ค ๊ฐ์ง์
๋๋ค.
1. **AI ์ถ๋ ฅ์ Evidence๊ฐ ์๋๋ค.** AI๋ ์ด์๋ง ์ ์ํ๊ณ , FACT ํ์ ์ ์ฌ๋์ด ํ๋ค.
2. **์คํ์ ์ ํํ `GO ` ๋ค์๋ง.** "์งํํด", "์์์ ํด"๋ ์น์ธ์ด ์๋๋ค.
3. **๋์์ loopback์ผ๋ก ์ ํ๋๋ค.** `127.0.0.1` / `localhost` / ์ด ์ ์ฅ์๊ฐ ๋ง๋ ๊ฒฉ๋ฆฌ Compose Service๋ง.
4. **์คํจยทREJECTEDยทUNKNOWN์ ์ญ์ ํ์ง ์๋๋ค.** ์คํจ๊ฐ ๋ค์ ์ฌ์ดํด์ ๊ฐ์ ์ฌ๋ฃ๋ค.
๋ชจ๋ ๋ฌธ์ฅ์ **FACT / INFERENCE / UNKNOWN** ์
์ค ํ๋๋ก ๋ถ๋ฅํ๋ฉฐ,
**๊ด์ฐฐ ์์ด INFERENCE๋ฅผ FACT๋ก ์น๊ฒฉํ๋ ๊ฒ์ ๊ธ์ง**ํฉ๋๋ค.
ํ์ ์ `npm run check -- D1|D2|D3` Gate๊ฐ ์ํํ๊ณ , ์ข
๋ฃ ์ฝ๋๋ `GO=0 / REVISE=1 / STOP=2`์
๋๋ค.
> ์๋ณธ ํ๋ ์์ํฌ: [woo4826/security-wave-cve-harness-starter](https://github.com/woo4826/security-wave-cve-harness-starter)
> ์ด ์ ์ฅ์์๋ **์ ๊ฐ ์์ฑํ ๋ถ์ ์ฐ์ถ๋ฌผ๋ง** ๋ด์์ต๋๋ค. Gate ์คํฌ๋ฆฝํธยทํ
ํ๋ฆฟ ๋ฑ ํ๋ ์์ํฌ ์ฝ๋๋ ์๋ณธ์ ์์ต๋๋ค.
---
## 2. ํต์ฌ โ AI๊ฐ ๋ธ ์ค๋ฅ 6๊ฑด๊ณผ ๊ต์
D1 ํ ์ธ์
์์ AI๊ฐ ๋ง๋ค์ด๋ธ ์ค๋ฅ 6๊ฑด์
๋๋ค. **์ ๋ถ ์ฌ๋์ด ์๋ฌธ ๋์กฐ๋ก ์ก์๊ณ **,
๊ฐ๊ฐ์ ์ฌ๋ฐ ๋ฐฉ์ง ์ ์ฐจ๋ก ํ์ฐํ์ต๋๋ค. ์๋ ๊ธฐ๋ก์ [`sources/research-log.md`](sources/research-log.md)์ ์ญ์ ์์ด ๋ณด์กด๋ผ ์์ต๋๋ค.
| # | AI๊ฐ ๋ธ ์ค๋ฅ | ์ด๋ป๊ฒ ์ก์๋ | ์ ์ฐจ๋ก ๋ฐ๊พผ ๊ฒ |
|---|---|---|---|
| 1 | **์กด์ฌํ์ง ์๋ ์ปค๋ฐ ํด์๋ฅผ ์์ฑ** โ `eb294fabโฆ` | ์๋ฌธ Fetch โ **HTTP 404** | ๊ณต์ raw ๊ฒฝ๋ก๋ก ์ฌํ์ธ ๋ชป ํ ๊ฐ์ `UNKNOWN` ์ ์ง |
| 2 | ๊ธ์ง ๋๊ตฌ(`gh` CLI)๋ก diff ์ทจ๋ | ๋๊ตฌ ์ ์ฑ
๋์กฐ. ๊ฒฐ๊ณผ๋ `+0/-0`์ผ๋ก ๋ถ์ ํํ์ | ๋๊ตฌ ํ์ดํธ๋ฆฌ์คํธ๋ฅผ ์ธ์
Preflight์ ๋ช
์ |
| 3 | web search ๊ฒฐ๊ณผ๋ฅผ Source Ref๋ก ์ฌ์ฉ | ์ถ์ฒ ๋ฑ๊ธ ๋์กฐ | ๊ฒ์ ์์ฝ์ ๊ณต์ ์ถ์ฒ ๋์ฒด ๋ถ๊ฐ |
| 4 | **NVD๋ฅผ ๊ณต์ ์ถ์ฒ๋ก ์ฌ์ฉ** | ๊ต์ ๊ท์น ๋์กฐ | **๊ฒฐ๊ณผ: ์ฌ๊ฐ๋๊ฐ 9.8 โ 7.5๋ก ๋ฐ๋** (์๋ ยง3) |
| 5 | ๊ต์ ์ง์๊ฐ ํ๋ฉด ๋ฌธ๊ตฌ์๋ง ๋ฐ์๋๊ณ ์ฐ์ถ๋ฌผ์๋ ๋ฏธ๋ฐ์ | `git diff`๋ก ์ค์ ํ์ผ ํ์ธ | **"๊ณ ์ณค์ต๋๋ค" ์ ์ธ์ Evidence๊ฐ ์๋๋ค** |
| 6 | **๊ณต์ ์ถ์ฒ ์์์ ์๋ชป๋ ์ปจํ
์ด๋๋ฅผ ์ธ์ฉ** โ ADP ๊ฐ์ CNA ๊ฐ์ผ๋ก ๊ท์ | JSON ๊ตฌ์กฐ๋ฅผ ์ปจํ
์ด๋ ๋จ์๋ก ์ฌํ์ฑ | Source Ref์ **ํ๋ ๊ฒฝ๋ก**๊น์ง ๊ธฐ์ฌ |
### 6๋ฒ์ด ๊ฐ์ฅ ๊น์ ์คํจ ๋ชจ๋์
๋๋ค
์ธ ์ค๋ฅ์ ์ธต์๊ฐ ๋ค๋ฆ
๋๋ค.
| | ์คํจ | ์ก๋ ๋ฐ ํ์ํ ๊ฒ |
|---|---|---|
| 4๋ฒ | ๋น๊ณต์ ์ถ์ฒ๋ฅผ ์ | ์ถ์ฒ ๋ชฉ๋ก๋ง ๋ด๋ ์กํ |
| 5๋ฒ | ์ง์ ํ๋๋ฐ ์ฐ์ถ๋ฌผ์ ๊ทธ๋๋ก ๋จ์ | ํ์ผ **diff**๋ฅผ ๋ด์ผ ์กํ |
| **6๋ฒ** | ๊ณต์ ์ถ์ฒ๋ก ๋ฐ๊ฟจ๋๋ฐ **๊ทธ ์์ ์๋ชป๋ ํ๋**๋ฅผ ์ธ์ฉ | **์๋ฌธ JSON ๊ตฌ์กฐ๋ฅผ ์ง์ ํ์ฑ**ํด์ผ ์กํ |
"์ถ์ฒ๊ฐ ๊ณต์์ธ๊ฐ"๋ง ๊ฒ์ฌํ๋ ์ ์ฐจ๋ก๋ 6๋ฒ์ **์๋ฆฌ์ ์ผ๋ก** ์ก์ ์ ์์ต๋๋ค.
๊ทธ๋์ Source Ref ํ์์ `SRC-002 / CVE JSON` ์์
`SRC-002-adp / containers.adp[0].metrics[0].cvssV3_1` ์์ค์ผ๋ก ๋ฐ๊ฟจ์ต๋๋ค.
---
## 3. ๊ท์น์ ์ง์ผฐ๋๋ ๊ฐ์ด ์ค์ ๋ก ๋ฌ๋ผ์ก๋ค
์ด ์ ์ฅ์์์ ๊ฐ์ฅ ๊ฒ์ฆ ๊ฐ๋ฅํ ๊ฒฐ๊ณผ์
๋๋ค.
NVD๋ฅผ ๊ฑท์ด๋ด๊ณ ๊ณต์ CVE record๋ง ์ฌ์ฉํ์, **์ฌ๊ฐ๋๊ฐ ํ๋๊ฐ ์๋๋ผ ์
์ผ๋ก ๊ฐ๋ ธ์ต๋๋ค.**
| ์ถ์ฒ (์ปจํ
์ด๋) | ๊ฐ | ๋ฒกํฐ |
|---|---|---|
| Apache CNA (`containers.cna`) | `"critical"` (์ ์ฑ, **๋นCVSS**) | ์์ |
| CISA-ADP (`containers.adp`) | **7.5 HIGH** | `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N` |
| NVD (**๋ถ์ฑํ**) | 9.8 CRITICAL | `CVSS:3.1/โฆ/C:H/I:H/A:H` |
**์ธ ๊ฐ์ ์ฐจ์ด๋ ์ค๋ฅ๊ฐ ์๋๋ผ ์ ์ ์ ์ฐจ์ด์
๋๋ค.**
- `7.5` = `I:N/A:N` โ ํ์ผ **์ฝ๊ธฐ ๋
ธ์ถ**๋ง ์์
- `9.8` = `I:H/A:H` โ `mod_cgi` ํ์ฑ ์ **RCE**๊น์ง ์์
๋ฐ๋ผ์ **์ด๋ ๊ฐ์ด ๋ง๋๋๊ฐ ์๋๋ผ, ์ด๋ค ์๋ฒ ๊ตฌ์ฑ์ ์ ์ ํ๋๋**์ ๋ฌธ์ ์
๋๋ค.
D2 Lab์ CGI๋ฅผ ๋นํ์ฑํํ๋ฏ๋ก **7.5 ์ ์ ์ ์ ํฉ์ **์ด๊ณ , ์ด๋ฅผ ์คํ **์ ์** ๋ฌธ์๋ก ํ์ ํ์ต๋๋ค.
> ์คํ ์ ์ "์ฐ๋ฆฌ๊ฐ ๊ด์ฐฐํ ๊ฒ์ ํ์ผ ๋
ธ์ถ์ด์ง RCE๊ฐ ์๋๋ค"๋ฅผ ๋ชป๋ฐ์ ๋ ๋๋ถ์,
> D2์์ RCE๊ฐ ์ฌํ๋์ง ์์๋ ๊ทธ๊ฒ์ด **์คํจ๊ฐ ์๋๋ผ๋ ๊ทผ๊ฑฐ**๊ฐ ๋ฏธ๋ฆฌ ํ๋ณด๋ฉ๋๋ค.
์์ธ: [`analysis/severity-notes.md`](analysis/severity-notes.md)
---
## 4. ๊ธฐ์ ๋ถ์ ์์ฝ
### Root Cause (INFERENCE โ ๊ด์ฐฐ ์ ์ด๋ฏ๋ก FACT ์๋)
> 2.4.49์ `ap_normalize_path`๋ dot-segment ํ์ ์ ๋ฆฌํฐ๋ด `.`์ ๋ํด์๋ง ์ํํ๊ณ
> `%xx`-unreserved ๋์ฝ๋ฉ๋ ํํ์ ๊ฐ์ ํ์ ๋ฒ์์ ๋ฃ์ง ์์๊ธฐ ๋๋ฌธ์,
> ๋ ๋ฒ์งธ ์ ์ด `%2e`๋ก ์ธ์ฝ๋ฉ๋ ์ธ๊ทธ๋จผํธ๊ฐ `..`๋ก ์ธ์๋์ง ์์ ์ฑ ์ ๊ทํ๋ฅผ ํต๊ณผํ๋ค.
**FACT (๊ณต์ svn tag ์๋ฌธ ๋์กฐ)**
- 2.4.49: dot-segment ๊ฒ์ฌ๊ฐ `path[l+1] == '.'` ๋ฆฌํฐ๋ด๋ง ํ์ธ `[SRC-003a]`
- 2.4.50: ๊ฐ์ ๊ฒ์ฌ์ `%2e`/`%2E` ๋ถ๊ธฐ ์ถ๊ฐ `[SRC-003b]`
```c
/* 2.4.50 server/util.c โ ์ถ๊ฐ๋ ๋ถ๊ธฐ */
n = l + 1;
if ((path[n] == '.' || (decode_unreserved && path[n] == '%'
&& path[++n] == '2' && (path[++n] == 'e' || path[n] == 'E')))
&& IS_SLASH_OR_NUL(path[n + 1])) {
... l = n + 1; ...
```
### Patch Diff 4์ง์
| ์ง์ | ์์น | ๋ด์ฉ |
|---|---|---|
| ์
๋ ฅ | ์์ฒญ URI ๊ฒฝ๋ก (๊ณต๊ฒฉ์ ํต์ ) | `.../.%2e/...` โ ์ฒซ ์ ์ ๋ฆฌํฐ๋ด, ๋ ๋ฒ์งธ๋ `%2e` |
| ๋ณํ | `%xx`-unreserved ๋์ฝ๋ฉ | ๊ฒ์ฌ ์์ ์๋ ์์ง `%2e` ์ํ |
| **๊ฒ์ฆ (๊ฒฐํจ)** | dot-segment ์ ๊ฑฐ `if` | ๋ฆฌํฐ๋ด๋ง ๊ฒ์ฌ โ `.%2e`๋ฅผ `..`๋ก ์ธ์ ๋ชป ํจ |
| ์ํฅ | ์ ๊ทํ ํ Alias ํด์ | traversal์ด Alias ๋ฐ์ผ๋ก ๋งคํ โ ํ์ผ ๋
ธ์ถ, CGI ์ RCE |
### ๋ฐ์ฆ ์กฐ๊ฑด โ D2์์ ๊ฒ์ฆํ ๊ฒ
1. 2.4.49์ `%2e` ํฌํจ ๊ฒฝ๋ก๋ฅผ ๋ณด๋๋๋ฐ Lab marker๊ฐ ๋์ค์ง ์์ผ๋ฉด ๋ฐ์ฆ
2. 2.4.50์ ๊ฐ์ ์์ฒญ์ด `200` + marker๋ฅผ ๋ฐํํ๋ฉด ๋ฐ์ฆ
3. **`%2e` ์์ด ๋ฆฌํฐ๋ด `../`๋ง์ผ๋ก 2.4.49์์ ๋์ผ ๊ฒฐ๊ณผ๊ฐ ์ฌํ๋๋ฉด**
"์ธ์ฝ๋ฉ ๋ฏธ์ธ์์ด ํต์ฌ ๊ฒฐํจ"์ด๋ผ๋ ์ค๋ช
์ **๋ฐ์ฆ๋๊ฑฐ๋ ๋ฒ์๊ฐ ์ถ์**๋๋ค
> 3๋ฒ์ด ์ด ๋ถ์์ ํต์ฌ์
๋๋ค. 1ยท2๋ฒ์ "traversal์ด ๋๋๊ฐ"๋ฅผ ๋ณด์ง๋ง,
> 3๋ฒ์ "**์ธ์ฝ๋ฉ ๋๋ฌธ์** ๋๋๊ฐ"๋ฅผ ๋ถ๋ฆฌํด์ ๋ด
๋๋ค.
> ์ด ์กฐ๊ฑด ๋๋ฌธ์ Root Cause๋ฅผ D3์์๋ FACT๋ก ์น๊ฒฉํ์ง ์๊ณ INFERENCE๋ก ์ ์งํฉ๋๋ค.
์์ธ: [`analysis/root-cause.md`](analysis/root-cause.md) ยท [`analysis/cwe.md`](analysis/cwe.md)
### ์ฐ๊ด CVE โ ๋ฌด์์ **์๋์ ์ผ๋ก ์ ํ๋๊ฐ**
CVE-2021-42013์ "2.4.50์ 41773 ์์ ์ด ๋ถ์ถฉ๋ถ"ํด์ ๋์จ ํ์ CVE์
๋๋ค.
CVE record ์์ค๊น์ง๋ง ๋์กฐํ๊ณ **2.4.50 vs 2.4.51 ์ฝ๋ ๋์กฐ๋ ์ํํ์ง ์์์ต๋๋ค.**
๋น ๋จ๋ฆฐ ๊ฒ์ด ์๋๋ผ ์๋์ ์ ์ธ์ด๋ฉฐ, ๊ทผ๊ฑฐ 3๊ฐ์ง์ ํจ๊ป ๋ฌธ์์ ๋ช
์ํ์ต๋๋ค.
**๋๋ฝ๊ณผ ์๋์ ์ ์ธ๋ฅผ ๊ตฌ๋ถํด ๊ธฐ๋กํ๋ ๊ฒ** ์์ฒด๊ฐ ๊ฒํ ์์ ์คํด๋ฅผ ๋ง๋ ์ฅ์น์
๋๋ค.
์์ธ: [`analysis/related-cve.md`](analysis/related-cve.md)
---
## 5. ํ๋ก์ธ์ค ๊ฒฐํจ 6๊ฑด (B-1 ~ B-6)
AI์ ์ค๋ฅ์ ๋ณ๊ฐ๋ก, **์ ์ฐจ ์์ฒด์ ๋นํ**์ 6๊ฑด ๋ฐ๊ฒฌํด ๊ธฐ๋กํ์ต๋๋ค.
์์ธ: [`retrospective/d1-blockers.md`](retrospective/d1-blockers.md)
| ID | ๊ฒฐํจ |
|---|---|
| B-1 | ๋๊ตฌ ๊ธ์ง ๊ท์น์ด ์ฐ๋ฌธ์ผ๋ก๋ง ์กด์ฌ โ ์คํ ์์ ๊ฐ์ ์ฅ์น ์์. ํ ์ธ์
์ 3ํ ์๋ฐ |
| B-2 | ์ธ์
์์ ์ง๋ฌธ์ ์์ ๊ฒฝ๊ณ(loopback ํ์ ยทUNKNOWN ์ ์งยทHuman GO)๊ฐ ๋๋ฝ |
| B-3 | Gate๊ฐ ๋น intake๋ฅผ ๋ถ๋ถ์ ์ผ๋ก๋ง ์ฐจ๋จ (`CVE ID:` / `์ ํ:` ๋ง ๊ฒ์ฌ) |
| **B-4** | **์ปค๋ฆฌํ๋ผ ๋จ๊ณ ํ๋๊ฐ ํต์งธ๋ก ๊ฑด๋๋ฐ์ด์ก๊ณ 3์๊ฐ ๋์ ๋ฐ๊ฒฌ๋์ง ์์** |
| B-5 | Gate ๋ฌธ์์ด ๋งค์นญ์ด ๋์๋ฌธ์ยท์ฝ๋ก ๊น์ง ์ ํ ์ผ์น ์๊ตฌ โ ๊ต์ ์ REVISE 13๊ฑด |
| B-6 | ์ฐ์ถ๋ฌผ์ด Gate๊ฐ ์ฝ์ง ์๋ ๊ฒฝ๋ก์ ์์ฑ๋จ |
### B-4๊ฐ ์ด ์ค์ต์์ ๊ฐ์ฅ ์ค์ํ ๋ฐ๊ฒฌ์
๋๋ค
ScopeยทSTOP ์กฐ๊ฑดยท์ญํ ๊ณ์ฝ์ ์์ฑํ๋ ๋จ๊ณ๊ฐ **์คํ๋์ง ์์ ์ฑ๋ก** ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ์ต๋๋ค.
์์ ๊ฒฝ๊ณ๋ฅผ **๋ํ๋ก๋ ์ฃผ๊ณ ๋ฐ์๊ธฐ ๋๋ฌธ์** ์ฌ๋๋ AI๋ "ํ๋ค"๊ณ ์ธ์ํ์ง๋ง,
์ค์ `scope.md`๋ **8๋ฐ์ดํธ ๋น ํ์ผ**์ด์์ต๋๋ค.
Gate ์์ค๋ฅผ ์ง์ ์ฝ์ด ์๊ตฌ ์กฐ๊ฑด์ ๋์กฐํ๋ ๊ณผ์ ์์, ์ธ์
์์ ์ฝ 3์๊ฐ ๋ค์ ๋ฐ๊ฒฌํ์ต๋๋ค.
> **๊ฒฐ๋ก : AI ์ฝ์นญ์ ์ปค๋ฆฌํ๋ผ ๋จ๊ณ์ ์์๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค.**
> AI๋ ์์ ์ด ๋ง๋ Task ๋ชฉ๋ก์ ๋ฐ๋ผ๊ฐ์ง, ์ฌ๋์ด ์ค๊ณํ ์ ์ฐจ๋ฅผ ๋ฐ๋ผ๊ฐ์ง ์๋๋ค.
> ๋ํ์์ ํฉ์ํ ๋ด์ฉ์ **๋ฐ๋์ ํ์ผ๋ก ์ฐฉ์ง**์์ผ์ผ ํ๋ค โ "๋งํ๋ค"๋ ์ฐ์ถ๋ฌผ์ด ์๋๋ค.
---
## 6. ๊ฒ์ฆ ๋ฐฉ๋ฒ
### Gate ์์ค๋ฅผ ๋จผ์ ์ฝ๊ณ ํ์์ ๋ง์ท์ต๋๋ค
Gate๋ ๋ฆฌํฐ๋ด ๋ฌธ์์ด์ **๋์๋ฌธ์ยท์ฝ๋ก ๊น์ง ์ ํํ** ๊ฒ์ฌํฉ๋๋ค.
```js
// scripts/lib/checks.mjs (์๋ณธ ํ๋ ์์ํฌ)
requireText(rootCause, "root-cause.md", ["FACT:", "INFERENCE:", "UNKNOWN:", "๋ฐ์ฆ ์กฐ๊ฑด"], issues);
if (line.trim().startsWith("FACT:") && !/\[SRC-\d+\]/.test(line)) {
issues.push(label + ": FACT requires [SRC-NNN]");
}
```
Gate๋ฅผ ์คํํ๊ธฐ **์ ์** ์ด ์ฝ๋๋ฅผ ์ฝ๊ณ ์ฐ์ถ๋ฌผ๊ณผ ๋์กฐํด **REVISE 13๊ฑด์ ์ฌ์ ์์ธก**ํ๊ณ ,
๋ด์ฉ์ ๊ทธ๋๋ก ๋ ์ฑ ํ์๋ง ๋ง์ถฐ ์ ๋ถ ํด์ํ์ต๋๋ค.
๋ฐ๊ฒฌํ ๋ฏธ๋ฐํ ์ง๋ขฐ๋ ๊ธฐ๋กํ์ต๋๋ค โ `/\[SRC-\d+\]/` ๋ `[SRC-003a]`์ฒ๋ผ
์ซ์ ๋ค์ ๋ฌธ์๊ฐ ๋ถ์ ์ฐธ์กฐ๋ฅผ ๋งค์นญํ์ง ๋ชปํฉ๋๋ค. ํ์ฌ๋ FACT ์ค์ด `- FACT:` ๋ก ์์ํด
`startsWith("FACT:")` ๊ฒ์ฌ๋ฅผ ํ์ง ์์ ํต๊ณผ ์ค์
๋๋ค.
### ๊ฒฐ๊ณผ (์ ์ธ์ด ์๋๋ผ ์ค์ ์ข
๋ฃ ์ฝ๋)
```
$ node scripts/check-day.mjs D1
DAY=D1 DECISION=GO
EXIT_CODE=0
$ node scripts/validate-starter.mjs
VALIDATION=GO
$ node --test
# tests 34 # pass 34 # fail 0
```
D2 ์ ํ ์คํ: **Docker 0ํ / curl 0ํ / Control ์คํ 0ํ.** D1์ ์ ์ ๋ถ์๋ง ์ํํ์ต๋๋ค.
---
## 7. ์ฐ์ถ๋ฌผ โ ์ฝ๋ ์์
ํ์ผ ์์๊ฐ ๊ณง ๋
ผ๋ฆฌ ์์์
๋๋ค.
| # | ํ์ผ | ์ญํ |
|---|---|---|
| 1 | [`scope.md`](scope.md) | ๋ฌด์์ ํ๊ธฐ๋ก ํ๋ โ ๊ฒฝ๊ณยทSTOP ์กฐ๊ฑดยท์น์ธ ๊ณ์ฝ |
| 2 | [`intake.md`](intake.md) | ๋์ ํ ์ฅ ์์ฝ |
| 3 | [`sources/source-map.md`](sources/source-map.md) | ๊ทผ๊ฑฐ๊ฐ ์ด๋์ ์๋ โ ์ถ์ฒ ๋์ฅ (์ปจํ
์ด๋ยทํ๋ ๋จ์) |
| 4 | [`sources/research-log.md`](sources/research-log.md) | **์ด๋ป๊ฒ ์คํจํ๋** โ ์คํจยทREJECTED ๋ณด์กด |
| 5 | [`analysis/root-cause.md`](analysis/root-cause.md) | ์ ์ทจ์ฝํ๊ฐ โ ์์ธ + ๋ฐ์ฆ ์กฐ๊ฑด |
| 6 | [`analysis/cwe.md`](analysis/cwe.md) | CWE-22 + ๋์ ํ๋ณด + ๋ฐ์ฆ ์กฐ๊ฑด |
| 7 | [`analysis/severity-notes.md`](analysis/severity-notes.md) | ์ฌ๊ฐ๋๊ฐ ์ ์
์ผ๋ก ๊ฐ๋ฆฌ๋๊ฐ |
| 8 | [`analysis/related-cve.md`](analysis/related-cve.md) | CVE-2021-42013 ๋์กฐ + ์๋์ ์ ์ธ ๋ฒ์ |
| 9 | [`harness/harness-v0.md`](harness/harness-v0.md) | ์ฌ์ฌ์ฉ ์ ์ฐจ + ๊ฐ์ ํ๋ณด 7๊ฑด |
| 10 | [`retrospective/d1-blockers.md`](retrospective/d1-blockers.md) | ํ๋ก์ธ์ค ๊ฒฐํจ B-1~B-6 |
> `harness-v0.md`๊ฐ ์ฐธ์กฐํ๋ `harness/workflow.md`ยท`AGENTS.md`๋ ์๋ณธ ํ๋ ์์ํฌ์ ํ์ผ์
๋๋ค.
---
## 8. ๋ค์ ๋จ๊ณ
| Day | ๋ด์ฉ | ์ํ |
|---|---|---|
| **D1** | Source Map ยท Patch Diff ยท Root Cause ยท CWE ยท Harness v0 | โ
Gate GO |
| D2 | localhost ๊ฒฉ๋ฆฌ Lab (2.4.49 / 2.4.50) โ Control Card โ **Human GO** โ Observation | ์์ |
| D3 | Same-Control Retest ยท Evidence Review ยท ๋ณด๊ณ ์ ยท Harness v1 ยท clean clone ์ฌํ | ์์ |
D2์์๋ ์ **๋ฐ์ฆ ์กฐ๊ฑด 3๊ฑด**์ ์ค์ loopback Lab์์ ๊ฒ์ฆํฉ๋๋ค.
Lab์ deny-by-default๋ก ๊ตฌ์ฑํ๊ณ CGI๋ฅผ ๋นํ์ฑํํ๋ฉฐ, ์ค์ OS ํ์ผ ๋์ Lab ์์ marker๋ง ๋
ธ์ถํฉ๋๋ค.
---
## ์ ์๊ถ
์ด ์ ์ฅ์์ **๋ถ์ ๋ฌธ์๋ ์ ๊ฐ ์์ฑํ ๊ฒ**์
๋๋ค.
์ค์ต์ ์ฌ์ฉํ ํ๋ ์์ํฌ(Gate ์คํฌ๋ฆฝํธ, ํ
ํ๋ฆฟ, ๊ต์ ๊ท์น ๋ฌธ์)๋
[์๋ณธ ์ ์ฅ์](https://github.com/woo4826/security-wave-cve-harness-starter)์ ์์ผ๋ฉฐ ์ฌ๊ธฐ์ ํฌํจํ์ง ์์์ต๋๋ค.
Apache HTTP Server ์์ค ์ธ์ฉ์ Apache License 2.0์ ๋ฐ๋ฆ
๋๋ค.