Libseccomp: RFE: ์•Œ๋ฆผ API๋กœ SCMP_FLTATR_API_SYSRAWRC ์ง€์› ํ™•์žฅ

์— ๋งŒ๋“  2020๋…„ 11์›” 13์ผ  ยท  5์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: seccomp/libseccomp

seccomp_notify_receive() ๊ตฌํ˜„์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

        if (ioctl(fd, SECCOMP_IOCTL_NOTIF_RECV, req) < 0)
                return -ECANCELED;

errno ์˜ ์˜ค๋ฅ˜์— ๊ด€๊ณ„์—†์ด -ECANCELED ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

strace๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ฒ„๊น…ํ•  ๋•Œ SIGURG ์‹ ํ˜ธ๋กœ ์ธํ•ด ioctl์ด EINTR์„ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

1448850 ioctl(7, SECCOMP_IOCTL_NOTIF_RECV <unfinished ...>
1448230 getpid()                        = 1448217
1448230 tgkill(1448217, 1448850, SIGURG) = 0
1448850 <... ioctl resumed>, 0x7fc65d49ecd0) = -1 EINTR (Interrupted system call)

์‹ ํ˜ธ SIGURL์€ Golang ๋Ÿฐํƒ€์ž„์— ์˜ํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ https://go-review.googlesource.com/c/go/+/232862/ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
ํ•ด๋‹น ๋ณด๊ณ ์„œ์— ๋”ฐ๋ฅด๋ฉด EINTR๋ฅผ ๋ฐ›์„ ๋•Œ syscall์„ ๋‹ค์‹œ ๋ฐœํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด์ƒ์ ์œผ๋กœ๋Š” libseccomp๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ํˆฌ๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‚ด ํ”„๋กœ๊ทธ๋žจ์—์„œ seccomp_notify_receive()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ syscall์„ ์žฌ๋ฐœํ–‰ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์œผ๋ฉฐ ๋™์ผํ•œ ํŒจํ„ด์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— seccomp_notify_respond() ์—์„œ๋„ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

        if (ioctl(fd, SECCOMP_IOCTL_NOTIF_SEND, resp) < 0)
                return -ECANCELED;

๊ทธ๋Ÿฌ๋‚˜ ๋•Œ๋กœ๋Š” ๋ฐ˜ํ™˜ ๊ฐ’ errno = ENOENT๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

1497880 ioctl(12, SECCOMP_IOCTL_NOTIF_SEND, 0x7f718fd28e10) = -1 ENOENT (No such file or directory)

libseccomp๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ENOENT(๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค๊ฐ€ SECCOMP_IOCTL_NOTIF_SEND ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ง์ „์— ์ค‘๋‹จ๋จ)์™€ EINTR(seccomp ์—์ด์ „ํŠธ๊ฐ€ SIGURG ์‹ ํ˜ธ์— ์˜ํ•ด ์ค‘๋‹จ๋จ)๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Golang์—์„œ errno ๋ฅผ ์ฝ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

enhancement prioritmedium

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ ... _rc_filter_sys()๊ฐ€ ์•„๋‹Œ _rc_filter()๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ...

์•„ ... ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๊ทธ๊ฒƒ์€ API ๋ ˆ๋ฒจ๋ณด๋‹ค ๋” ๊นŠ์Šต๋‹ˆ๋‹ค. "system.c"๋ฅผ ๋ณด๋ฉด libseccomp ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ ํ˜ธ์ถœ์ด API ๋ ˆ๋ฒจ ํ•จ์ˆ˜๊นŒ์ง€ ์ „ํŒŒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งจํŽ˜์ด์ง€๋ฅผ ๋ณด๋ฉด ์•Œ๋ฆผ API์— ๋Œ€ํ•ด SCMP_FLTATR_API_SYSRAWRC ์— ๋Œ€ํ•ด ์–ด๋– ํ•œ ์ฃผ์žฅ๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค(๋ฐ˜๋Œ€ ์˜ˆ๋Š” seccomp_load(3) ์ฐธ์กฐ).

์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ์ด ์ž‘์—…์— ๋Œ€ํ•ด ์–ด๋– ํ•œ ์ฃผ์žฅ๋„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ RFE๋กœ ๋‹ค์‹œ ์—ด๊ฒ ์Šต๋‹ˆ๋‹ค.

@drakenclimber v2.5.1 ๋ฆด๋ฆฌ์Šค๋ฅผ ๋Šฆ์ถ”๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด v2.6.x(v2.5.2์ผ ์ˆ˜๋„ ์žˆ์Œ) ์ž๋ฃŒ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ƒ๊ฐ์ด ๋“ค๋ฉด ์ €์—๊ฒŒ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

๋ชจ๋“  5 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @alban์ž…๋‹ˆ๋‹ค.

