[2026-07-10] CODA Runtime Detection of Application-Layer CPU-Exhaustion DoS Attacks in Containers
Motivation
์ฐ๊ตฌ ๋ฐฐ๊ฒฝ
- ์ง๋ฅ์ ์ธ ํ์ ๊ณต๊ฒฉ: ์ต๊ทผ์ DoS๋ ๋จ์ํ ๋ฌด์ฐจ๋ณ์ ์ธ ํธ๋ํฝ์ ํผ๋ถ๋ ์ ํต์ ์ธ ๋ฐฉ์์ ๋์ด, ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ ์๋งจํฑ(์๋ฏธ๋ก ์ ๊ตฌ์กฐ)์ ์ฝ์ ์ ์ ๋ฐํ๊ฒ ๊ฒจ๋ฅ
- ์์ ์๋ชจ์ ๊ทน๋ํ: ๊ณต๊ฒฉ์๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์์ ์ฐ์ฐ ๋น์ฉ์ด ๊ฐ์ฅ ๋ง์ด ๋๋ ๋นํจ์จ์ ์ธ ์คํ ๊ฒฝ๋ก(Execution path)๋ฅผ ์ฐพ์๋ด์ด ์ ์ฑ ์์ฒญ์ ์ฃผ์ . ๋จ ๋ช ๊ฐ์ ์์ฒญ๋ง์ผ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต์ CPU ์์์ ์๋ํ์ฌ ์๋น์ค๋ฅผ ๋ง๋น
- ํ์ง์ ์ด๋ ค์ : ์ ๊ทํํ์ ์ทจ์ฝ์ ์ ๋ ธ๋ฆฐ ReDoS ๊ณต๊ฒฉ์ ๊ฒฝ์ฐ, ๋คํธ์ํฌ ๊ณ์ธต์์๋ ์ด๋ ํ ๋น์ ์ ํจํด์ด๋ ๋์ฉ๋ ํธ๋ํฝ ์งํ๊ฐ ๋ํ๋์ง ์์.
๊ธฐ์กด ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต ํ์ง ๊ธฐ๋ฒ์ ํ๊ณ
- RAMPART : ์ค์ง PHP ์ธ์ด๋ก ์์ฑ๋ ์น ํ๋ก๊ทธ๋จ๋ง์ ์ง์. ๋ค์ํ ์ธ์ด๋ก ๊ตฌ์ถ๋๋ ํ๋ ๋ฉํฐ ์ปจํ ์ด๋ ํ๊ฒฝ์ ์ ์ฉํ ์ ์์
- FINELAME : ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ค ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ์์ฒญ์ ์์๊ณผ ๋์ ์๋ฆฌ๋ ์ฃผ์(Annotation)์ ์ฝ๋์ ์ถ๊ฐ. ์์ค ์ฝ๋๋ฅผ ์ ์ํ ์ ์๋ Closed-source ๊ธฐ๋ฐ์ ์๋ํํฐ ํ๋ก๊ทธ๋จ์ด๋ ์ธ๋ถ ํจํค์ง๊ฐ ๋ง์ ์ ์ฉ์ด ๋ถ๊ฐ๋ฅ
- COGO : ์ปจํ
์ด๋ ๋ด๋ถ์ ๋ณ๋์ ๊ฐ์ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ๋ก ์ฌ์ด์ผ ํจ โ ์ปจํ
์ด๋์ ๊ฒฉ๋ฆฌ์ฑ์ ๊นจ๋จ๋ฆฌ๊ณ ๋ณธ๋์ ๋์์ ์ํฅ์ ์ค ์ ์์
- ํ์ง ์ฃผ๊ธฐ๊ฐ ์ด ๋จ์๋ก ๊ตผ๋ ์ ์ฆ๊ฐ ์ฐจ๋จ์ด ์ด๋ ค์
Goal
- ์ธ์ด ๋ ๋ฆฝ์
- ์์ค ์ฝ๋์ ๋ํ ์ง์ ์๊ตฌ X : closed source ๊ธฐ๋ฐ์ ์๋ ํํฐ๋ ๋ณดํธ
- ํฌ๋ช ํ ์ปจํ ์ด๋ ๋ชจ๋ํฐ๋ง : ์ปจํ ์ด๋ ํ๊ฒฝ์ ๊ฒฉ๋ฆฌ์ฑ์ ๋ณด์กด. ์ปจํ ์ด๋ ๋ด๋ถ๋ฅผ ์นจ๋ฒํ์ง ์๊ณ ๋ฐ์์ ํฌ๋ช ํ๊ฒ ๊ฐ์ํ์ฌ ์๋ ๋์์ ๊ฐ์ญ์ด๋ ์ํฅ์ ์ฃผ์ง ์์
Contribution
- ์ฐ๊ฒฐ์ ์ํด ์๋น๋ CPU ์๊ฐ์ ๋ชจ๋ธ๋งํ๊ณ ๋ชจ๋ํฐ๋งํ์ฌ ์ปจํ ์ด๋ ํ๊ฒฝ์์ CPU ๊ณ ๊ฐ DoS ๊ณต๊ฒฉ์ ํ์ง
- ์์ค ์ฝ๋๋ฅผ ์์ง ๋ชปํด๋
- ํ ์ด๋ ๋ด๋ถ์ PID๋ฅผ ์ถ์ ํ๊ณ ์ด๋ฅผ ์ ์ญ PID์ ๋งคํํ์ฌ ์ปจํ ์ด๋ ๋ชจ๋ํฐ๋ง์ ์ง์ํ๋ฉฐ, ์ด๋ ์ปจํ ์ด๋์ ์ด๋ ํ ๊ฐ์ญ๋ ์์ด ํฌ๋ช
- ์ค์ ํ๊ฒฝ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ณต๊ฒฉ์ ๋์์ผ๋ก CODA๋ฅผ ํ๊ฐ. ๋ฎ์ ์ถ๊ฐ ์ค๋ฒํค๋๋ก ์ ํํ ํ์ง
Threat Model & Assumptions
Threat Model : ์ปจํ ์ด๋์ ๋ฐฐํฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ทจ์ฝ์ ์ ์๊ณ ์๋ ๊ณต๊ฒฉ์
Scope : ๋จ์ผ ๋๋ ๋ค์์ ํด๋ผ์ด์ธํธ์ด๋ฉฐ ๋ฐฐ๊ฒฝ ํธ๋ํฝ๊ณผ ๊ฐ์ด ์ ์ก. ๊ธฐ์กด ์ฅ๋น๋ก ์ฝ๊ฒ ๋ฐฉ์ด ๊ฐ๋ฅํVolumetric ๊ณต๊ฒฉ์ ์ ์ธ
Assumption : ๊ณต๊ฒฉ์๋ ์ฌ์ ํ์ ์๊ฐ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ฐฐํฌ ์งํ๋ ์ ์ ํธ๋ํฝ๋ง ๋ณด์ฅ๋๋ฉฐ ํด๋น ๋ฐ์ดํฐ๋ฅผ ํตํด ๋ชจ๋ธ ํ์ต
CODA Design
Overview
-
Architecture

