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
๋ฅผ ์ฝ์ ์ ์์ผ๋ฏ๋ก ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์๋ ํ์ธ์ @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๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ทธ๋ฌ๋ ์๋ก์ด ๊ธฐ๋ฅ
_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์์ ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ... ์ฃ์กํฉ๋๋ค. ์ฌ์ค, ๊ทธ๊ฒ์ API ๋ ๋ฒจ๋ณด๋ค ๋ ๊น์ต๋๋ค. "system.c"๋ฅผ ๋ณด๋ฉด libseccomp ์์คํ ๋ ๋ฒจ ํธ์ถ์ด API ๋ ๋ฒจ ํจ์๊น์ง ์ ํํ์ง ์๋๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋งจํ์ด์ง๋ฅผ ๋ณด๋ฉด ์๋ฆผ API์ ๋ํด
SCMP_FLTATR_API_SYSRAWRC
์ ๋ํด ์ด๋ ํ ์ฃผ์ฅ๋ ํ์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค(๋ฐ๋ ์๋seccomp_load(3)
์ฐธ์กฐ).์ฐ๋ฆฌ๋ ํ์ฌ ์ด ์์ ์ ๋ํด ์ด๋ ํ ์ฃผ์ฅ๋ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ RFE๋ก ๋ค์ ์ด๊ฒ ์ต๋๋ค.
@drakenclimber v2.5.1 ๋ฆด๋ฆฌ์ค๋ฅผ ๋ฆ์ถ๊ณ ์ถ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด v2.6.x(v2.5.2์ผ ์๋ ์์) ์๋ฃ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ค๋ฅธ ์๊ฐ์ด ๋ค๋ฉด ์ ์๊ฒ ์๋ ค์ฃผ์ญ์์ค.