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