- Containers tracing module : ์ปจํ
์ด๋ ๋ด๋ถ์์ ๋ฐ์ํ๋ ์์คํ
ํธ์ถ(์ธ์ ๋ฐ ๋ฐํ๊ฐ ํฌํจ)๋ฅผ ์ถ์ . ํด๋น ํธ์ถ์ UTS ๋ค์์คํ์ด์ค ์ด๋ฆ, PID ๋ฐ TID๋ ํจ๊ป ์ถ์
- UTS ๋ค์์คํ์ด์ค : ํธ์คํธ ์ด๋ฆ๊ณผ NIS ๋๋ฉ์ธ ์ด๋ฆ์ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค๊ณผ ์์ ํ ๊ฒฉ๋ฆฌ
- ํด๋น ์ด๋ฆ์ ๊ฐ์ ธ์์ ์ปจํ ์ด๋๋ฅผ ๊ณ ์ ํ๊ฒ ์๋ณ
- ์๋ ์ปค๋ ์์ฒด์๋ ์ปจํ ์ด๋๋ ์ปจํ ์ด๋ ID๋ผ๋ ๊ฐ์ฒด ๊ฐ๋ ์ด ์์
- PID, TID ๋ฐ ์์คํ ํธ์ถ์ ๋งค๊ฐ๋ณ์๋ก ๋ชจ๋ํฐ๋ง ๋ชจ๋๋ก ์ ๋ฌ
- UTS ๋ค์์คํ์ด์ค : ํธ์คํธ ์ด๋ฆ๊ณผ NIS ๋๋ฉ์ธ ์ด๋ฆ์ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค๊ณผ ์์ ํ ๊ฒฉ๋ฆฌ
- CPU time monitoring module : ์ฒ๋ฆฌ ์ค์ธ ์ฐ๊ฒฐ์ด ์๋นํ๋ CPU ์๊ฐ์ ๋ชจ๋ํฐ๋ง
- Attack detection module : ์ฌ์ฉ์ ๊ณต๊ฐ์์ ์ ์ CPU ์๊ฐ ๋ชจ๋ธ์ ํ์ตํด ์๊ณ์น๋ฅผ ์ค์ ํ๊ณ , ๋ฐํ์์ CPU ์๋ชจ๋์ด ์ด๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ ๊ณต๊ฒฉ์ผ๋ก ํ๋ณ
- Containers tracing module : ์ปจํ
์ด๋ ๋ด๋ถ์์ ๋ฐ์ํ๋ ์์คํ
ํธ์ถ(์ธ์ ๋ฐ ๋ฐํ๊ฐ ํฌํจ)๋ฅผ ์ถ์ . ํด๋น ํธ์ถ์ UTS ๋ค์์คํ์ด์ค ์ด๋ฆ, PID ๋ฐ TID๋ ํจ๊ป ์ถ์
-
๋์ ํ๋ฆ

