์–ด๋ฆฐ ์•„์ด๋“ค์„ ์œ„ํ•œ BPF, ํŒŒํŠธ XNUMX: ํด๋ž˜์‹ BPF

BPF(Berkeley Packet Filters)๋Š” ๋ช‡ ๋…„ ๋™์•ˆ ์˜์–ด ๊ธฐ์ˆ  ๊ฐ„ํ–‰๋ฌผ์˜ ์ฒซ ํŽ˜์ด์ง€์— ๋“ฑ์žฅํ•œ Linux ์ปค๋„ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ปจํผ๋Ÿฐ์Šค๋Š” BPF์˜ ์‚ฌ์šฉ ๋ฐ ๊ฐœ๋ฐœ์— ๋Œ€ํ•œ ๋ณด๊ณ ์„œ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์Šต๋‹ˆ๋‹ค. Linux ๋„คํŠธ์›Œํฌ ํ•˜์œ„ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž์ธ David Miller๊ฐ€ Linux Plumbers 2018์—์„œ ์—ฐ์„คํ•ฉ๋‹ˆ๋‹ค. โ€œ์ด ์ด์•ผ๊ธฐ๋Š” XDP์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.โ€ (XDP๋Š” BPF์˜ ํ•œ ๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.) ๋ธŒ๋ Œ๋˜ ๊ทธ๋ ˆ๊ทธ(Brendan Gregg)๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ œ๋ชฉ์œผ๋กœ ๊ฐ•์—ฐ์„ ํ•ฉ๋‹ˆ๋‹ค. Linux BPF ์ดˆ๋Šฅ๋ ฅ. ํ† ์ผ€ ํ˜ธ์ผ๋ž€๋“œ-์š”๋ฅด๊ฒ์„ผ ์›ƒ์Œ์ปค๋„์€ ์ด์ œ ๋งˆ์ดํฌ๋กœ์ปค๋„์ž…๋‹ˆ๋‹ค. Thomas Graf๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•„์ด๋””์–ด๋ฅผ ์žฅ๋ คํ•ฉ๋‹ˆ๋‹ค. BPF๋Š” ์ปค๋„์šฉ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค..

Habrรฉ์—๋Š” BPF์— ๋Œ€ํ•œ ์ฒด๊ณ„์ ์ธ ์„ค๋ช…์ด ์•„์ง ์—†์œผ๋ฏ€๋กœ ์ผ๋ จ์˜ ๊ธฐ์‚ฌ์—์„œ ๊ธฐ์ˆ ์˜ ์—ญ์‚ฌ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ฐœ๋ฐœ ๋„๊ตฌ๋ฅผ ์„ค๋ช…ํ•˜๋ฉฐ BPF ์‚ฌ์šฉ์˜ ์ ์šฉ ๋ฐ ์‹คํ–‰ ์˜์—ญ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋ฆฌ์ฆˆ์˜ ์ œ๋กœ ๊ธฐ์‚ฌ์—์„œ๋Š” ํด๋ž˜์‹ BPF์˜ ์—ญ์‚ฌ์™€ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์ž‘๋™ ์›๋ฆฌ์˜ ๋น„๋ฐ€๋„ ๊ณต๊ฐœํ•ฉ๋‹ˆ๋‹ค. tcpdump, seccomp, strace, ๊ทธ๋ฆฌ๊ณ  ํ›จ์”ฌ ๋”.

BPF์˜ ๊ฐœ๋ฐœ์€ Linux ๋„คํŠธ์›Œํ‚น ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์˜ํ•ด ์ œ์–ด๋˜๋ฉฐ, BPF์˜ ์ฃผ์š” ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋„คํŠธ์›Œํฌ์™€ ๊ด€๋ จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํ—ˆ๊ฐ€๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. @eucariot, ๋‚˜๋Š” ์œ„๋Œ€ํ•œ ์‹œ๋ฆฌ์ฆˆ๋ฅผ ๊ธฐ๋ฆฌ๊ธฐ ์œ„ํ•ด ์ด ์‹œ๋ฆฌ์ฆˆ๋ฅผ "์–ด๋ฆฐ์ด๋ฅผ ์œ„ํ•œ BPF"๋ผ๊ณ  ๋ถˆ๋ €์Šต๋‹ˆ๋‹ค. "์–ด๋ฆฐ์•„์ด๋“ค์„ ์œ„ํ•œ ๋„คํŠธ์›Œํฌ".

BPF ์—ญ์‚ฌ์— ๋Œ€ํ•œ ๋‹จ๊ธฐ ๊ฐ•์ขŒ(c)

์ตœ์‹  BPF ๊ธฐ์ˆ ์€ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๊ธฐ์กด ๊ธฐ์ˆ ์„ ๊ฐœ์„ ํ•˜๊ณ  ํ™•์žฅํ•œ ๋ฒ„์ „์œผ๋กœ, ํ˜„์žฌ๋Š” ํ˜ผ๋™์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์‹ BPF๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ž˜ ์•Œ๋ ค์ง„ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ํด๋ž˜์‹ BPF๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. tcpdump, ๋ฉ”์ปค๋‹ˆ์ฆ˜ seccomp, ๋œ ์•Œ๋ ค์ง„ ๋ชจ๋“ˆ xt_bpf ์— iptables ๋ฐ ๋ถ„๋ฅ˜๊ธฐ cls_bpf. ์ตœ์‹  Linux์—์„œ๋Š” ํด๋ž˜์‹ BPF ํ”„๋กœ๊ทธ๋žจ์ด ์ž๋™์œผ๋กœ ์ƒˆ๋กœ์šด ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜๋˜์ง€๋งŒ ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ ๋ณผ ๋•Œ API๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜์—ˆ์œผ๋ฉฐ ์ด ๊ธฐ์‚ฌ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ํด๋ž˜์‹ BPF์˜ ์ƒˆ๋กœ์šด ์šฉ๋„๊ฐ€ ์—ฌ์ „ํžˆ ๋ฐœ๊ฒฌ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ, ๊ทธ๋ฆฌ๊ณ  Linux์—์„œ ํด๋ž˜์‹ BPF ๊ฐœ๋ฐœ์˜ ์—ญ์‚ฌ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉด ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ทธ๋ฆฌ๊ณ  ์™œ ํ˜„๋Œ€์ ์ธ ํ˜•ํƒœ๋กœ ์ง„ํ™”ํ–ˆ๋Š”์ง€๊ฐ€ ๋” ๋ช…ํ™•ํ•ด์งˆ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ํด๋ž˜์‹ BPF์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€๋‚œ ์„ธ๊ธฐ XNUMX๋…„๋Œ€ ๋ง, ์œ ๋ช…ํ•œ ๋กœ๋ Œ์Šค ๋ฒ„ํด๋ฆฌ ์—ฐ๊ตฌ์†Œ(Lawrence Berkeley Laboratory)์˜ ์—”์ง€๋‹ˆ์–ด๋“ค์€ ์ง€๋‚œ ์„ธ๊ธฐ XNUMX๋…„๋Œ€ ํ›„๋ฐ˜์— ํ˜„๋Œ€ํ™”๋œ ํ•˜๋“œ์›จ์–ด์—์„œ ๋„คํŠธ์›Œํฌ ํŒจํ‚ท์„ ์ ์ ˆํ•˜๊ฒŒ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๊ด€์‹ฌ์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ CSPF(CMU/Stanford Packet Filter) ๊ธฐ์ˆ ๋กœ ๊ตฌํ˜„๋œ ํ•„ํ„ฐ๋ง์˜ ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋Š” ๋ถˆํ•„์š”ํ•œ ํŒจํ‚ท์„ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ปค๋„ ๊ณต๊ฐ„์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์— ๋ณต์‚ฌ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ปค๋„ ๊ณต๊ฐ„์—์„œ ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋Ÿฐํƒ€์ž„ ๋ณด์•ˆ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ƒŒ๋“œ๋ฐ•์Šค ๊ฐ€์ƒ ๋จธ์‹ ์ด ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ์กด ํ•„ํ„ฐ์˜ ๊ฐ€์ƒ ๋จธ์‹ ์€ ์Šคํƒ ๊ธฐ๋ฐ˜ ๋จธ์‹ ์—์„œ ์‹คํ–‰๋˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ ์ตœ์‹  RISC ๋จธ์‹ ์—์„œ๋Š” ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ Berkeley Labs์˜ ์—”์ง€๋‹ˆ์–ด๋“ค์˜ ๋…ธ๋ ฅ์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด BPF(Berkeley Packet Filters) ๊ธฐ์ˆ ์ด ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ, ๊ทธ ๊ฐ€์ƒ ๋จธ์‹  ์•„ํ‚คํ…์ฒ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž˜ ์•Œ๋ ค์ง„ ์ œํ’ˆ์˜ ์ฃผ๋ ฅ ์ œํ’ˆ์ธ Motorola 6502 ํ”„๋กœ์„ธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ II ๋˜๋Š” NES. ์ƒˆ๋กœ์šด ๊ฐ€์ƒ ๋จธ์‹ ์€ ๊ธฐ์กด ์†”๋ฃจ์…˜์— ๋น„ํ•ด ํ•„ํ„ฐ ์„ฑ๋Šฅ์„ ์ˆ˜์‹ญ ๋ฐฐ ํ–ฅ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

BPF ๋จธ์‹  ์•„ํ‚คํ…์ฒ˜

