์„œ์•ฝ ๊ฒฉ๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ Linux๋กœ ์ด์‹ํ•˜๋Š” ํ”„๋กœ์ ํŠธ

Cosmopolitan ํ‘œ์ค€ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ Redbean ํ”Œ๋žซํผ์˜ ์ž‘์„ฑ์ž๋Š” Linux์šฉ promise() ๊ฒฉ๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๊ตฌํ˜„์„ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. Pledge๋Š” ์›๋ž˜ OpenBSD ํ”„๋กœ์ ํŠธ์— ์˜ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์„ ์„ ํƒ์ ์œผ๋กœ ๊ธˆ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ์ผ์ข…์˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ˜•์„ฑ๋˜๊ณ  ๋‹ค๋ฅธ ํ˜ธ์ถœ์€ ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค). seccomp์™€ ๊ฐ™์€ Linux์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ œํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ๋‹ฌ๋ฆฌ ์„œ์•ฝ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์›๋ž˜ ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

systrace ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ OpenBSD ๊ธฐ๋ณธ ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฒฉ๋ฆฌํ•˜๋ ค๋Š” ์‹คํŒจํ•œ ๊ณ„ํš์€ ๊ฐœ๋ณ„ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ˆ˜์ค€์˜ ๊ฒฉ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ณ  ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์•ˆ์œผ๋กœ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋‹ค๋ฃจ๊ฑฐ๋‚˜ ๊ธฐ์„ฑ ์•ก์„ธ์Šค ํด๋ž˜์Šค๋ฅผ ์กฐ์ž‘ํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฒฉ๋ฆฌ ๊ทœ์น™์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์„œ์•ฝ์ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ œ๊ณต๋˜๋Š” ํด๋ž˜์Šค๋Š” stdio(์ž…๋ ฅ/์ถœ๋ ฅ), rpath(์ฝ๊ธฐ ์ „์šฉ ํŒŒ์ผ), wpath(ํŒŒ์ผ ์“ฐ๊ธฐ), cpath(ํŒŒ์ผ ์ƒ์„ฑ), tmppath(์ž„์‹œ ํŒŒ์ผ ์ž‘์—…), inet(๋„คํŠธ์›Œํฌ ์†Œ์ผ“), unix( unix ์†Œ์ผ“), dns(DNS ํ™•์ธ), getpw(์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ฝ๊ธฐ ์•ก์„ธ์Šค), ioctl(ioctl ํ˜ธ์ถœ), proc(ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ), exec(ํ”„๋กœ์„ธ์Šค ์‹œ์ž‘) ๋ฐ id(์•ก์„ธ์Šค ๊ถŒํ•œ ๊ด€๋ฆฌ).

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

์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฒฉ๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌ๋ณ„๋˜๋Š” FreeBSD์šฉ ๋ณ„๋„์˜ ์„œ์•ฝ ๊ตฌํ˜„์ด ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ๋Š” ๋ฐ˜๋ฉด, OpenBSD์—์„œ๋Š” ์„œ์•ฝ ํ˜ธ์ถœ์€ ๊ธฐ๋ณธ ํ™˜๊ฒฝ๊ณผ์˜ ๊ธด๋ฐ€ํ•œ ํ†ตํ•ฉ๊ณผ ๊ฐ ์ฝ”๋“œ์— ์ฃผ์„ ์ถ”๊ฐ€๋ฅผ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.

Linux์šฉ ์„œ์•ฝ ํฌํŠธ ๊ฐœ๋ฐœ์ž๋Š” FreeBSD์˜ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋Œ€์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์ œํ•œ ์‚ฌํ•ญ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ์œ ํ‹ธ๋ฆฌํ‹ฐ promise.com์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, stdio, rpath, inet ๋ฐ threadtdio ์‹œ์Šคํ…œ ํ˜ธ์ถœ ํด๋ž˜์Šค์—๋งŒ ์•ก์„ธ์Šคํ•˜์—ฌ ์ปฌ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด "./pledge.com -p 'stdio rpath inet thread' ์ปฌ http://example.com"์„ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์„œ์•ฝ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” RHEL6๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  Linux ๋ฐฐํฌํŒ์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ๋ฃจํŠธ ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ตญ์ œ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ C ์–ธ์–ด ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์˜ ์ œํ•œ ์‚ฌํ•ญ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ API๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ์•ก์„ธ์Šค๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•œ ์—”ํด๋ ˆ์ด๋ธŒ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„์—๋Š” ์ปค๋„ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ์•ฝ ์ œํ•œ ์‚ฌํ•ญ์€ SECCOMP BPF ๊ทœ์น™์œผ๋กœ ๋ณ€ํ™˜๋˜๊ณ  ๊ธฐ๋ณธ Linux ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๊ฒฉ๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, promise("stdio rpath", 0) ํ˜ธ์ถœ์€ BPF ํ•„ํ„ฐ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. static const struct sock_filter kFilter[] = { /* L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, syscall, 0, 14 - 1 ), / * L1*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[0])), /* L2*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 2, 4 - 3, 0), /* L3* / BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 10, 0, 13 - 4), /* L4*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[1])), /* L5*/ BPF_STMT(BPF_ALU | BPF_AND | BPF_K, ~0x80800), /* L6*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 1, 8 - 7, 0), /* L7*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 2, 0, 13 - 8) , /* L8*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[2])), /* L9*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 12 - 10, 0), /*L10*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 6, 12 - 11, 0), /*L11*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 17, 0, 13 - 11), /*L12*/ BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW), /*L13*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L14*/ /* ๋‹ค์Œ ํ•„ํ„ฐ */ };

์ถœ์ฒ˜ : opennet.ru

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