- ํ์ต ๋จ๊ณ : ์ ์ ์ฐ๊ฒฐ์ด ์๋นํ๋ CPU ์๊ฐ ๋ชจ๋ธ๋ง
- ํ์ง ๋จ๊ณ : ๊ฐ ์ฐ๊ฒฐ์ด ์๋นํ๋ CPU ์๊ฐ์ ๋ชจ๋ํฐ๋ง ํ ๊ณต๊ฒฉ ํ์ง
- ์ปจํ ์ด๋๋ฅผ tracing ํ๊ธฐ ์์
- accept()์ด ํฌ์ฐฉ๋๋ฉด CPU ์๊ฐ ๋ชจ๋ํฐ๋ง ๋ชจ๋์ ํธ๋ฆฌ๊ฑฐํ์ฌ ํด๋น ์ฐ๊ฒฐ์ด ์๋นํ๋ CPU ์๊ฐ์ ๋ชจ๋ํฐ๋ง
- ๊ณต๊ฒฉ ํ์ง
- close()์ด ํฌ์ฐฉ๋๋ฉด CPU ์๊ฐ์ ๋ํ ๋ชจ๋ํฐ๋ง์ ์ค๋จ
-
๊ตฌ๋ ํ๊ฒฝ : ์๋ฒ ํธ์คํธ ํ๊ฒฝ์ ๋ฐฐํฌ. ์ปค๋ ์์ ์์ด eBPF๋ฅผ ํตํด ์ปค๋์ ์ฃผ์
Containers Tracing Module
๊ธฐ์กด ๋ฐฉ์์ ํ๊ณ
- ์ ํต์ ์ธ ์์คํ
ํธ์ถ ์ถ์ ๋๊ตฌ(์: strace)๋ ํธ์ถ๋ง๋ค ํ๋ก์ธ์ค๋ฅผ ์ค๋จ์ํค๋ฏ๋ก ์ค๋ฒํค๋๊ฐ ํผ
- ๊ธฐ์กด ๋ฐฉ์์ ํ๋ก์ธ์ค๋ฅผ ์ค๋จ ํ ํ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๊ฐ.
- ํธ์คํธ OS ์ ์ฅ์์๋ ์ปจํ ์ด๋ํ๋ ํ๋ก์ธ์ค์ ์ผ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๊ตฌ๋ถํ๊ธฐ ํ๋ฆ
eBPF ๊ธฐ๋ฐ ์ปจํ ์ด๋ ์ถ์