์‚ฌ๋ก€๋ฅผ ๋ถ„์„ํ•˜๋ฉด์„œ ์‹ค์ œ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•ด ์•Œ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ์„  ๋จธ์‹ ์— ์‚ฌ์šฉ์ž๊ฐ€ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐœ์˜ 32๋น„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ, ์ฆ‰ ๋ˆ„์‚ฐ๊ธฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. A ๋ฐ ์ธ๋ฑ์Šค ๋ ˆ์ง€์Šคํ„ฐ X, ์“ฐ๊ธฐ ๋ฐ ํ›„์† ์ฝ๊ธฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” 64๋ฐ”์ดํŠธ ๋ฉ”๋ชจ๋ฆฌ(16์›Œ๋“œ) ๋ฐ ์ด๋Ÿฌํ•œ ๊ฐœ์ฒด ์ž‘์—…์„ ์œ„ํ•œ ์ž‘์€ ๋ช…๋ น ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์กฐ๊ฑด์‹์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ ํ”„ ๋ช…๋ น๋„ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ํ”„๋กœ๊ทธ๋žจ์˜ ์ ์‹œ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์•ž์œผ๋กœ๋งŒ ์ ํ”„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํŠนํžˆ ๋ฃจํ”„๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ธˆ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๊ณ„๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ณ„ํš์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” BPF ์•„ํ‚คํ…์ฒ˜์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ์ปค๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜(์˜ˆ: ์‹œ์Šคํ…œ ํ˜ธ์ถœ)์€ ํ”„๋กœ๊ทธ๋žจ์„ ๋กœ๋“œํ•˜๊ณ  ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์ปค๋„์˜ ์ด๋ฒคํŠธ ์ƒ์„ฑ๊ธฐ(์˜ˆ: ์ด๋ฒคํŠธ๋Š” ๋„คํŠธ์›Œํฌ ์นด๋“œ์— ๋‹ค์Œ ํŒจํ‚ท์ด ๋„์ฐฉํ•˜๋Š” ๊ฒƒ)์ž…๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ปค๋„์€ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ณ (์˜ˆ: ์ธํ„ฐํ”„๋ฆฌํ„ฐ์—์„œ) ๋จธ์‹  ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ(์˜ˆ: ์ˆ˜์‹  ํŒจํ‚ท์˜ ๋ฐ์ดํ„ฐ)

์œ„์˜ ๋‚ด์šฉ์œผ๋กœ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ์‹œ์Šคํ…œ ๋ฐ ๋ช…๋ น ํ˜•์‹์— ๋Œ€ํ•ด ์•Œ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ƒ ๋จธ์‹ ์˜ ๋ช…๋ น ์‹œ์Šคํ…œ์„ ์ฆ‰์‹œ ์—ฐ๊ตฌํ•˜๊ณ  ๋ชจ๋“  ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด ์›๋ณธ ๊ธฐ์‚ฌ๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค. BSD ํŒจํ‚ท ํ•„ํ„ฐ ๋ฐ/๋˜๋Š” ํŒŒ์ผ์˜ ์ „๋ฐ˜๋ถ€ ๋ฌธ์„œ/๋„คํŠธ์›Œํ‚น/filter.txt ์ปค๋„ ๋ฌธ์„œ์—์„œ. ๋˜ํ•œ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ ๊ณต๋ถ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. libpcap: ํŒจํ‚ท ์บก์ฒ˜๋ฅผ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•๋ก , BPF์˜ ์ €์ž ์ค‘ ํ•œ ๋ช…์ธ McCanne์ด ์ฐฝ์กฐ์˜ ์—ญ์‚ฌ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. libpcap.

Linux์—์„œ ํด๋ž˜์‹ BPF๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์ค‘์š”ํ•œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. tcpdump (libpcap), ์ดˆ์ปด, xt_bpf, cls_bpf.

TCP ๋คํ”„

BPF ๊ฐœ๋ฐœ์€ ์ž˜ ์•Œ๋ ค์ง„ ์œ ํ‹ธ๋ฆฌํ‹ฐ์ธ ํŒจํ‚ท ํ•„ํ„ฐ๋ง์„ ์œ„ํ•œ ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ๊ณผ ๋ณ‘ํ–‰ํ•˜์—ฌ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. tcpdump. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋งŽ์€ ์šด์˜ ์ฒด์ œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์‹ BPF๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ์˜ค๋ž˜๋˜๊ณ  ์œ ๋ช…ํ•œ ์˜ˆ์ด๋ฏ€๋กœ ์ด ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ์—ฐ๊ตฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

(์ €๋Š” ์ด ๊ธ€์˜ ๋ชจ๋“  ์˜ˆ์ œ๋ฅผ Linux์—์„œ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. 5.6.0-rc6. ๋” ๋‚˜์€ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ์ผ๋ถ€ ๋ช…๋ น์˜ ์ถœ๋ ฅ์ด ํŽธ์ง‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)

์˜ˆ: IPv6 ํŒจํ‚ท ๊ด€์ฐฐ

์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ๋“  IPv6 ํŒจํ‚ท์„ ๋ณด๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. eth0. ์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค tcpdump ๊ฐ„๋‹จํ•œ ํ•„ํ„ฐ๋กœ ip6:

$ sudo tcpdump -i eth0 ip6

์ด ๊ฒฝ์šฐ, tcpdump ํ•„ํ„ฐ๋ฅผ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค ip6 BPF ์•„ํ‚คํ…์ฒ˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ปค๋„๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค(์ž์„ธํ•œ ๋‚ด์šฉ์€ ์„น์…˜ ์ฐธ์กฐ). Tcpdump: ๋กœ๋“œ ์ค‘). ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๋ชจ๋“  ํŒจํ‚ท์— ๋Œ€ํ•ด ๋กœ๋“œ๋œ ํ•„ํ„ฐ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. eth0. ํ•„ํ„ฐ๊ฐ€ XNUMX์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ n, ๊ทธ ๋‹ค์Œ์—๋Š” ์ตœ๋Œ€ n ํŒจํ‚ท์˜ ๋ฐ”์ดํŠธ๊ฐ€ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์— ๋ณต์‚ฌ๋˜๊ณ  ์ถœ๋ ฅ์—์„œ โ€‹โ€‹๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. tcpdump.

์–ด๋ฆฐ ์•„์ด๋“ค์„ ์œ„ํ•œ BPF, ํŒŒํŠธ XNUMX: ํด๋ž˜์‹ BPF

์–ด๋–ค ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ์ปค๋„๋กœ ์ „์†ก๋˜์—ˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. tcpdump ์˜ ๋„์›€์œผ๋กœ tcpdump, ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•˜๋ฉด -d:

$ sudo tcpdump -i eth0 -d ip6
(000) ldh      [12]
(001) jeq      #0x86dd          jt 2    jf 3
(002) ret      #262144
(003) ret      #0

XNUMX๋ฒˆ์งธ ์ค„์—์„œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ldh [12], ์ด๋Š” "๋ ˆ์ง€์Šคํ„ฐ์— ๋กœ๋“œ"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. A ์ฃผ์†Œ 16โ€์— ๋ฐ˜ ๋‹จ์–ด(12๋น„ํŠธ)๊ฐ€ ์žˆ๊ณ  ์œ ์ผํ•œ ์งˆ๋ฌธ์€ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋Œ€๋‹ต์€ ์— ์žˆ์Šต๋‹ˆ๋‹ค. x ์‹œ์ž‘ํ•˜๋‹ค (x+1)๋ถ„์„๋œ ๋„คํŠธ์›Œํฌ ํŒจํ‚ท์˜ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค. ์ด๋”๋„ท ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ํŒจํ‚ท์„ ์ฝ์Šต๋‹ˆ๋‹ค. eth0๊ทธ๋ฆฌ๊ณ ์ด ๋ฐฉ๋ฒ•ํŒจํ‚ท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(๋‹จ์ˆœํ™”๋ฅผ ์œ„ํ•ด ํŒจํ‚ท์— VLAN ํƒœ๊ทธ๊ฐ€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค).

       6              6          2
|Destination MAC|Source MAC|Ether Type|...|

๊ทธ๋ž˜์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ํ›„ ldh [12] ๊ธฐ๋ก๋ถ€์— A ๋“คํŒ์ด ์žˆ์„ ๊ฑฐ์•ผ Ether Type โ€” ์ด ์ด๋”๋„ท ํ”„๋ ˆ์ž„์—์„œ ์ „์†ก๋œ ํŒจํ‚ท ์œ ํ˜•. 1๋ฒˆ์งธ ์ค„์—์„œ๋Š” ๋ ˆ์ง€์Šคํ„ฐ์˜ ๋‚ด์šฉ์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. A (ํŒจํ‚ค์ง€ํ˜•) ๋‹ค 0x86dd๊ทธ๋ฆฌ๊ณ ์ด ๊ฑฐ๊ธฐ์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ์œ ํ˜•์€ IPv6์ž…๋‹ˆ๋‹ค. 1ํ–‰์—๋Š” ๋น„๊ต ๋ช…๋ น ์™ธ์—๋„ ๋‘ ๊ฐœ์˜ ์—ด์ด ๋” ์žˆ์Šต๋‹ˆ๋‹ค. jt 2 ะธ jf 3 โ€” ๋น„๊ต๊ฐ€ ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ ์ด๋™ํ•ด์•ผ ํ•  ํ‘œ์‹œ(A == 0x86dd) ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„ฑ๊ณต์ ์ธ ๊ฒฝ์šฐ(IPv6)์—์„œ๋Š” 2ํ–‰์œผ๋กœ ์ด๋™ํ•˜๊ณ , ์‹คํŒจํ•œ ๊ฒฝ์šฐ์—๋Š” 3ํ–‰์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. 3ํ–‰์—์„œ ํ”„๋กœ๊ทธ๋žจ์€ ์ฝ”๋“œ 0(ํŒจํ‚ท ๋ณต์‚ฌ ์•ˆ ํ•จ)์œผ๋กœ ์ข…๋ฃŒ๋˜๊ณ , 2ํ–‰์—์„œ ํ”„๋กœ๊ทธ๋žจ์€ ์ฝ”๋“œ๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. 262144(์ตœ๋Œ€ 256KB ํŒจํ‚ค์ง€๋ฅผ ๋ณต์‚ฌํ•˜์„ธ์š”).

๋” ๋ณต์žกํ•œ ์˜ˆ: ๋Œ€์ƒ ํฌํŠธ๋ณ„๋กœ TCP ํŒจํ‚ท์„ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