seccomp_attr_set(3) ๋งจํŽ˜์ด์ง€์—์„œ SCMP_FLTATR_API_SYSRAWRC ๋ฅผ ๋ณด์‹ญ์‹œ์˜ค.

libseccomp๊ฐ€ ๊ธฐ๋ณธ -ECANCELED ๋Œ€์‹  ์‹œ์Šคํ…œ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœ์ž์—๊ฒŒ ๋‹ค์‹œ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ๊บผ์ง(๊ฐ’ == 0)์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ปค๋„/libc ๋ฒ„์ „์—์„œ libseccomp API์˜ ์•ˆ์ •์ ์ธ ๋ฐ˜ํ™˜ ์ฝ”๋“œ ์•ฝ์†์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ด ๊ฒฝ์šฐ -ECANCELED ๋ฅผ ๊ฐ•์ œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์‹ค์ œ ์ปค๋„/libc ๋ฐ˜ํ™˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ ์ž ํ•˜๋Š” ํ˜ธ์ถœ์ž๋ฅผ ์œ„ํ•ด SCMP_FLTATR_API_SYSRAWRC ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ํ•ด๋‹น ์†์„ฑ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์•ˆ์ •์ ์ธ ๋ฐ˜ํ™˜ ์ฝ”๋“œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

์ด ๋ฌธ์ œ๋ฅผ NOTABUG๋กœ ๋งˆ๋ฌด๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ถ”๊ฐ€ ์งˆ๋ฌธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์—ฌ๊ธฐ์—์„œ ๊ณ„์† ๋…ผ์˜ํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•ด๊ฒฐํ•ด์•ผ ํ•  ์‹ค์ œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉด ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @pcmoore ๋น ๋ฅธ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ์ปค๋„/libc ๋ฐ˜ํ™˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ ์ž ํ•˜๋Š” ํ˜ธ์ถœ์ž๋ฅผ ์œ„ํ•ด SCMP_FLTATR_API_SYSRAWRC๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ

  • seccomp_notify_receive
  • seccomp_notify_respond
  • seccomp_notify_id_valid

_rc_filter() ๊ฐ€ ์•„๋‹Œ _rc_filter_sys() ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‚ด๊ฐ€ ํ‹€๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๋ฉด SCMP_FLTATR_API_SYSRAWRC ๋Š” ํšจ๊ณผ๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ ... _rc_filter_sys()๊ฐ€ ์•„๋‹Œ _rc_filter()๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ...

์•„ ... ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๊ทธ๊ฒƒ์€ API ๋ ˆ๋ฒจ๋ณด๋‹ค ๋” ๊นŠ์Šต๋‹ˆ๋‹ค. "system.c"๋ฅผ ๋ณด๋ฉด libseccomp ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ ํ˜ธ์ถœ์ด API ๋ ˆ๋ฒจ ํ•จ์ˆ˜๊นŒ์ง€ ์ „ํŒŒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งจํŽ˜์ด์ง€๋ฅผ ๋ณด๋ฉด ์•Œ๋ฆผ API์— ๋Œ€ํ•ด SCMP_FLTATR_API_SYSRAWRC ์— ๋Œ€ํ•ด ์–ด๋– ํ•œ ์ฃผ์žฅ๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค(๋ฐ˜๋Œ€ ์˜ˆ๋Š” seccomp_load(3) ์ฐธ์กฐ).

์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ์ด ์ž‘์—…์— ๋Œ€ํ•ด ์–ด๋– ํ•œ ์ฃผ์žฅ๋„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ RFE๋กœ ๋‹ค์‹œ ์—ด๊ฒ ์Šต๋‹ˆ๋‹ค.

@drakenclimber v2.5.1 ๋ฆด๋ฆฌ์Šค๋ฅผ ๋Šฆ์ถ”๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด v2.6.x(v2.5.2์ผ ์ˆ˜๋„ ์žˆ์Œ) ์ž๋ฃŒ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ƒ๊ฐ์ด ๋“ค๋ฉด ์ €์—๊ฒŒ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

๊ฐ์‚ฌ ํ•ด์š”!

๊ธฐ๋ก์„ ์œ„ํ•ด ๋‹ค์Œ ์ฝ”๋“œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ENOENT์™€ EINTR๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก Golang ์ธก์—์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

-   if retCode := C.seccomp_notify_respond(C.int(fd), resp); retCode != 0 {
-       return errRc(retCode)
+   for {
+       retCode, errno := C.seccomp_notify_respond(C.int(fd), resp)
+       if errno == syscall.EINTR {
+           continue
+       }
+       if errno == syscall.ENOENT {
+           return errno
+       }
+       if retCode != 0 {
+           return errRc(retCode)
+       }
+       break
    }

์ด๋ฅผ ํ†ตํ•ด libseccomp-2.5.0์—์„œ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