CODA๋ eBPF๋ฅผ ํ์ฉํ์ฌ ์ปค๋์ ์์ ํ์ง ์๊ณ ๋ ๋ค์ดํฐ๋ธ ์๋๋ก ์์คํ ํธ์ถ์ ์ถ์ ํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ๋ ผ๋ฆฌ๋ก ์ปจํ ์ด๋ ํ๋ก์ธ์ค๋ง ์ ๋ณ
- PID ๋ค์์คํ์ด์ค ํน์ฑ ํ์ฉ : ์ปจํ ์ด๋๊ฐ ์์ฑ๋ ๋๋ ์์ ๋ง์ ๊ณ ์ ํ PID ๋ค์์คํ์ด์ค๋ฅผ ๊ฐ์ง๋ฉฐ, ์ด ๋ค์์คํ์ด์ค ๋ด๋ถ์ ์ฒซ ๋ฒ์งธ ํ๋ก์ธ์ค๋ ํญ์ PID 1์ ํ ๋น
- PID ์ถ์
- eBPF ํจ์
bpf_get_current_task()๋ฅผ ํธ์ถํ์ฌ ํ์ฌ ์คํ ์ค์ธ ํ๋ก์ธ์ค์ ๋์คํฌ๋ฆฝํฐ(task_struct)์ ์ ๊ทผ- BCC ํดํท์ attach_kprobe()์ attach_kretprobe() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ
task_struct๋ด๋ถ์nsproxyํฌ์ธํฐ๋ฅผ ํตํด ๋ค์์คํ์ด์ค ์ ๋ณด๋ฅผ ํ์ธ. PID๊ฐ 1์ธ ํ๋ก์ธ์ค๊ฐ ํฌ์ฐฉ๋๋ฉด ์๋ก์ด ์ปจํ ์ด๋์ ์์์ผ๋ก ๊ฐ์ฃผํ๊ณ ํด๋น PID ๋ค์์คํ์ด์ค๋ฅผ ๊ณต์ ํ๋ ๋ชจ๋ ํ์ ํ๋ก์ธ์ค ์ถ์ - ํธ์คํธ OS๋ ์ ์ญ ๋ค์ ์คํ์ด์ค๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ 1์ ๋ฐ๊ฒฌํ๊ณ ํด๋นํ๋ ํ๋ก์ธ์ค๋ฅผ ์ถ์
- task_struct : ํ๋ก์ธ์ค ์ ๋ณด๋ฅผ ์ ์ด๋๋ ๋์คํฌ๋ฝํฐ
- nsproxy : namespace proxy
- eBPF ํจ์
- ๋ค๋ฅธ ๋ชจ๋๋ค์์ ํ์ฉํ ์ ์๊ฒ
nsproxy๊ตฌ์กฐ์ฒด๋ฅผ ํตํด TID๋ ์ถ์ - ํ์ ๋ก๊น
์ ํ๊ธฐ ์ํด ์ปจํ
์ด๋ ๊ตฌ๋ณ : ์์คํ
ํธ์ถ์ด ์ด๋ ์ปจํ
์ด๋์์ ์๋ ์ง ๊ตฌ๋ถ
- UTS ๋ค์์คํ์ด์ค ์ด๋ฆ์
nsproxy๊ตฌ์กฐ์ฒด๋ฅผ ํตํด ์ป์ด๋ด๊ณ ์ปจํ ์ด๋ ID๋ก ์ค์ .
- UTS ๋ค์์คํ์ด์ค ์ด๋ฆ์
- Background: ์ปจํ
์ด๋ ID vs ๋ค์์คํ์ด์ค
- ๋ค์์คํ์ด์ค : ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ ๊ณ ์ ๋ฒํธ. ์ปจํ ์ด๋๊ฐ ๋ฉ์ท๋ค๊ฐ ๋ค์ ์คํํ๋ฉด ์ด๊ธฐํ
- ์ปจํ ์ด๋ ID : User space์์ ์ฌ์ฉํ๋ ์ปจํ ์ด๋ ์๋ณ๊ฐ. ๋ฉ์ท๋ค๊ฐ ๋ค์ ์คํํด๋ ์ ์ง. ํ๋์ ์ปจํ ์ด๋์ ์ฌ๋ฌ ๊ฐ์ ๋ค์์คํ์ด์ค๊ฐ ์์ ์ ์์
- ์ปค๋ ๋จ์์ ์ปจํ
์ด๋๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด์๋ ๊ฐ๋จํ ๋ฒํธ ํํ์ ๋ค์์คํ์ด์ค๋ฅผ ํตํด ๊ตฌ๋ถ
- ๋ค์์คํ์ด์ค๋ผ๋ ๋ฐฉ์ ์ปจํ ์ด๋ ID๋ผ๋ ๋ช ํจ๊ฐ ๊ฑธ๋ ค ์์
- ๋ชจ๋ํฐ๋ง ์์๋ ์ปจํ ์ด๋ ID๋ฅผ ํตํด ์์์ ์ผ๋ง๋ ์ป๋ ์ง ๊ธฐ๋ก
- ํ์ง ๋ชจ๋์์ ๊ณต๊ฒฉ์ ํ์งํ์ ๋ ์ปจํ ์ด๋ ID๋ฅผ ํตํด์ ๋ค์์คํ์ด์ค๋ฅผ ํ์ธํ๊ณ ์ ์ง์ํค๋ ๊ฐ ์กฐ์น๋ฅผ ์ทจํจ
CPU Time Monitoring Module
System Calls for HTTP(S) Requests
HTTP ์์ฒญ์ ๋์์ผ๋ก ํ์ง๋ง ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต ๊ณต๊ฒฉ์ผ๋ก ํ์ฅ์ด ๊ฐ๋ฅํจ.
accept()ํธ์ถ ์ ์ธก์ ์์.close()์ ์ธก์ ์ข ๋ฃ- HTTP ํต์ ์ TCP ์์์ ๋์ํ๋ฏ๋ก TCP๋ฅผ ์ถ์ ํ์ฌ ์ธก์
- HTTP ์์ฒด๋ ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํ ์ฝ์ด๋ผ ์์คํ ์ฝ์ด ์์ด ์ธ์ ์์๋๊ณ ๋๋๋ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ TCP ๋จ์์ ํจ
- ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์ธ์ด์ ์๊ด ์๊ณ ๊ฐ๋ฐ์๊ฐ ๋ชจ๋ํฐ๋ง์ ์ํด ์์ค ์ฝ๋๋ฅผ ์์ ํ์ง ์์๋ ๋จ
PID/TID Mapping
- ์ธก์ ํ๋ PID/TID๋ ์ปจํ
์ด๋ ๋ด๋ถ์ ๋ก์ปฌ ๋ฒํธ์ด๋ฏ๋ก ์ด๋ฅผ global PID/TID๋ก ๋งคํ
- ํธ์คํธ์์ ์ปจํ ์ด๋ ๋ด๋ถ์ CPU ์ฌ์ฉ๋์ ํ์ธ
- ์ฉ์ด ์ฐจ์ด
- User space : ํ๋ก์ธ์ค ๋ฒํธ๋ PID, ์ค๋ ๋ ๋ฒํธ๋ TID
- Kernel Space : ํ๋ก์ธ์ค ๋ฒํธ๋ TGID(Thread Group ID), ์ค๋ ๋ ๋ฒํธ๋ PID. ๋ ผ๋ฌธ์์๋ k-PID๋ผ๊ณ ๋ช ๋ช
- ๋์ ํ๋ฆ
accept()ํธ์ถ์ด ํธ๋ฆฌ๊ฑฐ๋ ๋,bpf_get_current_pid_tgid()๋ผ๋ eBPF ํจ์๋ฅผ ํธ์ถaccept()๊ฐ TGID์ k-PID๋ฅผ ๋ฆฌํด- Containers Tracing Module์ด ์ฃผ๋ PID์ TID๋ฅผ TGID์ k-PID๋ฅผ ๋งคํ
CPU Time Monitoring
- PID-TID ์์ thread์ ๊ณ ์ ์๋ณ๊ฐ์ด๋ฉฐ ์ด ํ๋์ thread๋ ํ ๊ฐ์ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌ
- ๋์ ํ๋ฆ
- ์ปค๋์ด
accept() ํธ์ถํ๋ฉดaccept()๊ฐ ํด๋น ์์ผ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ํด๋นํ๋ ์์ ์ ์ ๋ฒํธ๋ฅผ ๋ฆฌํด close()ํ ๋, ์์ผ ๋ฒํธ๋ฅผ ์ธ์๋ก ๋ฃ๊ณ ์ฐ๊ฒฐ์ ๋์.
โ
close()์ ์ธ์๊ฐ๊ณผaccept()์ ๋ฆฌํด๊ฐ์ด ๊ฐ์ผ๋ฉด ๋ชจ๋ํฐ๋ง์ ์ค๋จ - ์ปค๋์ด
- ํ๋ ์ ํ๋ฆฌ์ผ์ด์
: ์ฐ๊ฒฐ์ ์ค์ ํ๊ณ ์ฒ๋ฆฌํ๋ ์์
์ด ์๋ก ๋ค๋ฅธ ์ค๋ ๋์ ์ํด ์ํ๋ ์ ์์.
- ๋จ์ผ ํ๋ก์ธ์ค/ ๋จ์ผ ์ค๋ ๋ ํ๊ฒฝ : ์์ ๋ฐฉ์๋๋ก ์ฒ๋ฆฌ
- ๋ฉํฐ ํ๋ก์ธ์ค/ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ : ๊ฐ ํ๋ก์ธ์ค/์ค๋ ๋๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์ฐ๊ฒฐ์ ์๋ฝํ๊ณ ์ฒ๋ฆฌ. ๋์์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์์ด๋ ๊ฒฐ๊ตญ์ ์ฐ๊ฒฐ๊ณผ ์ค๋ ๋๋ 1๋1๋ก ๋งคํ
- ๋ฉํฐ ํ๋ก์ธ์ค / ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ ์ค ๋ถ๋ชจ-์์ ๋ชจ๋ธ
- ๋์ ํ๋ฆ
- ํ๋์ ํ๋ก์ธ์ค๋ ์ค๋ ๋๊ฐ ์ฐ๊ฒฐ ์๋ฝ
- ๋ถ๋ชจ process/thread๊ฐ sub-process/thread๋ฅผ cloneํ์ฌ ์์ฑ ํ ๋๊ธฐ๋ก ๋์๊ฐ
- sub-process/thread๋ ๊ฐ๊ธฐ ๋ค๋ฅธ PID/TID๋ฅผ ๊ฐ์ง
- sub-process/thread๊ฐ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ๊ณ ์ข ๋ฃ
- CODA๋
clone()์์คํ ์ฝ์ ์ถ์ ํ์ฌ ํ์ PID/TID๋ฅผ ๊ธฐ๋กํ๊ณ close() ์ ๊น์ง sub-process/thread์ ์์ ์ฌ์ฉ๋ ์ถ์
- ๋์ ํ๋ฆ
- Process Pool/Thread Pool : ์ฌ๋ฌ ๊ฐ์ thread๋ฅผ ๋ฏธ๋ฆฌ ์ ์งํ๊ณ ์ฐ๊ฒฐ ์๋ฝ ํ ๊ด๋ฆฌ ํ๋ก๊ทธ๋จ์ด ์์
์ ํ ๋น
- thread clone์ ํ์ง๋ ์๊ณ ์๋ฉธํ์ง ์์์ TID๊ฐ ๋ณํ์ง ์์
- CODA
- Thread Pool์ ์๋ ์ ํ๋ ์์ TID๋ฅผ ๊ธฐ๋ก
accept()์ ๊ธฐ๋ก๋ TID๋ค์ ๋ฐํ์ผ๋ก Thread Pool ๋ด์ Thread๋ค์ด ์๋นํ๋ CPU ์๊ฐ์ ๋ชจ๋ํฐ๋งclose()ํธ๋ฆฌ๊ฑฐ ์ ์ข ๋ฃ- ๋๋ถ๋ถ ์ด 4๊ฐ์ง์ ์ํ๋ฉฐ ๊ด๋ฆฌ์๊ฐ ์๋ฒ์ ๋ง๋ ๋ชจ๋ํฐ๋ง ๋ฐฉ๋ฒ์ ์ฑํ
- ์ค์ CPU ์ฌ์ฉ ์๊ฐ๊ณผ accept-close ์๊ฐ์ ์ฐจ์ด : ์ปจํ
์คํธ ์ค์์น ๋ฑ์ผ๋ก ํญ์ CPU๋ฅผ ์ ์ ํ์ง๋ ์์.
- ์ปจํ
์คํธ ์ค์์น ์ ํธ์ถ๋๋
finish_task_switch()์ ํตํด CPU ์ฌ์ฉ ์๊ฐ์ ํ์ธ - ์ ํจ์๊ฐ ํธ์ถ๋ ๋,
bpf_get_current_pid_tgid()๋ฅผ ํตํด ํ์ฌ์ k-PID์ TGID๋ฅผ ์ป๊ณ ,bpf_ktime_get_ns()ํจ์๋ฅผ ํตํด ํ์์คํฌํ๋ฅผ ์ป์ด ์ด๋ค ํ๋ก์ธ์ค๊ฐ ์ผ๋ง๋งํผ ์ปจํ ์คํธ ์ค์์น ํ๋ ์ง ์ ์ ์์
- ์ปจํ
์คํธ ์ค์์น ์ ํธ์ถ๋๋
Attack Detection Module
์ ์ CPU ์๊ฐ ๋ชจ๋ธ์ ํตํด ์๊ณ๊ฐ์ ์ค์ ํ์ฌ ์ฐ๊ฒฐ๋ง๋ค CPU ์๊ฐ์ ๋น๊ตํจ. ์๊ณ๊ฐ ์ดํ๋ฉด ์ ์(0), ์ด๊ณผํ๋ฉด ๊ณต๊ฒฉ(1)๋ก ํ๋ณ
- ์ปจํ
์ด๋ ๋ด๋ถ์์ ์ ๊ณตํ๋ ์๋น์ค๋ ๋์ฒด๋ก ํ๋์ ์๋น์ค
- ํ๋์ ์ปจํ ์ด๋ ๋ด๋ถ์์ ์๋ชจํ๋ CPU ์๊ฐ์ ๋น์ทํ ๊ฒ
- ๊ฐ ์ปจํ ์ด๋๋ง๋ค ์๋น์ค๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์๊ณ๊ฐ์ด ๋ฌ๋ผ์ผ ํจ. ๋ค๋ฅธ ๋ชจ๋ธ ์ฌ์ฉ
- ์๊ณ๊ฐ๊ณผ ์ฑ๋ฅ์ ํธ๋ ์ด๋์คํ : ๋๊ฒ ์ค์ ํ๋ฉด ๋ฏธํ์ด ๋์์ง๊ณ ๋ฎ๊ฒ ์ค์ ํ๋ฉด ์คํ์ด ๋์์ง
- ์ ์ฑ ๊ณต๊ฒฉ์ด ํจ๊ณผ๋ฅผ ๋ณด๊ธฐ ์ํด์๋ ์์ฃผ ๋ง์ CPU ์๊ฐ์ ์๋ชจ์์ผ์ผ ํ๋ฏ๋ก ์๊ณ๊ฐ์ ๋๊ฒ ์ค์
-
์ค์ ๊ณต์
\[P(|t - m| > ks) \le \frac{1}{k^2}\] \[t = \max(t_{max}, m + ks)\]- $t_{max}$ : ํ์ต ๋ฐ์ดํฐ์ (์ ์) ์ค ๊ฐ์ฅ ํฐ ์๊ฐ
- $m, s$ : ํ์ต ๋ฐ์ดํฐ์ ์ ๋ฐ์ดํฐ์ ํ๊ท ๊ณผ ํ์ค ํธ์ฐจ
- ์ฒด๋น์ผํ ๋ถ๋ฑ์ : ๋ถํฌ๊ฐ ์ด๋ป๋ ๋ฌด์กฐ๊ฑด ์ฑ๋ฆฝํ๋ ๋ฒ์น
- ํธ๋ํฝ์ ๋ถํฌ๋ฅผ ๊ฐ์ ํ์ง ์์
- ๋ฌด์์ t๊ฐ ํ์ค ํธ์ฐจ์ k๋ฐฐ ๋จ์ด์ ธ ์์ ํ๋ฅ ์ $\frac{1}{k^2}$
- $m + ks$ : ํต๊ณ์ ํ๊ณ์ .
- ๋ ๋ฒ์งธ ์์ : ๋ ํฐ ๊ฐ์ ๊ธฐ์ค์ ์ผ๋ก ์ด ๋ค๋ ๊ฒ โ ์คํ ๊ฐ์
- eBPF ์ ์ฝ
- ๋ถ๋ ์์์ ์ฐ์ฐ ์ง์ X : ์๊ณ๊ฐ $t$์ $10^a$๋ฅผ ๊ณฑํ๊ณ ๋ฐ์ฌ๋ฆผํ์ฌ ์ ์๊ฐ $tโ$๋ฅผ ์ป์ด๋.
Evaluation
Setup
์๋ฒ(Intel i7-8700k CPU์ 16GB RAM ํ๊ฒฝ)์ ํด๋ผ์ด์ธํธ(Intel i5-6200u CPU์ 8GB RAM ํ๊ฒฝ)์ LAN์ผ๋ก ์ฐ๊ฒฐ