๋Œ€์ƒ ํฌํŠธ 666์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  TCP ํŒจํ‚ท์„ ๋ณต์‚ฌํ•˜๋Š” ํ•„ํ„ฐ์˜ ๋ชจ์–‘์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. IPv4 ์‚ฌ๋ก€๊ฐ€ ๋” ๊ฐ„๋‹จํ•˜๋ฏ€๋กœ IPv6 ์‚ฌ๋ก€๋ฅผ ๊ณ ๋ คํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ๋ฅผ ์—ฐ๊ตฌํ•œ ํ›„ ์—ฐ์Šต์œผ๋กœ IPv6 ํ•„ํ„ฐ๋ฅผ ์ง์ ‘ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ip6 and tcp dst port 666) ๋ฐ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ํ•„ํ„ฐ(tcp dst port 666). ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ํ•„ํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ sudo tcpdump -i eth0 -d ip and tcp dst port 666
(000) ldh      [12]
(001) jeq      #0x800           jt 2    jf 10
(002) ldb      [23]
(003) jeq      #0x6             jt 4    jf 10
(004) ldh      [20]
(005) jset     #0x1fff          jt 10   jf 6
(006) ldxb     4*([14]&0xf)
(007) ldh      [x + 16]
(008) jeq      #0x29a           jt 9    jf 10
(009) ret      #262144
(010) ret      #0

์šฐ๋ฆฌ๋Š” 0ํ–‰๊ณผ 1ํ–‰์ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 2๋ฒˆ์งธ ์ค„์—์„œ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด IPv4 ํŒจํ‚ท์ธ์ง€๋ฅผ ์ด๋ฏธ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค(Ether Type = 0x800) ๋ ˆ์ง€์Šคํ„ฐ์— ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. A ํŒจํ‚ท์˜ 24๋ฒˆ์งธ ๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํŒจํ‚ค์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

       14            8      1     1
|ethernet header|ip fields|ttl|protocol|...|

์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ ˆ์ง€์Šคํ„ฐ์— ๋กœ๋“œํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. A IP ํ—ค๋”์˜ ํ”„๋กœํ† ์ฝœ ํ•„๋“œ๋Š” ๋…ผ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. TCP ํŒจํ‚ท๋งŒ ๋ณต์‚ฌํ•˜๋ ค๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ”„๋กœํ† ์ฝœ์„ ๋‹ค์Œ๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. 0x6 (IPPROTO_TCP) 3ํ–‰์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์ธ 4์™€ 5์—์„œ๋Š” ์ฃผ์†Œ 20์— ์žˆ๋Š” ํ•˜ํ”„์›Œ๋“œ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. jset ์„ธ ๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๊นƒ๋ฐœ - ์ง€๊ธ‰๋œ ๋งˆ์Šคํฌ๋ฅผ ์ฐฉ์šฉ jset ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์„ธ ๋น„ํŠธ๊ฐ€ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. XNUMX๊ฐœ์˜ ๋น„ํŠธ ์ค‘ XNUMX๊ฐœ๋Š” ํŒจํ‚ท์ด ์กฐ๊ฐํ™”๋œ IP ํŒจํ‚ท์˜ ์ผ๋ถ€์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ฃผ๊ณ , ๊ทธ๋ ‡๋‹ค๋ฉด ๋งˆ์ง€๋ง‰ ์กฐ๊ฐ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ๋น„ํŠธ๋Š” ์˜ˆ์•ฝ๋˜์–ด ์žˆ์œผ๋ฉฐ XNUMX์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆ์™„์ „ํ•˜๊ฑฐ๋‚˜ ์†์ƒ๋œ ํŒจํ‚ท์„ ํ™•์ธํ•˜๊ณ  ์‹ถ์ง€ ์•Š์œผ๋ฏ€๋กœ ์„ธ ๋น„ํŠธ๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชฉ๋ก์—์„œ ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๊ฒƒ์€ 6๋ฒˆ์งธ ์ค„์ž…๋‹ˆ๋‹ค. ํ‘œํ˜„ ldxb 4*([14]&0xf) ๋ ˆ์ง€์Šคํ„ฐ์— ๋กœ๋“œํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. X ํŒจํ‚ท์˜ 4๋ฒˆ์งธ ๋ฐ”์ดํŠธ์˜ ์ตœํ•˜์œ„ XNUMX๋น„ํŠธ์— XNUMX๋ฅผ ๊ณฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. XNUMX๋ฒˆ์งธ ๋ฐ”์ดํŠธ์˜ ์ตœํ•˜์œ„ XNUMX๋น„ํŠธ๋Š” ํ•„๋“œ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท ํ—ค๋” ๊ธธ์ด ํ—ค๋”์˜ ๊ธธ์ด๋ฅผ ๋‹จ์–ด๋กœ ์ €์žฅํ•˜๋Š” IPv4 ํ—ค๋”์ด๋ฏ€๋กœ 4๋ฅผ ๊ณฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ํ‘œํ˜„์‹์€ 4*([14]&0xf) ์ด ํ˜•์‹๊ณผ ๋ ˆ์ง€์Šคํ„ฐ์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ ์ฃผ์†Œ ์ง€์ • ์ฒด๊ณ„์— ๋Œ€ํ•œ ์ง€์ •์ž…๋‹ˆ๋‹ค. X, ์ฆ‰. ์šฐ๋ฆฌ๋„ ๋งํ•  ์ˆ˜ ์—†์–ด ldb 4*([14]&0xf) ๋„ ldxb 5*([14]&0xf) (๋‹ค๋ฅธ ์˜คํ”„์…‹๋งŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ldxb 4*([16]&0xf)). ์ด ์ฃผ์†Œ ์ง€์ • ๋ฐฉ์‹์ด BPF์— ์ •ํ™•ํ•˜๊ฒŒ ์ถ”๊ฐ€๋œ ๊ฒƒ์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. X (์ธ๋ฑ์Šค ๋ ˆ์ง€์Šคํ„ฐ) IPv4 ํ—ค๋” ๊ธธ์ด์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ 7๋ฒˆ์งธ ์ค„์—์„œ ์šฐ๋ฆฌ๋Š” ๋‹จ์–ด์˜ ์ ˆ๋ฐ˜์„ ๋กœ๋“œํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. (X+16). ์ด๋”๋„ท ํ—ค๋”๊ฐ€ 14๋ฐ”์ดํŠธ๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜๊ณ , X IPv4 ํ—ค๋”์˜ ๊ธธ์ด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ A TCP ๋Œ€์ƒ ํฌํŠธ๊ฐ€ ๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

       14           X           2             2
|ethernet header|ip header|source port|destination port|

๋งˆ์ง€๋ง‰์œผ๋กœ 8ํ–‰์—์„œ๋Š” ๋Œ€์ƒ ํฌํŠธ๋ฅผ ์›ํ•˜๋Š” ๊ฐ’๊ณผ ๋น„๊ตํ•˜๊ณ  9ํ–‰ ๋˜๋Š” 10ํ–‰์—์„œ๋Š” ํŒจํ‚ท์„ ๋ณต์‚ฌํ• ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Tcpdump: ๋กœ๋“œ ์ค‘

์ด์ „ ์˜ˆ์ œ์—์„œ๋Š” ํŒจํ‚ท ํ•„ํ„ฐ๋ง์„ ์œ„ํ•ด BPF ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ปค๋„์— ์ •ํ™•ํžˆ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋งํ•˜๋ฉด, tcpdump ๋งŽ์€ ์‹œ์Šคํ…œ์œผ๋กœ ํฌํŒ…๋˜์—ˆ์œผ๋ฉฐ ํ•„ํ„ฐ ์ž‘์—…์„ ์œ„ํ•ด tcpdump ๋„์„œ๊ด€์„ ์ด์šฉํ•œ๋‹ค libpcap. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค์— ํ•„ํ„ฐ๋ฅผ ๋ฐฐ์น˜ํ•˜๋ ค๋ฉด libpcap, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์œ ํ˜• ์„ค๋ช…์ž ๋งŒ๋“ค๊ธฐ pcap_t ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์—์„œ: pcap_create,
  • ์ธํ„ฐํŽ˜์ด์Šค ํ™œ์„ฑํ™”: pcap_activate,
  • ์ปดํŒŒ์ผ ํ•„ํ„ฐ: pcap_compile,
  • ์—ฐ๊ฒฐ ํ•„ํ„ฐ: pcap_setfilter.

๊ธฐ๋Šฅ์ด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋ณด๋ ค๋ฉด pcap_setfilter Linux์—์„œ ๊ตฌํ˜„๋œ ๊ฒฝ์šฐ strace (์ผ๋ถ€ ์ค„์ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค):

$ sudo strace -f -e trace=%network tcpdump -p -i eth0 ip
socket(AF_PACKET, SOCK_RAW, 768)        = 3
bind(3, {sa_family=AF_PACKET, sll_protocol=htons(ETH_P_ALL), sll_ifindex=if_nametoindex("eth0"), sll_hatype=ARPHRD_NETROM, sll_pkttype=PACKET_HOST, sll_halen=0}, 20) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=4, filter=0xb00bb00bb00b}, 16) = 0
...

์ถœ๋ ฅ์˜ ์ฒ˜์Œ ๋‘ ์ค„์—์„œ ์šฐ๋ฆฌ๋Š” ์›์‹œ ์†Œ์ผ“ ๋ชจ๋“  ์ด๋”๋„ท ํ”„๋ ˆ์ž„์„ ์ฝ๊ณ  ์ด๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. eth0. ๋ถ€ํ„ฐ ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ์˜ˆ ์šฐ๋ฆฌ๋Š” ํ•„ํ„ฐ๊ฐ€ ip XNUMX๊ฐœ์˜ BPF ๋ช…๋ น์–ด๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ์„ธ ๋ฒˆ์งธ ์ค„์—์„œ๋Š” ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. SO_ATTACH_FILTER ์‹œ์Šคํ…œ ํ˜ธ์ถœ setsockopt ๊ธธ์ด๊ฐ€ 4์ธ ํ•„ํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ•„ํ„ฐ์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์‹ BPF์—์„œ๋Š” ํ•„ํ„ฐ ๋กœ๋“œ ๋ฐ ์—ฐ๊ฒฐ์ด ํ•ญ์ƒ ์›์ž์„ฑ ์ž‘์—…์œผ๋กœ ๋ฐœ์ƒํ•˜์ง€๋งŒ ์ƒˆ ๋ฒ„์ „์˜ BPF์—์„œ๋Š” ํ”„๋กœ๊ทธ๋žจ ๋กœ๋“œ ๋ฐ ์ด๋ฒคํŠธ ์ƒ์„ฑ๊ธฐ์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” ์ž‘์—…์ด ์‹œ๊ฐ„์ ์œผ๋กœ ๋ถ„๋ฆฌ๋œ๋‹ค๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆจ๊ฒจ์ง„ ์ง„์‹ค