- ์ปจํ
์ด๋ 1 : Node.js ์ฌ์ฉ. ๋จ์ผ thread
tough-cookie๋ผ๋ ์ฟ ํค ํ์๋ฅผ ์ฌ์ฉ. ReDoS์ ์ทจ์ฝ
- ์ปจํ
์ด๋ 2 : Apache. ๋ฉํฐ ํ๋ก์ธ์ค๋ก ๊ตฌ์ฑ
- WordPress๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ. ๋น๋ฐ๋ฒํธ ํด์๊ฐ์ ๊ณ์ฐํ ๋ ๊ธธ์ด๋ฅผ ์ ํํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ํด์ ์ฐ์ฐ ์ทจ์ฝ์ .
- ๊ธด ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ฌ CPU ์์ ์์ง
- WordPress๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ. ๋น๋ฐ๋ฒํธ ํด์๊ฐ์ ๊ณ์ฐํ ๋ ๊ธธ์ด๋ฅผ ์ ํํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ํด์ ์ฐ์ฐ ์ทจ์ฝ์ .
- ์ปจํ
์ด๋ 3 : Flask. ํ๋์ ์ค๋ ๋๊ฐ ์ฐ๊ฒฐ์ ์๋ฝํ๊ณ ์ฒ๋ฆฌ๋ฅผ ์ํด ํ์ ์ค๋ ๋๋ฅผ ์์ฑํ๋ multi-thread
- ๋น๋ฐ๋ฒํธ ๊ฐ๋ ์ธก์ ๊ธฐ์ธ
zxcvbn์ ์ฌ์ฉ. ์๊ณ ๋ฆฌ์ฆ ๋ณต์ก๋ ์ทจ์ฝ- ๋น๋ฐ๋ฒํธ ๊ฐ๋๋ฅผ ๊ณ์ฐํ ๋ ๋ชจํธํ ํน์ ๋ฌธ์๋ก ์ด๋ฃจ์ด์ง ๊ธด ๋น๋ฐ๋ฒํธ๋ฅผ ์ง์ด๋ฃ์ด ๋ง๋ํ CPU ์๊ฐ ์๋ชจ
- ๋น๋ฐ๋ฒํธ ๊ฐ๋ ์ธก์ ๊ธฐ์ธ
- ์ปจํ
์ด๋ 4: Tornado. thread pool์ ๊ตฌ์ถ
- XML ํ์ ์ฌ์ฉ. XML Bomb (Billion laughs)์ ์ทจ์ฝ
Overhead
- Baseline
- ํธ๋ํฝ ์์ฑ : Siege ๋๊ตฌ๋ฅผ ์ฌ์ฉ
- ์ฐ์๋ ์ฐ๊ฒฐ์ ๊ฐ๊ฒฉ์ 0.1์ด๋ก ๊ทนํ์ ์ํฉ๋ณด๋ค๋ ๋๋ฆฌ์ง๋ง ์ค์ ํ๊ฒฝ๋ณด๋ค๋ ์ผ๋ฐ์ ์ผ๋ก ๋น ๋ฆ
- ์ปจํ
์ด๋์ ๋ด๋ถ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ณธ์ผ๋ก ์ค์
- ์ปจํ ์ด๋๋ง๋ค 5ํ ์คํ ๋ฐ๋ณต. 180์ด ๋์ ์งํ
- ์ง์ฐ ์๊ฐ์ ์ค์๊ฐ์ ์ ํํ๊ณ 5๋ฒ์ ์ค์๊ฐ ํ๊ท ์ baseline์ผ๋ก ์ก์
-
๊ฒฐ๊ณผ

- 32๋ช
์ ๋์ง ์์ ๋๋ ๊ด์ฐฎ์์ง๋ง 64๋ช
์ด์์ผ๋ก ๊ฐ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ ํ ๋ฐ์
- CODA๋ก ์ธํ ์ฑ๋ฅ ์ ํ์ธ์ง ์ธ์ ์ด ๋ง์์ ๋ฐ์ํ๋ ์ฑ๋ฅ ์ ํ์ธ์ง ๊ตฌ๋ถ์ด ์๊ฐ
- ์ดํ ์คํ์์ 32๋ช ์ ์ฌ์ฉ์ ์ธ์ ์ ์ฌ์ฉ
- 32๋ช
์ ๋์ง ์์ ๋๋ ๊ด์ฐฎ์์ง๋ง 64๋ช
์ด์์ผ๋ก ๊ฐ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ ํ ๋ฐ์
- ํธ๋ํฝ ์์ฑ : Siege ๋๊ตฌ๋ฅผ ์ฌ์ฉ
-
CODA

- 0.7 ~5ms ์ ๋์ ์ง์ฐ์๊ฐ์ด ์ถ๊ฐ๋จ
- 1ms ์ ๋๋ ์ธ์งํ ์ ์์
- baseline์ ์ง์ฐ ์๊ฐ์ด ์งง์ ๊ฒฝ์ฐ๋ง ์ค๋ฒํค๋ ์ฆ๊ฐ ๋น์จ์ด ๋๊ฒ ๋์ด
- ๋ค๋ฅธ ์ฐ๊ตฌ์ ๋น๊ต : 1 ~ 7ms ์ง์ฐ ์๊ฐ์ถ๊ฐ
- ์คํ ์ค์ ๊ณผ ๋คํธ์ํฌ ํ๊ฒฝ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์๋ฐํ ๋น๊ต๋ ๋ถ๊ฐ
-
๊ณต๊ฒฉ ํ์ง์ ์ค๋ฒํค๋