์•ฝ๊ฐ„ ๋” ์™„์ „ํ•œ ๋ฒ„์ „์˜ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ sudo strace -f -e trace=%network tcpdump -p -i eth0 ip
socket(AF_PACKET, SOCK_RAW, 768)        = 3
bind(3, {sa_family=AF_PACKET, sll_protocol=htons(ETH_P_ALL), sll_ifindex=if_nametoindex("eth0"), sll_hatype=ARPHRD_NETROM, sll_pkttype=PACKET_HOST, sll_halen=0}, 20) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=1, filter=0xbeefbeefbeef}, 16) = 0
recvfrom(3, 0x7ffcad394257, 1, MSG_TRUNC, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=4, filter=0xb00bb00bb00b}, 16) = 0
...

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํ•„ํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๊ณ  5๋ฒˆ ๋ผ์ธ์˜ ์†Œ์ผ“์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 3๋ฒˆ ๋ผ์ธ๊ณผ 4๋ฒˆ ๋ผ์ธ์—์„œ๋Š” ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค libpcap ์šฐ๋ฆฌ๋ฅผ ๋Œ๋ด…๋‹ˆ๋‹ค. ํ•„ํ„ฐ์˜ ์ถœ๋ ฅ์— ํ•„ํ„ฐ๋ฅผ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ํŒจํ‚ท์ด ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—ฐ๊ฒฐํ•˜๋‹ค ๋”๋ฏธ ํ•„ํ„ฐ ret #0 (๋ชจ๋“  ํŒจํ‚ท ์‚ญ์ œ) ์†Œ์ผ“์„ ๋น„์ฐจ๋‹จ ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•˜๊ณ  ์ด์ „ ํ•„ํ„ฐ์—์„œ ๋‚จ์•„ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํŒจํ‚ท์„ ๋นผ๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด์ ์œผ๋กœ ํด๋ž˜์‹ BPF๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Linux์—์„œ ํŒจํ‚ค์ง€๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ ํ˜•ํƒœ์˜ ํ•„ํ„ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. struct sock_fprog ๊ฐœ๋ฐฉํ˜• ์†Œ์ผ“, ๊ทธ ํ›„ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„ํ„ฐ๋ฅผ ์†Œ์ผ“์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. setsockopt.

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ํ•„ํ„ฐ๋Š” ์›์‹œ ์†Œ์ผ“๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์†Œ์ผ“์— ๋ถ€์ฐฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์˜ˆ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  UDP ๋ฐ์ดํ„ฐ๊ทธ๋žจ์—์„œ ์ฒ˜์Œ XNUMX๋ฐ”์ดํŠธ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋‘ ์ฐจ๋‹จํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. (๊ธ€์ด ๋ณต์žกํ•ด์ง€์ง€ ์•Š๋„๋ก ์ฝ”๋“œ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.)

์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ setsockopt ํ•„ํ„ฐ ์—ฐ๊ฒฐ์— ๋Œ€ํ•ด์„œ๋Š” ์ฐธ์กฐ ์†Œ์ผ“(7), ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž์‹ ๋งŒ์˜ ํ•„ํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” struct sock_fprog ๋„์›€์—†์ด tcpdump ์šฐ๋ฆฌ๋Š” ์„น์…˜์—์„œ ์ด์•ผ๊ธฐ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ์šฐ๋ฆฌ ์†์œผ๋กœ BPF ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ธฐ.

ํด๋ž˜์‹ BPF์™€ XNUMX์„ธ๊ธฐ

BPF๋Š” 1997๋…„ Linux์— ํฌํ•จ๋˜์—ˆ์œผ๋ฉฐ ์˜ค๋žซ๋™์•ˆ ์ฃผ๋ ฅ์œผ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. libpcap ํŠน๋ณ„ํ•œ ๋ณ€๊ฒฝ ์—†์ด(Linux ๊ด€๋ จ ๋ณ€๊ฒฝ์€ ๋ฌผ๋ก , ํ–ˆ๋‹ค, ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ ๊ธ€๋กœ๋ฒŒ ๊ทธ๋ฆผ์„ ๋ฐ”๊พธ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค). BPF๊ฐ€ ์ง„ํ™”ํ•  ๊ฒƒ์ด๋ผ๋Š” ์ฒซ ๋ฒˆ์งธ ์‹ฌ๊ฐํ•œ ์ง•ํ›„๋Š” Eric Dumazet์ด ์ œ์•ˆํ•œ 2011๋…„์— ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ํŒจ์น˜, ์ปค๋„์— Just In Time Compiler๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. BPF ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ณ€ํ™˜๊ธฐ์ž…๋‹ˆ๋‹ค. x86_64 ์•”ํ˜ธ.

JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” 2012๋…„์— ์ผ๋ จ์˜ ๋ณ€ํ™” ์ค‘ ์ฒซ ๋ฒˆ์งธ์˜€์Šต๋‹ˆ๋‹ค. ์ถœ์—ฐ ํ•œ ํ•„ํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ ์ดˆ์ปด, BPF๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 2013๋…„ XNUMX์›”์— ์ถ”๊ฐ€ ๋ชจ๋“ˆ xt_bpf, ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์Œ์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. iptables BPF์˜ ๋„์›€์œผ๋กœ 2013๋…„ XNUMX์›”์— ์ถ”๊ฐ€ ๋˜ํ•œ ๋ชจ๋“ˆ cls_bpf, BPF๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ ๋ถ„๋ฅ˜์ž๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ์˜ˆ์ œ๋ฅผ ๊ณง ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์ง€๋งŒ ๋จผ์ € BPF์šฉ ์ž„์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ณ  ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. libpcap ์ œํ•œ์ (๊ฐ„๋‹จํ•œ ์˜ˆ: ํ•„ํ„ฐ ์ƒ์„ฑ๋จ) libpcap 0 ๋˜๋Š” 0x40000์˜ ๋‘ ๊ฐ€์ง€ ๊ฐ’๋งŒ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Œ) ๋˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ seccomp์˜ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ์ ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ์†์œผ๋กœ BPF ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ธฐ

BPF ๋ช…๋ น์–ด์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค. ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

   16    8    8     32
| code | jt | jf |  k  |

๊ฐ ๋ช…๋ น์–ด๋Š” 64๋น„ํŠธ๋ฅผ ์ฐจ์ง€ํ•˜๋ฉฐ ์ฒ˜์Œ 16๋น„ํŠธ๋Š” ๋ช…๋ น์–ด ์ฝ”๋“œ์ด๊ณ  ๊ทธ ๋‹ค์Œ์—๋Š” XNUMX๋น„ํŠธ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ XNUMX๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค. jt ะธ jf๋ฐ ์ธ์ˆ˜์˜ ๊ฒฝ์šฐ 32๋น„ํŠธ K, ๊ทธ ๋ชฉ์ ์€ ๋ช…๋ น๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋ช…๋ น์€ ret, ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•˜๋Š” ์ฝ”๋“œ์—๋Š” 6, ๋ฐ˜ํ™˜ ๊ฐ’์€ ์ƒ์ˆ˜์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. K. C์—์„œ๋Š” ๋‹จ์ผ BPF ๋ช…๋ น์–ด๊ฐ€ ๊ตฌ์กฐ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

struct sock_filter {
        __u16   code;
        __u8    jt;
        __u8    jf;
        __u32   k;
}

์ „์ฒด ํ”„๋กœ๊ทธ๋žจ์€ ๊ตฌ์กฐ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

struct sock_fprog {
        unsigned short len;
        struct sock_filter *filter;
}

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด, ๋ช…๋ น์–ด ์ฝ”๋“œ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค). [1]). ํ•„ํ„ฐ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์–ด์š” ip6 ์œผ๋กœ ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ์˜ˆ:

struct sock_filter code[] = {
        { 0x28, 0, 0, 0x0000000c },
        { 0x15, 0, 1, 0x000086dd },
        { 0x06, 0, 0, 0x00040000 },
        { 0x06, 0, 0, 0x00000000 },
};
struct sock_fprog prog = {
        .len = ARRAY_SIZE(code),
        .filter = code,
};

ํ”„๋กœ๊ทธ๋žจ prog ์šฐ๋ฆฌ๋Š” ํ†ตํ™”์—์„œ ํ•ฉ๋ฒ•์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

setsockopt(sk, SOL_SOCKET, SO_ATTACH_FILTER, &prog, sizeof(prog))

๊ธฐ๊ณ„์–ด ํ˜•ํƒœ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ฆฌ ํŽธ๋ฆฌํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋•Œ๋กœ๋Š” ํ•„์š”ํ•  ๋•Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๋””๋ฒ„๊น…, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ƒ์„ฑ, Habrรฉ์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ ์ž‘์„ฑ ๋“ฑ). ํŽธ์˜์ƒ ํŒŒ์ผ์— <linux/filter.h> ๋„์šฐ๋ฏธ ๋งคํฌ๋กœ๊ฐ€ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์œ„์™€ ๋™์ผํ•œ ์˜ˆ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

struct sock_filter code[] = {
        BPF_STMT(BPF_LD|BPF_H|BPF_ABS, 12),
        BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, ETH_P_IPV6, 0, 1),
        BPF_STMT(BPF_RET|BPF_K, 0x00040000),
        BPF_STMT(BPF_RET|BPF_K, 0),
}