- ๊ณต๊ฒฉ ํ์ง๋ก ์ธํ ์ง์ฐ ์๊ฐ์ ํฌ๊ฒ ์ฆ๊ฐํ์ง ์์๊ณ ๋์ฒด๋ก ์ปจํ ์ด๋ ๋ชจ๋ํฐ๋ง ๊ณผ์ ์์ ์ง์ฐ ์๊ฐ ๋ฐ์
- 0.7 ~5ms ์ ๋์ ์ง์ฐ์๊ฐ์ด ์ถ๊ฐ๋จ
Performance
- Setup
- ์คํ ์งํ
- 0 ~ 200์ด : ์ ์ ์์ฒญ๋ง ์ ์กํ์ฌ ๊ณต๊ฒฉ ํ์ง ๊ธฐ์ค ํ์ต
- 200 ~260์ด : ์ ์ + ์ ์ฑ ์์ฒญ
- 260 ~300์ด : ์ ์ ์์ฒญ
- QoS๋ฅผ ์ ํ์ํค๋ ์์ค์ผ๋ก ์กฐ์
- ์๊ณ๊ฐ k = 4, ์์์ a = 4๋ก ์ค์
- ํ์ง ์๋ ์ธก์ : ์ ์ฑ ์ฐ๊ฒฐ์ ์๋ช ๋๋น, ๊ณต๊ฒฉ์ด ํ์ง๋ ์์ ๋ถํฐ ํด๋น ์ฐ๊ฒฐ์ด ์ข ๋ฃ๋ ๋๊น์ง ๋จ์ ์๊ฐ์ ๋น์จ
- ์คํ ์งํ