๊ทธ๋Ÿฌ๋‚˜ ์ด ์˜ต์…˜์€ ๊ทธ๋‹ค์ง€ ํŽธ๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Linux ์ปค๋„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ถ”๋ก ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. tools/bpf ์ปค๋„์—์„œ๋Š” ํด๋ž˜์‹ BPF ์ž‘์—…์„ ์œ„ํ•œ ์–ด์…ˆ๋ธ”๋Ÿฌ์™€ ๋””๋ฒ„๊ฑฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๋Š” ๋””๋ฒ„๊ทธ ์ถœ๋ ฅ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. tcpdump, ๊ทธ๋Ÿฌ๋‚˜ ์ถ”๊ฐ€๋กœ ๊ธฐํ˜ธ ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์€ TCP/IPv4๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํŒจํ‚ท์„ ์‚ญ์ œํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

$ cat /tmp/tcp-over-ipv4.bpf
ldh [12]
jne #0x800, drop
ldb [23]
jneq #6, drop
ret #-1
drop: ret #0

๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด์…ˆ๋ธ”๋Ÿฌ๋Š” ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. <ะบะพะปะธั‡ะตัั‚ะฒะพ ะธะฝัั‚ั€ัƒะบั†ะธะน>,<code1> <jt1> <jf1> <k1>,..., TCP๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ tools/bpf/bpf_asm /tmp/tcp-over-ipv4.bpf
6,40 0 0 12,21 0 3 2048,48 0 0 23,21 0 1 6,6 0 0 4294967295,6 0 0 0,

C ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋‹ค๋ฅธ ์ถœ๋ ฅ ํ˜•์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ tools/bpf/bpf_asm -c /tmp/tcp-over-ipv4.bpf
{ 0x28,  0,  0, 0x0000000c },
{ 0x15,  0,  3, 0x00000800 },
{ 0x30,  0,  0, 0x00000017 },
{ 0x15,  0,  1, 0x00000006 },
{ 0x06,  0,  0, 0xffffffff },
{ 0x06,  0,  0, 0000000000 },

์ด ํ…์ŠคํŠธ๋Š” ์œ ํ˜• ๊ตฌ์กฐ ์ •์˜์— ๋ณต์‚ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. struct sock_filter, ์ด ์„น์…˜์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ ๊ทธ๋žฌ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ.

Linux ๋ฐ netsniff-ng ํ™•์žฅ

ํ‘œ์ค€ BPF ์™ธ์—๋„ Linux ๋ฐ tools/bpf/bpf_asm ์ง€์›๊ณผ ๋น„ํ‘œ์ค€ ์„ธํŠธ. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ช…๋ น์–ด๋Š” ๊ตฌ์กฐ์ฒด์˜ ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. struct sk_buff, ์ปค๋„์˜ ๋„คํŠธ์›Œํฌ ํŒจํ‚ท์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋„์šฐ๋ฏธ ๋ช…๋ น๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ldw cpu ๋ ˆ์ง€์Šคํ„ฐ์— ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค A ์ปค๋„ ํ•จ์ˆ˜ ์‹คํ–‰ ๊ฒฐ๊ณผ raw_smp_processor_id(). (BPF์˜ ์ƒˆ ๋ฒ„์ „์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋น„ํ‘œ์ค€ ํ™•์žฅ์ด ํ™•์žฅ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ, ๊ตฌ์กฐ์— ์•ก์„ธ์Šคํ•˜๊ณ  ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ปค๋„ ๋„์šฐ๋ฏธ ์„ธํŠธ๋ฅผ ํ”„๋กœ๊ทธ๋žจ์— ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.) ๋‹ค์Œ์€ ํ•„ํ„ฐ์˜ ํฅ๋ฏธ๋กœ์šด ์˜ˆ์ž…๋‹ˆ๋‹ค. ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ท ํ—ค๋”๋ฅผ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์œผ๋กœ poff, ํŽ˜์ด๋กœ๋“œ ์˜คํ”„์…‹:

ld poff
ret a

BPF ํ™•์žฅ์€ ๋‹ค์Œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. tcpdump, ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ์•Œ์•„๊ฐ€๋Š” ์ข‹์€ ์ด์œ ์ž…๋‹ˆ๋‹ค. netsniff-ng, ๋ฌด์—‡๋ณด๋‹ค๋„ ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋žจ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. netsniff-ng, BPF๋ฅผ ์‚ฌ์šฉํ•œ ํ•„ํ„ฐ๋ง ์™ธ์—๋„ ํšจ๊ณผ์ ์ธ ํŠธ๋ž˜ํ”ฝ ์ƒ์„ฑ๊ธฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ tools/bpf/bpf_asm, BPF ์–ด์…ˆ๋ธ”๋Ÿฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. bpfc. ํŒจํ‚ค์ง€์—๋Š” ๋งค์šฐ ์ž์„ธํ•œ ๋ฌธ์„œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์‚ฌ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” ๋งํฌ๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ดˆ์ปด

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ž„์˜์˜ ๋ณต์žก์„ฑ์„ ์ง€๋‹Œ BPF ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ์ƒˆ๋กœ์šด ์˜ˆ์ œ๋ฅผ ๋ณผ ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์ฒซ ๋ฒˆ์งธ๋Š” BPF ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ธ์ˆ˜ ์„ธํŠธ ๋ฐ ์„ธํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” seccomp ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ํ”„๋กœ์„ธ์Šค์™€ ๊ทธ ์ž์†.

seccomp์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์€ 2005๋…„์— ์ปค๋„์— ์ถ”๊ฐ€๋˜์—ˆ์ง€๋งŒ ๊ทธ๋‹ค์ง€ ์ธ๊ธฐ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ง‘ํ•ฉ์„ ๋‹ค์Œ์œผ๋กœ ์ œํ•œํ•˜๋Š” ๋‹จ์ผ ์˜ต์…˜๋งŒ ์ œ๊ณตํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. read, write, exit ะธ sigreturn, ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•œ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. SIGKILL. ๊ทธ๋Ÿฌ๋‚˜ 2012๋…„์— seccomp์—๋Š” BPF ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์–ด ํ—ˆ์šฉ๋˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ง‘ํ•ฉ์„ ์ •์˜ํ•˜๊ณ  ํ•ด๋‹น ์ธ์ˆ˜์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (ํฅ๋ฏธ๋กญ๊ฒŒ๋„ Chrome์€ ์ด ๊ธฐ๋Šฅ์˜ ์ตœ์ดˆ ์‚ฌ์šฉ์ž ์ค‘ ํ•˜๋‚˜์˜€์œผ๋ฉฐ Chrome ์ง์›์€ ํ˜„์žฌ BPF์˜ ์ƒˆ ๋ฒ„์ „์„ ๊ธฐ๋ฐ˜์œผ๋กœ KRSI ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐœ๋ฐœํ•˜๊ณ  Linux ๋ณด์•ˆ ๋ชจ๋“ˆ์˜ ์‚ฌ์šฉ์ž ์ •์˜๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.) ์ถ”๊ฐ€ ๋ฌธ์„œ์— ๋Œ€ํ•œ ๋งํฌ๋Š” ๋์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์‚ฌ์˜.

seccomp ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ๊ฐ€ ์ด๋ฏธ ํ—ˆ๋ธŒ์— ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ ํ•˜์œ„ ์„น์…˜์„ ์ฝ๊ธฐ ์ „์—(๋˜๋Š” ๋Œ€์‹ ) ์ฝ์–ด๋ณด๊ณ  ์‹ถ์–ดํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์‚ฌ์—์„œ ์ปจํ…Œ์ด๋„ˆ ๋ฐ ๋ณด์•ˆ: seccomp 2007 ๋ฒ„์ „๊ณผ BPF๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „(libseccomp๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„ํ„ฐ๊ฐ€ ์ƒ์„ฑ๋จ)์˜ seccomp ์‚ฌ์šฉ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•˜๊ณ  seccomp์™€ Docker์˜ ์—ฐ๊ฒฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋ฉฐ ๋งŽ์€ ์œ ์šฉํ•œ ๋งํฌ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์‚ฌ์—์„œ systemd๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ๋ชฌ์„ ๊ฒฉ๋ฆฌํ•˜๊ฑฐ๋‚˜ โ€œ์ด ์ž‘์—…์—๋Š” Docker๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!โ€ ํŠนํžˆ systemd๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ๋ชฌ์— ๋Œ€ํ•œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๋˜๋Š” ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ํ•„ํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. seccomp ๋ฒ ์–ด C์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ libseccomp ๊ฐ ์˜ต์…˜์˜ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ด๋ฉฐ, ๋งˆ์ง€๋ง‰์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์—์„œ seccomp๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. strace.

seccomp์šฉ ํ•„ํ„ฐ ์ž‘์„ฑ ๋ฐ ๋กœ๋“œ

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ BPF ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋จผ์ € seccomp ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค ์ˆ˜์ค€์—์„œ ํ•„ํ„ฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋Š” ์ œํ•œ ์‚ฌํ•ญ์„ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. seccomp(2):

seccomp(SECCOMP_SET_MODE_FILTER, flags, &filter)

์–ด๋””์—์„œ &filter - ์ด๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์ด๋ฏธ ์นœ์ˆ™ํ•œ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค. struct sock_fprog, ์ฆ‰. BPF ํ”„๋กœ๊ทธ๋žจ.

seccomp ํ”„๋กœ๊ทธ๋žจ์€ ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฆ…๋‹ˆ๊นŒ? ์ „์†ก๋œ ์ปจํ…์ŠคํŠธ. ์†Œ์ผ“์˜ ๊ฒฝ์šฐ ํŒจํ‚ท์„ ํฌํ•จํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ์ฃผ์–ด์กŒ๊ณ  seccomp์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ์ฃผ์–ด์กŒ์Šต๋‹ˆ๋‹ค.

struct seccomp_data {
    int   nr;
    __u32 arch;
    __u64 instruction_pointer;
    __u64 args[6];
};

์—ฌ๊ธฐ์— nr ์‹œ์ž‘ํ•  ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. arch - ํ˜„์žฌ ์•„ํ‚คํ…์ฒ˜(์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ์ฐธ์กฐ) args - ์ตœ๋Œ€ XNUMX๊ฐœ์˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ธ์ˆ˜ instruction_pointer ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•œ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ๋ช…๋ น์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ฒˆํ˜ธ๋ฅผ ๋ ˆ์ง€์Šคํ„ฐ์— ๋กœ๋“œํ•˜๋ ค๋ฉด A ์šฐ๋ฆฌ๋Š” ๋งํ•ด์•ผ

ldw [0]

seccomp ํ”„๋กœ๊ทธ๋žจ์—๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ปจํ…์ŠคํŠธ๋Š” 32๋น„ํŠธ ์ •๋ ฌ๋กœ๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•„ํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐ˜ ๋‹จ์–ด ๋˜๋Š” ๋ฐ”์ดํŠธ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ldh [0] ์‹œ์Šคํ…œ ํ˜ธ์ถœ seccomp ๋Œ์•„์˜ฌ ๊ฒƒ์ด๋‹ค EINVAL. ์ด ํ•จ์ˆ˜๋Š” ๋กœ๋“œ๋œ ํ•„ํ„ฐ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. seccomp_check_filter() ์ปค๋„. (์žฌ๋ฏธ์žˆ๋Š” ์ ์€ seccomp ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ์›๋ž˜ ์ปค๋ฐ‹์—์„œ ์ด ๊ธฐ๋Šฅ์— ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. mod (๋‚˜๋ˆ„๊ธฐ ๋‚˜๋จธ์ง€) ์ถ”๊ฐ€ ์ดํ›„ seccomp BPF ํ”„๋กœ๊ทธ๋žจ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ถ€์„œ์งˆ ๊ฒƒ์ด๋‹ค ABI.)

๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” seccomp ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ณ  ์ฝ๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ ๋กœ์ง์€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ํ™”์ดํŠธ ๋˜๋Š” ๋ธ”๋ž™ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐฐ์—ด๋ฉ๋‹ˆ๋‹ค.

ld [0]
jeq #304, bad
jeq #176, bad
jeq #239, bad
jeq #279, bad
good: ret #0x7fff0000 /* SECCOMP_RET_ALLOW */
bad: ret #0

304, 176, 239, 279๋ฒˆ์œผ๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ง„ XNUMX๊ฐœ์˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ค ์•„ํ‚คํ…์ฒ˜๋ฅผ ์œ„ํ•ด ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ™•์‹คํžˆ ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ seccomp์˜ ์ €์ž๋Š” ์ œ๊ณต ์•„ํ‚คํ…์ฒ˜ ๊ฒ€์‚ฌ๋กœ ๋ชจ๋“  โ€‹โ€‹ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค(ํ˜„์žฌ ์•„ํ‚คํ…์ฒ˜๋Š” ์ปจํ…์ŠคํŠธ์— ํ•„๋“œ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค). arch ๊ตฌ์กฐ struct seccomp_data). ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ™•์ธํ•œ ๊ฒฝ์šฐ ์˜ˆ์ œ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ld [4]
jne #0xc000003e, bad_arch ; SCMP_ARCH_X86_64

๊ทธ๋Ÿฌ๋ฉด ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ฒˆํ˜ธ๊ฐ€ ํŠน์ • ๊ฐ’์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ seccomp์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. libseccomp

๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ๋˜๋Š” BPF ์–ด์…ˆ๋ธ”๋ฆฌ์— ํ•„ํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋™์‹œ์— ์ด์‹ ๊ฐ€๋Šฅํ•˜๊ณ /๋˜๋Š” ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์„œ๊ด€์ด ์šฐ๋ฆฌ๋ฅผ ๋„์™€์ค„ ๊ฑฐ์˜ˆ์š” libseccomp, ํ‘๋ฐฑ ํ•„ํ„ฐ ์ž‘์„ฑ์„ ์œ„ํ•œ ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ „์— ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋ฅผ ์„ค์น˜ํ•œ ํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๊ธฐ์‚ฌ (๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ๋‹จ์ˆœํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๋ฒ„์ „์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—):

#include <seccomp.h>
#include <unistd.h>
#include <err.h>

static int sys_numbers[] = {
        __NR_mount,
        __NR_umount2,
       // ... ะตั‰ะต 40 ัะธัั‚ะตะผะฝั‹ั… ะฒั‹ะทะพะฒะพะฒ ...
        __NR_vmsplice,
        __NR_perf_event_open,
};

int main(int argc, char **argv)
{
        scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_ALLOW);

        for (size_t i = 0; i < sizeof(sys_numbers)/sizeof(sys_numbers[0]); i++)
                seccomp_rule_add(ctx, SCMP_ACT_TRAP, sys_numbers[i], 0);

        seccomp_load(ctx);

        execvp(argv[1], &argv[1]);
        err(1, "execlp: %s", argv[1]);
}

๋จผ์ € ๋ฐฐ์—ด์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. sys_numbers ์ฐจ๋‹จํ•  ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ฒˆํ˜ธ๊ฐ€ 40๊ฐœ ์ด์ƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ctx ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ์€์ง€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์•Œ๋ ค์ฃผ์„ธ์š”(SCMP_ACT_ALLOW) ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์‹œ์Šคํ…œ ํ˜ธ์ถœ(๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ๋ก์˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. SCMP_ACT_TRAP, ์ด ๊ฒฝ์šฐ seccomp๋Š” ํ”„๋กœ์„ธ์Šค์— ์‹ ํ˜ธ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. SIGSYS ์–ด๋–ค ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๊ทœ์น™์„ ์œ„๋ฐ˜ํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ํ•จ๊ป˜. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์ปค๋„์— ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. seccomp_load, ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. seccomp(2).

์„ฑ๊ณต์ ์ธ ์ปดํŒŒ์ผ์„ ์œ„ํ•ด์„œ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. libseccomp์˜ˆ :

cc -std=c17 -Wall -Wextra -c -o seccomp_lib.o seccomp_lib.c
cc -o seccomp_lib seccomp_lib.o -lseccomp

์„ฑ๊ณต์ ์ธ ์ถœ์‹œ์˜ ์˜ˆ:

$ ./seccomp_lib echo ok
ok

์ฐจ๋‹จ๋œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ์˜ˆ:

$ sudo ./seccomp_lib mount -t bpf bpf /tmp
Bad system call

์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ strace์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

$ sudo strace -e seccomp ./seccomp_lib mount -t bpf bpf /tmp
seccomp(SECCOMP_SET_MODE_FILTER, 0, {len=50, filter=0x55d8e78428e0}) = 0
--- SIGSYS {si_signo=SIGSYS, si_code=SYS_SECCOMP, si_call_addr=0xboobdeadbeef, si_syscall=__NR_mount, si_arch=AUDIT_ARCH_X86_64} ---
+++ killed by SIGSYS (core dumped) +++
Bad system call

๋ถˆ๋ฒ•์ ์ธ ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋กœ ์ธํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์—ˆ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‚˜์š”? mount(2).

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„ํ„ฐ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. libseccomp, ์‚ฌ์†Œํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๋„ค ์ค„์— ๋งž์ถ”๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์—์„œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋งŽ์€ ๊ฒฝ์šฐ์—๋Š” ๋น„๊ต ๋ชฉ๋ก์— ๋ถˆ๊ณผํ•˜๋ฏ€๋กœ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๋ˆˆ์— ๋„๊ฒŒ ์ค„์–ด๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด libseccomp๋Š” ์ตœ๊ทผ ํŒจ์น˜ ํฌํ•จ, ํ•„ํ„ฐ ์†์„ฑ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. SCMP_FLTATR_CTL_OPTIMIZE. ์ด ์†์„ฑ์„ 2๋กœ ์„ค์ •ํ•˜๋ฉด ํ•„ํ„ฐ๊ฐ€ ์ด์ง„ ๊ฒ€์ƒ‰ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ด์ง„ ๊ฒ€์ƒ‰ ํ•„ํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ดํŽด๋ณด์„ธ์š”. ๊ฐ„๋‹จํ•œ ์Šคํฌ๋ฆฝํŠธ, ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ฒˆํ˜ธ๋ฅผ ๋‹ค์ด์–ผ๋งํ•˜์—ฌ BPF ์–ด์…ˆ๋ธ”๋Ÿฌ์—์„œ ์ด๋Ÿฌํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

$ echo 1 3 6 8 13 | ./generate_bin_search_bpf.py
ld [0]
jeq #6, bad
jgt #6, check8
jeq #1, bad
jeq #3, bad
ret #0x7fff0000
check8:
jeq #8, bad
jeq #13, bad
ret #0x7fff0000
bad: ret #0

BPF ํ”„๋กœ๊ทธ๋žจ์€ ๋“ค์—ฌ์“ฐ๊ธฐ ์ ํ”„๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋” ๋น ๋ฅด๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค). jmp A ๋˜๋Š” jmp [label+X]) ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์ „ํ™˜์€ ์ •์ ์ž…๋‹ˆ๋‹ค.

seccomp ๋ฐ strace

๋ชจ๋‘๊ฐ€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. strace Linux์—์„œ ํ”„๋กœ์„ธ์Šค์˜ ๋™์ž‘์„ ์—ฐ๊ตฌํ•˜๋Š” ๋ฐ ์—†์–ด์„œ๋Š” ์•ˆ๋  ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์„ฑ๋Šฅ ๋ฌธ์ œ ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ. ์‚ฌ์‹ค์€ strace ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ ptrace(2), ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘์ง€ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์„ธํŠธ(์˜ˆ: ๋ช…๋ น)๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

$ time strace du /usr/share/ >/dev/null 2>&1

real    0m3.081s
user    0m0.531s
sys     0m2.073s

ะธ

$ time strace -e open du /usr/share/ >/dev/null 2>&1

real    0m2.404s
user    0m0.193s
sys     0m1.800s

๋‘ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋งŒ ์ถ”์ ํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ ๊ฑฐ์˜ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์˜ต์…˜ --seccomp-bpf์— ์ถ”๊ฐ€ strace ๋ฒ„์ „ 5.3์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค ์†๋„๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋†’์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ถ”์ ์— ๋”ฐ๋ฅธ ์‹œ์ž‘ ์‹œ๊ฐ„์€ ์ด๋ฏธ ์ผ๋ฐ˜ ์‹œ์ž‘ ์‹œ๊ฐ„๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