- ์ปจํ
์ด๋ 1 : 32๊ฐ์ ์ฌ์ฉ์ ์ธ์
. ์ด๋น 2๊ฐ์ ์ฐ๊ฒฐ์ ์์ฑ. ๊ฐ ์ฐ๊ฒฐ์ 10๊ฐ์ ์ ์ ์์ฒญ์ ํฌํจํ์ฌ ์ด๋น 640๊ฐ์ ์์ฒญ์ ์์ฑ. ๊ทธ ์ค 16๊ฐ๊ฐ ์
์ฑ
- ๊ณต๊ฒฉ์ ๊ฐ๋๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์๋ฒ ๋ค์ด์ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ณต๊ฒฉ ๋น์จ์ ์ค์
- ์ปจํ ์ด๋ 2, 3, 4 : ์ด๋ค ํ๊ฒฝ์ด๋ ์ด๋ค ๊ณต๊ฒฉ์ด๋ ๋์ ํ์ง์จ๊ณผ ๋น ๋ฅธ ํ์ง ์๋๋ฅผ ๊ฐ์ง
Discussion
- ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์
๊ณ์ธต์์์ ํ์ฅ : ํ์ฌ๋ TCP ๊ธฐ๋ฐ์ HTTP(S) ๊ธฐ์ค
- UDP ๊ธฐ๋ฐ์
recvfrom๊ณผclose์์คํ ํธ์ถ์ด ์ง์ ์ ๊ณผ ์ข ๋ฃ์ ์ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉ - CPU๊ฐ ์๋ ๋ค๋ฅธ ์์์ผ๋ก ํ์ฅ
tcp_sent์ปค๋ ํจ์๋ฅผ ํตํด TCP ์ฐ๊ฒฐ์ ํตํด ์ ์ก๋ ๋ฐ์ดํธ ์์ ์์๋
- UDP ๊ธฐ๋ฐ์
- eBPF์์ kprobes์ ํ๊ณ
- ๋์์ ์ถ์ ํ ์ ์๋ ํธ์ถ ํ์์ ์ ํ์ด ์์
- ์ผ๋ถ ์ถ์ ์ ๋์น ์ ์์ง๋ง, ์ปค๋๊ณผ ๋๊ตฌ์ ๋ฐ์ ์ผ๋ก ๋์ ์ฐ๊ฒฐ 1000๊น์ง ํ ์คํธํด๋ดค์ง๋ง ๋๋ฝ์ด ์์์
- ์ด์์ฒด์ ์ ํ์ฅ
- ํ์ง ์ดํ์ ์๋๋ฆฌ์ค
์๊ฐ
๋จ์ผ ์ปจํ ์ด๋๊ฐ ๋จ์ผ ์๋น์ค๋ฅผ ์ ๊ณตํ์ง ์์ ๋ ๋ฌธ์ ?
๊ณต๊ฒฉ ์์ฒญ์ ๋จ์ผ ๋๋ ๋ค์์ ํด๋ผ์ด์ธํธ
์ ์ ๋ ๋๋ฌด ๊ธด ์๊ฐ์ด ๋ค์ด์จ๋ค๋ฉด??? โ ์ ์ฒ๋ฆฌ ํด์ผ ํ๋
Leave a comment