$ time strace --seccomp-bpf -e open du /usr/share/ >/dev/null 2>&1

real    0m0.148s
user    0m0.017s
sys     0m0.131s

$ time du /usr/share/ >/dev/null 2>&1

real    0m0.140s
user    0m0.024s
sys     0m0.116s

(๋ฌผ๋ก  ์—ฌ๊ธฐ์—๋Š” ์ด ๋ช…๋ น์˜ ๊ธฐ๋ณธ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ถ”์ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ ์•ฝ๊ฐ„์˜ ์†์ž„์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, newfsstat, ๊ทธ๋Ÿฐ ๋‹ค์Œ strace ์—†๋Š” ๊ฒƒ๋งŒํผ ์„ธ๊ฒŒ ๋ธŒ๋ ˆ์ดํฌ๋ฅผ ๋ฐŸ์„ ๊ฒƒ์ด๋‹ค --seccomp-bpf.)

์ด ์˜ต์…˜์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”? ๊ทธ๋…€์—†์ด strace ํ”„๋กœ์„ธ์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ  ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. PTRACE_SYSCALL. ๊ด€๋ฆฌ๋˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ (๋ชจ๋“ ) ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ๋ฐœํ–‰ํ•˜๋ฉด ์ œ์–ด๊ฐ€ ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๋กœ ์ด์ „๋ฉ๋‹ˆ๋‹ค. strace, ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ์ธ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. PTRACE_SYSCALL. ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„ ํ”„๋กœ์„ธ์Šค๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์™„๋ฃŒํ•˜๊ณ  ์ข…๋ฃŒํ•˜๋ฉด ์ œ์–ด๊ฐ€ ๋‹ค์‹œ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. strace, ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋ณด๊ณ  ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. PTRACE_SYSCALL, ๋“ฑ๋“ฑ.

์–ด๋ฆฐ ์•„์ด๋“ค์„ ์œ„ํ•œ BPF, ํŒŒํŠธ XNUMX: ํด๋ž˜์‹ BPF

๊ทธ๋Ÿฌ๋‚˜ seccomp๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ •ํ™•ํ•˜๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‹œ์Šคํ…œ ์ฝœ๋งŒ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด X, ๊ทธ๋Ÿฐ ๋‹ค์Œ BPF ํ•„ํ„ฐ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. X ๊ฐ’์„ ๋ฐ˜ํ™˜ SECCOMP_RET_TRACE, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ์—๊ฒŒ ๊ด€์‹ฌ์ด ์—†๋Š” ์ „ํ™”์˜ ๊ฒฝ์šฐ - SECCOMP_RET_ALLOW:

ld [0]
jneq #X, ignore
trace: ret #0x7ff00000
ignore: ret #0x7fff0000

์ด ๊ฒฝ์šฐ strace ์ฒ˜์Œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. PTRACE_CONT, ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ•„ํ„ฐ๋Š” ๊ฐ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. X, ํ”„๋กœ์„ธ์Šค๋Š” ๊ณ„์† ์‹คํ–‰๋˜์ง€๋งŒ, X, seccomp๊ฐ€ ์ œ์–ด๊ถŒ์„ ์ด์ „ํ•ฉ๋‹ˆ๋‹ค. strace์ธ์ˆ˜๋ฅผ ๋ณด๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. PTRACE_SYSCALL (seccomp์—๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ข…๋ฃŒ ์‹œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.) ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋ฐ˜ํ™˜๋˜๋ฉด strace ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. PTRACE_CONT seccomp์˜ ์ƒˆ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

์–ด๋ฆฐ ์•„์ด๋“ค์„ ์œ„ํ•œ BPF, ํŒŒํŠธ XNUMX: ํด๋ž˜์‹ BPF

์˜ต์…˜ ์‚ฌ์šฉ์‹œ --seccomp-bpf ๋‘ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ์งธ, ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์— ์ฐธ์—ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์˜ต์…˜ -p ํ”„๋กœ๊ทธ๋žจ strace), ์ด๋Š” seccomp์—์„œ ์ง€์›๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‘˜์งธ, ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋‹ค ์•„๋‹ˆ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. seccomp ํ•„ํ„ฐ๋Š” ์ด๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ์—†์ด ๋ชจ๋“  ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ์ƒ์†๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์ข€ ๋” ์ž์„ธํžˆ strace ์™€ ์ผํ•˜๋‹ค seccomp ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์ตœ๊ทผ ๋ณด๊ณ ์„œ. ์šฐ๋ฆฌ์—๊ฒŒ ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ์‚ฌ์‹ค์€ seccomp๋กœ ๋Œ€ํ‘œ๋˜๋Š” ํด๋ž˜์‹ BPF๊ฐ€ ์˜ค๋Š˜๋‚ ์—๋„ ์—ฌ์ „ํžˆ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

xt_bpf

์ด์ œ ๋„คํŠธ์›Œํฌ์˜ ์„ธ๊ณ„๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ: ์˜ค๋ž˜์ „์ธ 2007๋…„์— ํ•ต์‹ฌ์€ ์ถ”๊ฐ€ ๋ชจ๋“ˆ xt_u32 ๋„ทํ•„ํ„ฐ์šฉ. ํ›จ์”ฌ ๋” ์˜ค๋ž˜๋œ ํŠธ๋ž˜ํ”ฝ ๋ถ„๋ฅ˜๊ธฐ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. cls_u32 ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ iptables์— ๋Œ€ํ•œ ์ž„์˜์˜ ์ด์ง„ ๊ทœ์น™์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€์—์„œ 32๋น„ํŠธ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์ด์— ๋Œ€ํ•ด ์ผ๋ จ์˜ ์‚ฐ์ˆ  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,

sudo iptables -A INPUT -m u32 --u32 "6&0xFF=1" -j LOG --log-prefix "seen-by-xt_u32"

ํŒจ๋”ฉ 32๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ IP ํ—ค๋”์˜ 6๋น„ํŠธ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์—ฌ๊ธฐ์— ๋งˆ์Šคํฌ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. 0xFF (๋‚ฎ์€ ๋ฐ”์ดํŠธ๋ฅผ ์ทจํ•จ) ์ด ํ•„๋“œ protocol IP ํ—ค๋”๋ฅผ 1(ICMP)๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋‚˜์˜ ๊ทœ์น™์œผ๋กœ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฐ์‚ฐ์ž๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. @ โ€” X๋ฐ”์ดํŠธ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ทœ์น™

iptables -m u32 --u32 "6&0xFF=0x6 && 0>>22&0x3C@4=0x29"

TCP ์‹œํ€€์Šค ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์ง€ ์•Š์€์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 0x29. ๊ทธ๋Ÿฌํ•œ ๊ทœ์น™์„ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋‹ค์ง€ ํŽธ๋ฆฌํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด ์ด๋ฏธ ๋ถ„๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ์‚ฌ์—์„œ BPF - ์žŠํ˜€์ง„ ๋ฐ”์ดํŠธ์ฝ”๋“œ, ์— ๋Œ€ํ•œ ์‚ฌ์šฉ ๋ฐ ๊ทœ์น™ ์ƒ์„ฑ ์˜ˆ๊ฐ€ ํฌํ•จ๋œ ์—ฌ๋Ÿฌ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. xt_u32. ์ด ๊ธ€ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” ๋งํฌ๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

2013๋…„๋ถ€ํ„ฐ ๋ชจ๋“ˆ ๋Œ€์‹  ๋ชจ๋“ˆ xt_u32 BPF ๊ธฐ๋ฐ˜ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค xt_bpf. ์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ์€ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ BPF ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ iptables ๊ทœ์น™์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ์ž‘๋™ ์›๋ฆฌ์— ๋Œ€ํ•ด ์ด๋ฏธ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒˆ ๊ทœ์น™์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

iptables -A INPUT -m bpf --bytecode <ะฑะฐะนั‚ะบะพะด> -j LOG

์—ฌ๊ธฐ์— <ะฑะฐะนั‚ะบะพะด> - ์ด๊ฒƒ์€ ์–ด์…ˆ๋ธ”๋Ÿฌ ์ถœ๋ ฅ ํ˜•์‹์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. bpf_asm ์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ๋ณธ์ ์œผ๋กœ

$ cat /tmp/test.bpf
ldb [9]
jneq #17, ignore
ret #1
ignore: ret #0

$ bpf_asm /tmp/test.bpf
4,48 0 0 9,21 0 1 17,6 0 0 1,6 0 0 0,

# iptables -A INPUT -m bpf --bytecode "$(bpf_asm /tmp/test.bpf)" -j LOG

์ด ์˜ˆ์—์„œ๋Š” ๋ชจ๋“  UDP ํŒจํ‚ท์„ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์˜ BPF ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ xt_bpf๋Š” ๋ฌผ๋ก  iptables์˜ ๊ฒฝ์šฐ IPv4 ํ—ค๋”์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒจํ‚ท ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. BPF ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฐ˜ํ™˜ ๊ฐ’ ๋ถ€์šธ์–ด๋””์—์„œ false ํŒจํ‚ท์ด ์ผ์น˜ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“ˆ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. xt_bpf ์œ„์˜ ์˜ˆ๋ณด๋‹ค ๋” ๋ณต์žกํ•œ ํ•„ํ„ฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Cloudfare์˜ ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ๊นŒ์ง€ ๊ทธ๋“ค์€ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. xt_bpf DDoS ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์‚ฌ์—์„œ BPF ๋„๊ตฌ ์†Œ๊ฐœ BPF ํ•„ํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•(๋ฐ ์ด์œ )์„ ์„ค๋ช…ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ํ•„ํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์„ธํŠธ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด bpfgen ์ด๋ฆ„์— ๋Œ€ํ•œ DNS ์ฟผ๋ฆฌ์™€ ์ผ์น˜ํ•˜๋Š” BPF ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค habr.com:

$ ./bpfgen --assembly dns -- habr.com
ldx 4*([0]&0xf)
ld #20
add x
tax

lb_0:
    ld [x + 0]
    jneq #0x04686162, lb_1
    ld [x + 4]
    jneq #0x7203636f, lb_1
    ldh [x + 8]
    jneq #0x6d00, lb_1
    ret #65535

lb_1:
    ret #0

ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋จผ์ € ๋ ˆ์ง€์Šคํ„ฐ์— ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. X ์ค„ ์ฃผ์†Œ์˜ ์‹œ์ž‘ x04habrx03comx00 UDP ๋ฐ์ดํ„ฐ๊ทธ๋žจ ๋‚ด๋ถ€์—์„œ ์š”์ฒญ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 0x04686162 <-> "x04hab" ๊ธฐํƒ€

์ž ์‹œ ํ›„ Cloudfare๋Š” p0f -> BPF ์ปดํŒŒ์ผ๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์‚ฌ์—์„œ p0f BPF ์ปดํŒŒ์ผ๋Ÿฌ ์†Œ๊ฐœ ๊ทธ๋“ค์€ p0f๊ฐ€ ๋ฌด์—‡์ธ์ง€, p0f ์„œ๋ช…์„ BPF๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

$ ./bpfgen p0f -- 4:64:0:0:*,0::ack+:0
39,0 0 0 0,48 0 0 8,37 35 0 64,37 0 34 29,48 0 0 0,
84 0 0 15,21 0 31 5,48 0 0 9,21 0 29 6,40 0 0 6,
...

ํ˜„์žฌ ๋” ์ด์ƒ Cloudfare๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. xt_bpf, ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ BPF๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜์ธ XDP๋กœ ์ด๋™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐํ•˜์„ธ์š”. L4Drop: XDP DDoS ์™„ํ™”.

cls_bpf

์ปค๋„์—์„œ ํด๋ž˜์‹ BPF๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งˆ์ง€๋ง‰ ์˜ˆ๋Š” ๋ถ„๋ฅ˜์ž์ž…๋‹ˆ๋‹ค. cls_bpf Linux์˜ ํŠธ๋ž˜ํ”ฝ ์ œ์–ด ํ•˜์œ„ ์‹œ์Šคํ…œ์šฉ์œผ๋กœ 2013๋…„ ๋ง์— Linux์— ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ ๊ฐœ๋…์ ์œผ๋กœ ๊ณ ๋Œ€ ํ•˜์œ„ ์‹œ์Šคํ…œ์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. cls_u32.

ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์ž‘ํ’ˆ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. cls_bpf, ํด๋ž˜์‹ BPF์— ๋Œ€ํ•œ ์ง€์‹์˜ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์•„๋ฌด๊ฒƒ๋„ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๋ชจ๋“  ๊ธฐ๋Šฅ์— ์ต์ˆ™ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ™•์žฅ BPF์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋Š” ํ›„์† ๊ธฐ์‚ฌ์—์„œ๋Š” ์ด ๋ถ„๋ฅ˜์ž๋ฅผ ๋‘ ๋ฒˆ ์ด์ƒ ๋งŒ๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์‹ BPF c ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ  cls_bpf ๋ฌธ์ œ๋Š” ํ™•์žฅ BPF์™€ ๋น„๊ตํ•  ๋•Œ ์ด ๊ฒฝ์šฐ ์ ์šฉ ๋ฒ”์œ„๊ฐ€ ๊ทผ๋ณธ์ ์œผ๋กœ ์ข์•„์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ์€ ํŒจํ‚ค์ง€์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ํ˜ธ์ถœ ๊ฐ„์— ์ƒํƒœ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด์ œ ํด๋ž˜์‹ BPF์— ์ž‘๋ณ„์„ ๊ณ ํ•˜๊ณ  ๋ฏธ๋ž˜๋ฅผ ๋ฐ”๋ผ๋ณผ ๋•Œ์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์‹ BPF์™€ ์ž‘๋ณ„

์šฐ๋ฆฌ๋Š” 32๋…„๋Œ€ ์ดˆ๋ฐ˜์— ๊ฐœ๋ฐœ๋œ BPF ๊ธฐ์ˆ ์ด ์–ด๋–ป๊ฒŒ 64๋…„ ๋™์•ˆ ์„ฑ๊ณต์ ์œผ๋กœ ์‚ด์•„๋‚จ์•˜๊ณ  ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์ƒˆ๋กœ์šด ์‘์šฉ ๋ถ„์•ผ๋ฅผ ์ฐพ์•˜๋Š”์ง€ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์Šคํƒ ๋จธ์‹ ์—์„œ RISC๋กœ์˜ ์ „ํ™˜์ด ํด๋ž˜์‹ BPF ๊ฐœ๋ฐœ์˜ ์›๋™๋ ฅ์ด ๋˜์—ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, XNUMX๋…„๋Œ€์—๋Š” XNUMX๋น„ํŠธ ๋จธ์‹ ์—์„œ XNUMX๋น„ํŠธ ๋จธ์‹ ์œผ๋กœ์˜ ์ „ํ™˜์ด ์žˆ์—ˆ๊ณ  ํด๋ž˜์‹ BPF๋Š” ์“ธ๋ชจ์—†๊ฒŒ ๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํด๋ž˜์‹ BPF์˜ ๊ธฐ๋Šฅ์€ ๋งค์šฐ ์ œํ•œ์ ์ด๋ฉฐ ์˜ค๋ž˜๋œ ์•„ํ‚คํ…์ฒ˜ ์™ธ์—๋„ BPF ํ”„๋กœ๊ทธ๋žจ ํ˜ธ์ถœ ์‚ฌ์ด์— ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฉฐ ์ง์ ‘์ ์ธ ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ ๊ฐ€๋Šฅ์„ฑ์ด ์—†์œผ๋ฉฐ ์ƒํ˜ธ ์ž‘์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ˆ˜์˜ ๊ตฌ์กฐ ํ•„๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ  ์ปค๋„๊ณผ ํ•จ๊ป˜ sk_buff ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋ฉด ํŒจํ‚ท์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ฆฌ๋””๋ ‰์…˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ํ˜„์žฌ Linux์— ๋‚จ์•„ ์žˆ๋Š” ํด๋ž˜์‹ BPF๋Š” API ์ธํ„ฐํŽ˜์ด์Šค๋ฟ์ž…๋‹ˆ๋‹ค. ์ปค๋„ ๋‚ด๋ถ€์—์„œ๋Š” ์†Œ์ผ“ ํ•„ํ„ฐ๋‚˜ seccomp ํ•„ํ„ฐ ๋“ฑ ๋ชจ๋“  ํด๋ž˜์‹ ํ”„๋กœ๊ทธ๋žจ์ด ์ž๋™์œผ๋กœ ์ƒˆ๋กœ์šด ํ˜•์‹์ธ ํ™•์žฅ BPF๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. (์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋ฐœ์ƒํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ๊ธฐ์‚ฌ์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.)

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋กœ์˜ ์ „ํ™˜์€ Alexey Starovoitov๊ฐ€ BPF ์—…๋ฐ์ดํŠธ ์ฒด๊ณ„๋ฅผ ์ œ์•ˆํ•œ 2013๋…„์— ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 2014๋…„์— ํ•ด๋‹น ํŒจ์น˜ ๋‚˜ํƒ€๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค ํ•ต์‹ฌ์—. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, ์›๋ž˜ ๊ณ„ํš์€ 64๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ ๋” ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ์•„ํ‚คํ…์ฒ˜์™€ JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ๋ฟ์ด์—ˆ์ง€๋งŒ, ๋Œ€์‹  ์ด๋Ÿฌํ•œ ์ตœ์ ํ™”๋Š” Linux ๊ฐœ๋ฐœ์˜ ์ƒˆ๋กœ์šด ์žฅ์˜ ์‹œ์ž‘์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์‹œ๋ฆฌ์ฆˆ์˜ ์ถ”๊ฐ€ ๊ธฐ์‚ฌ์—์„œ๋Š” ์ฒ˜์Œ์—๋Š” ๋‚ด๋ถ€ BPF, ํ™•์žฅ BPF, ์ง€๊ธˆ์€ ๋‹จ์ˆœํžˆ BPF๋กœ ์•Œ๋ ค์ง„ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์˜ ์•„ํ‚คํ…์ฒ˜์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฐธ์กฐ

  1. Steven McCanne ๋ฐ Van Jacobson, "BSD ํŒจํ‚ท ํ•„ํ„ฐ: ์‚ฌ์šฉ์ž ์ˆ˜์ค€ ํŒจํ‚ท ์บก์ฒ˜๋ฅผ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜", https://www.tcpdump.org/papers/bpf-usenix93.pdf
  2. Steven McCanne, "libpcap: ํŒจํ‚ท ์บก์ฒ˜๋ฅผ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•๋ก ", https://sharkfestus.wireshark.org/sharkfest.11/presentations/McCanne-Sharkfest'11_Keynote_Address.pdf
  3. tcpdump, libpcap: https://www.tcpdump.org/
  4. IPtable U32 ๊ฒฝ๊ธฐ ํŠœํ† ๋ฆฌ์–ผ.
  5. BPF - ์žŠํ˜€์ง„ ๋ฐ”์ดํŠธ์ฝ”๋“œ: https://blog.cloudflare.com/bpf-the-forgotten-bytecode/
  6. BPF ๋„๊ตฌ ์†Œ๊ฐœ: https://blog.cloudflare.com/introducing-the-bpf-tools/
  7. bpf_cls: http://man7.org/linux/man-pages/man8/tc-bpf.8.html
  8. seccomp ๊ฐœ์š”: https://lwn.net/Articles/656307/
  9. https://github.com/torvalds/linux/blob/master/Documentation/userspace-api/seccomp_filter.rst
  10. habr: ์ปจํ…Œ์ด๋„ˆ ๋ฐ ๋ณด์•ˆ: seccomp
  11. habr: systemd๋กœ ๋ฐ๋ชฌ์„ ๊ฒฉ๋ฆฌํ•˜๊ฑฐ๋‚˜ "์ด ์ž‘์—…์—๋Š” Docker๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!"
  12. Paul Chaignon, "strace --seccomp-bpf: ๋‚ด๋ถ€ ์‚ดํŽด๋ณด๊ธฐ", https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
  13. netsniff-ng: http://netsniff-ng.org/

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€