์์คํ ํธ์ถ์ ๋ํ libseccomp ์ค๋ฅ ๋ฐํ ๊ฐ์ ๋ณด๋ฉด ๋ค์ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ด์ ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
seccomp ํํฐ๋ฅผ ๊ตฌ์ฑํ ๋ ํธ์ถ์๋ ์ด๋ฌํ ์ด์ ์ค ์ผ๋ถ๋ฅผ ์น๋ช
์ ์ด๋ผ๊ณ ์๊ฐํ ์ ์์ง๋ง ๋๋จธ์ง๋ ๊ณ ๋ คํ์ง ์์ ์ ์์ผ๋ฏ๋ก ๋ ์์ธํ ์ค๋ฅ ์ ๋ณด(๋จ์ง -EINVAL
๋ณด๋ค ๋ ๋์ ์ค๋ฅ ๊ฐ ์ธํธ)๊ฐ ํ์ํฉ๋๋ค.
systemd PR 6952 ๋ ์ฐธ์กฐํ์ญ์์ค.
@topimiettinen ๋ , ์ฃ์กํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋๋ฌด ์ค๋ ๊ฑธ๋ ธ์ง๋ง ์ด์ ์ด ๋ฌธ์ ๋ฅผ ๊ณ ์น ๋๊ฐ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@drakenclimber ์ด๊ฒ์ ๋ฐ๋ณด๊ฐ ๋ ๊ฒ์ ๋๋ค. ๋ชจ๋ libseccomp API์๋ ์ด ์์ ์์ ๋งจํ์ด์ง๊ฐ ์์ด์ผ ํ๋ฉฐ(ํ์ํ์ง ์์ ๊ฒฝ์ฐ ์ด์ ๋ํ ๋ฌธ์ ๋ฅผ ์์ฑํ ํ์๊ฐ ์์) ๋ชจ๋ ๋งจํ์ด์ง์๋ RETURN VALUE ์น์ ์ ์์ผ๋ก ๋ฌผ๊ฒฐ ๋ชจ์์ "์ค๋ฅ ์ ์์ ๊ฐ" ์ฃผ์์ด ์์ต๋๋ค. ๋ค์์ ์ํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๊ฐ?
@topimiettinen ๋ , ์ฃ์กํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋๋ฌด ์ค๋ ๊ฑธ๋ ธ์ง๋ง ์ด์ ์ด ๋ฌธ์ ๋ฅผ ๊ณ ์น ๋๊ฐ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@drakenclimber ์ด๊ฒ์ ๋ฐ๋ณด๊ฐ ๋ ๊ฒ์ ๋๋ค. ๋ชจ๋ libseccomp API์๋ ์ด ์์ ์์ ๋งจํ์ด์ง๊ฐ ์์ด์ผ ํ๋ฉฐ(ํ์ํ์ง ์์ ๊ฒฝ์ฐ ์ด์ ๋ํ ๋ฌธ์ ๋ฅผ ์์ฑํ ํ์๊ฐ ์์) ๋ชจ๋ ๋งจํ์ด์ง์๋ RETURN VALUE ์น์ ์ ์์ผ๋ก ๋ฌผ๊ฒฐ ๋ชจ์์ "์ค๋ฅ ์ ์์ ๊ฐ" ์ฃผ์์ด ์์ต๋๋ค. ๋ค์์ ์ํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
* manually audit each API call to generate a list of possible return values * decide if these return values make sense, modify the code if they don't * document each possible return value in the associated manpage with a brief explanation of what the error code indicates
์๊ฐ?
๋.... ์์์ ์ด ๋ชจ๋ ๊ฒ, ํนํ ํ์ํ ๋ ธ๋ ฅ์ ๋ง์ง๋ชปํด ๋์ํฉ๋๋ค. :). ๋ฐํ ์ฝ๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ป์ ๋ค์ ๋ฌธ์ํํ๋ ๊ฒ์ ์ ๋ง ํฐ ๋ ธ๋ ฅ์ด ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค, ํ๋ คํ ์์ ์ ์๋์ง๋ง ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ ์ผ๋ถ cgroup ๊ด๋ จ ์์ ์ ํ๊ณ ์์ผ๋ฉฐ ์ต๊ทผ์ cgroup ๊ธฐ๋ฅ์ ์์ ํ ์คํดํ๋ ์ปจํ ์ด๋ ๊ตฌํ์ ๋ฐ๊ฒฌํ์ต๋๋ค... ๊ทธ๋ฌ๋ ์ปค๋์ด๋ ๋ค๋ฅธ ๊ณณ์์ ์ ๋๋ก ๊ธธ์ ์๋ดํ ํ์คํ ๋ฌธ์๊ฐ ์์๊ธฐ ๋๋ฌธ์ ์ต์ ์ ๋คํด ์๋ํ๊ฒ ํ์ต๋๋ค. ๊ทธ๋ค์ ํ ์ ์์๋ค.
์ด ๋ฌธ์ ์ ๋ํ ํ๋์ ๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค! ์ฒ ์ ํ ๊ฒํ ๋ฅผ ๋ฐ๋ํ๋ ๊ฒ์ ์๋์ง๋ง ์๋ ์์ฒญ์ ์๋ก ๋ค๋ฅธ ์คํจ ๋ชจ๋๋ฅผ ๊ตฌ๋ณํ ์ ์๋๋ก ์ ํ๋์ด ์์๊ณ ์ด๋ ๋ค์ ์ง๊ตํ์ต๋๋ค. ๊ฒํ ๋ ํ์คํ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์ ์๊ฐ์ ์ด๋ ์ ๋ ์ ์ ์กฐ๊ฑด์ด ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ํ๋์ ๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค! ์ฒ ์ ํ ๊ฒํ ๋ฅผ ๋ฐ๋ํ๋ ๊ฒ์ ์๋์ง๋ง ์๋ ์์ฒญ์ ์๋ก ๋ค๋ฅธ ์คํจ ๋ชจ๋๋ฅผ ๊ตฌ๋ณํ ์ ์๋๋ก ์ ํ๋์ด ์์๊ณ ์ด๋ ๋ค์ ์ง๊ตํ์ต๋๋ค. ๊ฒํ ๋ ํ์คํ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์ ์๊ฐ์ ์ด๋ ์ ๋ ์ ์ ์กฐ๊ฑด์ด ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ ์์ ์์ ๊ฒํ ๋ฅผ ํด์ผ ํ๊ณ , ์ง๊ธ ๊ทธ๋ ๊ฒ ํ ์๋ ์์ต๋๋ค. ๋ณด๋ฅํ ์๋ก ์ค๋ฅ ์ฝ๋๋ ํธ์ถ์์๊ฒ ๋ ์ ์ฉํ๊ฒ ๋๊ณ libseccomp์ ์์ ์ ์ด ํญ๋ชฉ์ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค. :)
๋.... ์์์ ์ด ๋ชจ๋ ๊ฒ, ํนํ ํ์ํ ๋ ธ๋ ฅ์ ๋ง์ง๋ชปํด ๋์ํฉ๋๋ค. :). ๋ฐํ ์ฝ๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ป์ ๋ค์ ๋ฌธ์ํํ๋ ๊ฒ์ ์ ๋ง ํฐ ๋ ธ๋ ฅ์ด ๋ ๊ฒ์ ๋๋ค.
๋ค, ์ด๊ฒ์ด ์ด ๋ฌธ์ ๊ฐ ์ค๋ซ๋์ ๋ฏธ๋ค์จ ์ด์ ์ค ํ๋์ง๋ง ์ ๋ ์ถฉ๋ถํ ์ค๋ซ๋์ ๋ฏธ๋ฃจ๊ณ ์์ต๋๋ค(์ ์ด๋ @drakenclimber ๋ ๊ทธ๊ฐ 1๋ ๋ฏธ๋ง์ผ๋ก ๋ฏธ๋ฃจ๊ณ ์๋ค๊ณ ๋งํ ์ ์์ต๋๋ค!). ์ค๋ ๋์ค์(๋ด์ผ?) ๋๋ ์ด๊ฒ์ ๋ฉ์ด๋ฆฌ/๋ค์ค ๋ฌธ์ (๋ช ๊ฐ์ง ์ ์ ํฌํจ)๋ก ์ชผ๊ฐ์ด ์ข ๋ ์ฝ๊ฒ ์กฐ๊ฐ์ผ๋ก ๋ค๋ฃฐ ๊ฒ์ ๋๋ค.
์ฝ๊ฐ์ ๊ธ์ ์ ์ธ ์ ์ libseccomp๊ฐ ์ค์ ๋ก 9๊ฐ์ ๊ณ ์ ํ errno ๊ฐ๋ง ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค(๋งค์ฐ ์กฐ์กํ ๊ฒ์ฌ์ ๋ฐ๋ฅด๋ฉด).
# grep -e "-E[A-Z0-9]\+" src/*.{h,c} | sed 's/.*-\(E[A-Z0-9]\+\).*/\1/' | sort -u
EACCES
EDOM
EEXIST
EFAULT
EINVAL
ENOMEM
EOPNOTSUPP
EPERM
ESRCH
... ์ด๊ฒ์ ํนํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฒด์์ ๊ฐ ์ค๋ฅ ์ฝ๋์ ๋ํ ๊ณตํต ์๋ฏธ ๊ฐ์ ๋์ํ ์ ์๋ ๊ฒฝ์ฐ ๋ฌธ์ ๊ณต๊ฐ์ ์ฝ๊ฐ ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค(ํ์คํ ํด์ผ ํจ).
์ด๊ฒ์ ์๋ํ ๊ฒ๋ณด๋ค ์ฝ๊ฐ ๋ฆ์ง๋ง libseccomp API๋ฅผ ๊ตฌ์ฑํ๋ ์ ์ฒด ํจ์ ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const struct scmp_version *seccomp_version(void)
unsigned int seccomp_api_get(void)
int seccomp_api_set(unsigned int level)
scmp_filter_ctx seccomp_init(uint32_t def_action)
int seccomp_reset(scmp_filter_ctx ctx, uint32_t def_action)
void seccomp_release(scmp_filter_ctx ctx)
int seccomp_merge(scmp_filter_ctx ctx_dst, scmp_filter_ctx ctx_src)
uint32_t seccomp_arch_resolve_name(const char *arch_name)
uint32_t seccomp_arch_native(void)
int seccomp_arch_exist(const scmp_filter_ctx ctx, uint32_t arch_token)
int seccomp_arch_add(scmp_filter_ctx ctx, uint32_t arch_token)
int seccomp_arch_remove(scmp_filter_ctx ctx, uint32_t arch_token)
int seccomp_load(const scmp_filter_ctx ctx)
int seccomp_attr_get(const scmp_filter_ctx ctx, enum scmp_filter_attr attr, uint32_t *value)
int seccomp_attr_set(scmp_filter_ctx ctx, enum scmp_filter_attr attr, uint32_t value)
char *seccomp_syscall_resolve_num_arch(uint32_t arch_token, int num)
int seccomp_syscall_resolve_name_arch(uint32_t arch_token, const char *name)
int seccomp_syscall_resolve_name_rewrite(uint32_t arch_token, const char *name)
int seccomp_syscall_resolve_name(const char *name)
int seccomp_syscall_priority(scmp_filter_ctx ctx, int syscall, uint8_t priority)
int seccomp_rule_add_array(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, const struct scmp_arg_cmp *arg_array)
int seccomp_rule_add(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, ...)
int seccomp_rule_add_exact_array(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, const struct scmp_arg_cmp *arg_array)
int seccomp_rule_add_exact(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, ...)
int seccomp_notify_alloc(struct seccomp_notif **req, struct seccomp_notif_resp **resp)
void seccomp_notify_free(struct seccomp_notif *req, struct seccomp_notif_resp *resp)
int seccomp_notify_receive(int fd, struct seccomp_notif *req)
int seccomp_notify_respond(int fd, struct seccomp_notif_resp *resp)
int seccomp_notify_id_valid(int fd, uint64_t id)
int seccomp_notify_fd(const scmp_filter_ctx ctx)
int seccomp_export_pfc(const scmp_filter_ctx ctx, int fd)
int seccomp_export_bpf(const scmp_filter_ctx ctx, int fd)
... ์ด ํจ์๋ค ์ค์์ "int"๋ฅผ ๋ฐํํ๋ ํจ์์ ๋ํด์๋ง ๊ฑฑ์ ํ๋ฉด ๋ฉ๋๋ค.
์ ์ฌํ ์ฝ๋ ๊ฒฝ๋ก ๋ฐ ๋ฐํ ๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ ํจ์์ ๊ฐ๋ฅํ ๊ทธ๋ฃนํ.
int seccomp_arch_exist(const scmp_filter_ctx ctx, uint32_t arch_token)
int seccomp_arch_add(scmp_filter_ctx ctx, uint32_t arch_token)
int seccomp_arch_remove(scmp_filter_ctx ctx, uint32_t arch_token)
int seccomp_attr_get(const scmp_filter_ctx ctx, enum scmp_filter_attr attr, uint32_t *value)
int seccomp_attr_set(scmp_filter_ctx ctx, enum scmp_filter_attr attr, uint32_t value)
int seccomp_syscall_resolve_name_arch(uint32_t arch_token, const char *name)
int seccomp_syscall_resolve_name_rewrite(uint32_t arch_token, const char *name)
int seccomp_syscall_resolve_name(const char *name)
int seccomp_rule_add_array(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, const struct scmp_arg_cmp *arg_array)
int seccomp_rule_add(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, ...)
int seccomp_rule_add_exact_array(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, const struct scmp_arg_cmp *arg_array)
int seccomp_rule_add_exact(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt, ...)
int seccomp_notify_receive(int fd, struct seccomp_notif *req)
int seccomp_notify_respond(int fd, struct seccomp_notif_resp *resp)
int seccomp_notify_id_valid(int fd, uint64_t id)
int seccomp_notify_fd(const scmp_filter_ctx ctx)
int seccomp_load(const scmp_filter_ctx ctx)
int seccomp_export_bpf(const scmp_filter_ctx ctx, int fd)
... ํจ์๊ฐ ์์ ๊ทธ๋ฃน ์ค ํ๋์ ์์ผ๋ฉด ์ฝ๋ ๊ฒฝ๋ก ๋ฐ/๋๋ ๋ฐํ ๊ฐ์ด ๊ณ ์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฃน C๋ __NR_SCMP_ERROR๋ง ๋ฐํํฉ๋๋ค.
๊ทธ๋ฃน D๋ EINVAL, EPERM, EOPNOTSUPP, ENOMEM, EDOM, EFAULT, EEXIST ์ค ํ๋๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
seccomp_load()๋ EINVAL, ENOMEM, ESRCH ๋ฐ prctl()(PR_SET_NO_NEW_PRIVS ๋ฐ PR_SET_SECCOMP์ ๊ฒฝ์ฐ EACCES, EFAULT, EINVAL๋ง ํด๋น) ๋ฐ seccomp()(EACCES, EFAULT, EINVAL์ ๋ํ ๋งค๋ด์ผ), EINVAL์ ๋ํ EINVAL์ errno ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค. ํ์ด์ง.
libseccomp๊ฐ syscall ์ค๋ฅ๋ฅผ ํธ์ถ์์๊ฒ ๋ค์ ์ ๋ฌํ๋ ๊ฒฝ์ฐ(์: prctl() ๋ฐ seccomp(), libseccomp๊ฐ ์ํฅ์ ๋ฐ์ง ์๋๋ก ๋จ์ผ errno ๊ฐ(์๋ง๋ ENOSYS?) ๋ค์ ํด๋น ์ค๋ฅ๋ฅผ ์จ๊ฒจ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค ์ปค๋์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ(๋๋ ABI ์ฐจ์ด).
์ด๊ฒ์ด ๋๋ฒ๊น ์ ๋ฌธ์ ๊ฐ ๋๋ฉด errno ๊ฐ์ ํธ์ถ์์๊ฒ ์ง์ ๋ค์ ์ ๋ฌํ๋ ์๋ก์ด ์์ฑ์ ๋์ ํ ์ ์์ต๋๋ค.
๊ฐ๋ฅํ์ง๋ง libseccomp ์ฌ์ฉ์๊ฐ ์ด๋ฏธ ํน์ errno ๊ฐ์ ๊ธฐ๋ํ๊ณ ์๋ ๊ฒฝ์ฐ ABI/API ์์์ด ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋ ๋ฌธ์ ๋ ์ผ๋ถ ์์คํ
ํธ์ถ์ด ์ผ๋ถ ์ํคํ
์ฒ(์ ugetrlimit
x86_32์๋ง ์์)์๋ง ์กด์ฌํ์ง๋ง ์ด๊ฒ์ด ์๋ชป ์
๋ ฅ๋ ์์คํ
ํธ์ถ ์ด๋ฆ๊ณผ ๊ตฌ๋ณํ ์ ์์ผ๋ฏ๋ก ๋ค๋ฅธ(์๋ง๋ ํฉ์ฑ) ์ค๋ฅ ์ฝ๋๊ฐ ํ์ํ๋ค๋ ๊ฒ์
๋๋ค. .
๊ธ์, ์ฐ๋ฆฌ๊ฐ ์ด์ ์ ๋งํ๋ฏ์ด, ์ฐ๋ฆฌ๋ ํ์ฌ ํน์ errno ๊ฐ์ ์ค์ ๋ก ๋ณด์ฅํ์ง ์๊ณ "์คํจ ์ ์์ ๊ฐ"๋ง ๋ณด์ฅํ๋ฏ๋ก ํ์ฌ ํน์ errno ๊ฐ์ ๋ํด ๊ฐ์ ํ๊ณ ์๋ ์ฌ์ฉ์๋ฅผ ๊นจ๋ ๊ฒ์ ๋ถํํ ์ผ์ด์ง๋ง ๋๋ ์ํฉ์ ๋ณ๊ฒฝํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํฅํ ์ปค๋ ๋ฒ์ ๊ณผ ABI ์ ๋ฐ์ ๊ฑธ์ณ ๊ฐ๋ ฅํ errno ๋ณด์ฅ์ ์ ๊ณตํ๋ ๊ฒ์ ๊ฐ์น ์๋ ์ ์ถฉ์์ ๋๋ค.
๊ธ์, ์ฐ๋ฆฌ๊ฐ ์ด์ ์ ๋งํ๋ฏ์ด, ์ฐ๋ฆฌ๋ ํ์ฌ ํน์ errno ๊ฐ์ ์ค์ ๋ก ๋ณด์ฅํ์ง ์๊ณ "์คํจ ์ ์์ ๊ฐ"๋ง ๋ณด์ฅํ๋ฏ๋ก ํ์ฌ ํน์ errno ๊ฐ์ ๋ํด ๊ฐ์ ํ๊ณ ์๋ ์ฌ์ฉ์๋ฅผ ๊นจ๋ ๊ฒ์ ๋ถํํ ์ผ์ด์ง๋ง ๋๋ ์ํฉ์ ๋ณ๊ฒฝํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํฅํ ์ปค๋ ๋ฒ์ ๊ณผ ABI ์ ๋ฐ์ ๊ฑธ์ณ ๊ฐ๋ ฅํ errno ๋ณด์ฅ์ ์ ๊ณตํ๋ ๊ฒ์ ๊ฐ์น ์๋ ์ ์ถฉ์์ ๋๋ค.
๋์ํ๋ค.
์ด ํ๊ฐ๊ฐ ์๋ฃ๋๊ณ ์คํจ ์ errno ๊ฐ์ ์ ๋ฐ์ดํธํ๋ฉด ๋ฐํ๋ errno ๊ฐ์ ๋ํ ์ผ์ข ์ ๋ณด์ฆ์ ๋ง๋๋ ๊ฒ์ด ๋ ํธํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฃนํ ์์ด๋์ด๊ฐ ์ต์ ์ด ์๋ ์ ์์ผ๋ฏ๋ก ์ด ๋ชจ๋ ๊ฒ์ ์ถ์ ํ๊ธฐ ์ํด ๋ชฉ๋ก์ ์์ํ๊ฒ ์ต๋๋ค _(์งํํ๋ฉด์ ๊ณ์ ์ ๋ฐ์ดํธํ๊ฒ ์ต๋๋ค)_:
[x] seccomp_reset
ํ์ฌ ๋ฐํ: EINVAL, ENOMEM.
[x] seccomp_merge
ํ์ฌ ๋ฐํ๋๋ ํญ๋ชฉ: EINVAL, EDOM, EEXIST, ENOMEM.
[x] seccomp_arch_exist
ํ์ฌ ๋ฐํ: EINVAL, EEXIST.
[x] seccomp_arch_add
ํ์ฌ ๋ฐํ: EINVAL, EEXIST, ENOMEM, EDOM.
[x] seccomp_arch_remove
ํ์ฌ ๋ฐํ: EINVAL, EEXIST.
[x] seccomp_load
ํ์ฌ ๋ฐํ๋๋ ํญ๋ชฉ: EINVAL, ENOMEM, ESRCH, ECANCELED.
[x] seccomp_attr_get
ํ์ฌ ๋ฐํ: EINVAL, EEXIST.
[x] seccomp_attr_set
ํ์ฌ ๋ฐํ: EINVAL, EACCES, EOPNOTSUPP, EEXIST.
[x] seccomp_syscall_resolve_name_arch
์ด๋ฏธ ์ ์ ์๋์ด ์์ผ๋ฉฐ ์คํจ ์ ์์คํ
ํธ์ถ ๊ฐ ๋๋ __NR_SCMP_ERROR๋ฅผ ๋ฐํํฉ๋๋ค.
[x] seccomp_syscall_resolve_name_rewrite
์ด๋ฏธ ์ ์ ์๋์ด ์์ผ๋ฉฐ ์คํจ ์ ์์คํ
ํธ์ถ ๊ฐ ๋๋ __NR_SCMP_ERROR๋ฅผ ๋ฐํํฉ๋๋ค.
[x] seccomp_syscall_resolve_name
์ด๋ฏธ ์ ์ ์๋์ด ์์ผ๋ฉฐ ์คํจ ์ ์์คํ
ํธ์ถ ๊ฐ ๋๋ __NR_SCMP_ERROR๋ฅผ ๋ฐํํฉ๋๋ค.
[x] seccomp_syscall_priority
ํ์ฌ ๋ฐํ: EINVAL, EDOM, EFAULT, ENOMEM.
[x] seccomp_rule_add_array
ํ์ฌ ๋ฐํ๋๋ ํญ๋ชฉ: EINVAL, EOPNOTSUPP, ENOMEM, EDOM, EFAULT, EEXIST.
[x] seccomp_rule_add
ํ์ฌ ๋ฐํ๋๋ ํญ๋ชฉ: EINVAL, EOPNOTSUPP, ENOMEM, EDOM, EFAULT, EEXIST.
[x] seccomp_rule_add_exact_array
ํ์ฌ ๋ฐํ๋๋ ํญ๋ชฉ: EINVAL, EOPNOTSUPP, ENOMEM, EDOM, EFAULT, EEXIST.
[x] seccomp_rule_add_exact
ํ์ฌ ๋ฐํ๋๋ ํญ๋ชฉ: EINVAL, EOPNOTSUPP, ENOMEM, EDOM, EFAULT, EEXIST.
[x] seccomp_notify_alloc
ํ์ฌ ๋ฐํ๋๋ ํญ๋ชฉ: EOPNOTSUPP, ENOMEM, EFAULT, ECANCELED. ๋งจํ์ด์ง๋ ์ด๋ฏธ ์ค๋ฅ ๋ฐ์ ์ -1์ ์ง์ ํ๊ณ ์์ผ๋ฉฐ ์ด๋ seccomp() errno๋ง ์ฐธ์กฐํ ์ ์์ต๋๋ค.
[x] seccomp_notify_receive
ํ์ฌ ๋ฐํ๋๋ ํญ๋ชฉ: EOPNOTSUPP ๋ฐ ECANCELED. ๋งจํ์ด์ง๋ ์ด๋ฏธ ์ค๋ฅ ๋ฐ์ ์ -1์ ์ง์ ํ๊ณ ์์ผ๋ฉฐ ์ด๋ seccomp() errno๋ง ์ฐธ์กฐํ ์ ์์ต๋๋ค.
[x] seccomp_notify_respond
ํ์ฌ ๋ฐํ๋๋ ํญ๋ชฉ: EOPNOTSUPP ๋ฐ ECANCELED. ๋งจํ์ด์ง๋ ์ด๋ฏธ ์ค๋ฅ ๋ฐ์ ์ -1์ ์ง์ ํ๊ณ ์์ผ๋ฉฐ ์ด๋ seccomp() errno๋ง ์ฐธ์กฐํ ์ ์์ต๋๋ค.
[x] seccomp_notify_id_valid
ํ์ฌ ๋ฐํ๋๋ ํญ๋ชฉ: EOPNOTSUPP ๋ฐ ECANCELED. ๋งจํ์ด์ง๋ ์ด๋ฏธ seccomp() errno๋ง ์ฐธ์กฐํ๋ ์ค๋ฅ(์๋ชป๋ ID) ์ -ENOENT๋ฅผ ์ง์ ํฉ๋๋ค.
[x] seccomp_notify_fd
์ด๋ฏธ ์ ์ ์๋์ด ์์ผ๋ฉฐ ์๋ฆผ fd๋ฅผ ๋ฐํํฉ๋๋ค.
[x] seccomp_export_pfc
ํ์ฌ ๋ฐํ: EINVAL ๋ฐ ECANCELED.
[x] seccomp_export_bpf
ํ์ฌ ๋ฐํ๋๋ ํญ๋ชฉ: EINVAL, ENOMEM ๋ฐ ECANCELED.
์ด์ ์ฐ๋ฆฌ๋ ์ด๋ค ํจ์๊ฐ ์ด๋ค ์ค๋ฅ ์ฝ๋๋ฅผ ๋ฐํํ๋์ง์ ๋ํ ๋ชฉ๋ก์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ํนํ ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ์ค๋ฅ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ์๋นํ ์ผ์นํ๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํด ์กฐ๊ธ ๋ ๊ธฐ๋ถ์ด ์ข์ต๋๋ค. ๋ง์ง๋ง ๋นํธ๊ฐ ํฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
์์ ์ฌํญ์ ์์งํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ํผ๋๋ฐฑ์ ์์งํ ์ ์๋๋ก PR์ ์์ํ๊ฒ ์ต๋๋ค. ๊ณง ์ฌ๊ธฐ์ ๊ฒ์ํ๊ฒ ์ต๋๋ค.
ENOSYS์ ๋ค์ "ํน๋ณํ" ํน์ฑ์ ๊ฐ์ํ ๋ errno๋ฅผ ์ปค๋/libc catch-all๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ์ ๋ณดํ๊ณ ์์ต๋๋ค. ๋ค๋ฅธ ๊ฐ์ ์ดํด๋ด์ผ ํฉ๋๋ค. ์ด์ ๋ํด ๊ฐํ ๋๋/์๊ฐ์ด ์๋ ์ฌ๋์ด ์์ต๋๊น?
์์ง ๋ง์ด ๋น ์ ธ์๊ณ ๋๋ถ๋ถ ๋งจํ์ด์ง ํธ์ง๊ณผ ์ฝ๋ ์ฃผ์(ํ ์คํธ๋ ๋งํ ๊ฒ๋ ์์)์ด ์์ง๋ง ๋ค์ ๋ถ๊ธฐ๋ฅผ ๋ณด๋ฉด ์ ๊ฐ ์๊ฐํ๋ ๋ฐ๋ฅผ ์ ์ ์์ต๋๋ค.
ENOSYS์ ๋ค์ "ํน๋ณํ" ํน์ฑ์ ๊ฐ์ํ ๋ errno๋ฅผ ์ปค๋/libc catch-all๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ์ ๋ณดํ๊ณ ์์ต๋๋ค. ๋ค๋ฅธ ๊ฐ์ ์ดํด๋ด์ผ ํฉ๋๋ค. ์ด์ ๋ํด ๊ฐํ ๋๋/์๊ฐ์ด ์๋ ์ฌ๋์ด ์์ต๋๊น?
EIO๋ ์ด๋ป์ต๋๊น?
EIO๋ ์ด๋ป์ต๋๊น?
๊ทธ๊ฒ์ด ์ค๋ฅ๋ฅผ ํจ์ฌ ๋ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋์ errno ๊ฐ์ ์ฌ์ฉํ์ง ์๋ ํจ์๋ก API๋ฅผ ํ์ฅํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ํ์ง๋ง ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋๋ errno๊ฐ ์๋ API๋ ๊ทธ๋๋ก ์ ์ง๋ ์ ์์ง๋ง ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ค๋ฅ ์ฝ๋๋ฅผ ์์ฒญํ ์ ์์ต๋๋ค.
์๋ง๋ @poettering ๋๋ @keszybz ๋ ๋๊ธ์ ๋ฌ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ด ์ค๋ฅ๋ฅผ ํจ์ฌ ๋ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋์ errno ๊ฐ์ ์ฌ์ฉํ์ง ์๋ ํจ์๋ก API๋ฅผ ํ์ฅํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
๊ธ์, ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ฐ ์ผ์ ํ๋ ๊ฒ์ ๊ณ ๋ คํ๊ธฐ ์ ์(๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ ๊ฒ ํ๊ณ ์ถ์์ง ํ์ ์ด ์์ง ์๋๋ค) ์ฐ๋ฆฌ๋ ์์ ์ ์ด๊ณ ์ง์๋๋ ๋ฐํ ์ฝ๋์ ์ ์ฐฉํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ์์ ํ๊ณ v2.5์์ ๋ชฉํ๋ก ํ๋ ๊ฒ์ ๋๋ค.
v2.5์์ ์์ ์ /์ง์๋๋ ๋ฐํ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ด๋ป๊ฒ ์งํ๋๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์ถ๊ฐ ์์ ์ด ํ์ํ ๊ฒฝ์ฐ v2.6์ ๋ํด ๊ณ ๋ คํ ์ ์์ต๋๋ค.
EIO๋ ์ด๋ป์ต๋๊น?
๋ค๋ฅธ ์์ ์ฐ์ ์์์ ์ผ๋ถ ์ปค๋ ๋ฌธ์ ๋ก ์ธํด ์ ์ ์ด ์์ ์ ์ค๋จํ์ง๋ง ์ด์ libseccomp๋ก ๋์์์ ์ฌ๊ธฐ์ EIO๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ชป๋ ๊ฒ ๊ฐ๋ค๋ ๊ฒ์ ๊นจ๋ซ๊ณ ์์ต๋๋ค. ์ด์ ๋ํด ์กฐ๊ธ ๋ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
ํฌ๊ด์ ์ธ ์ปค๋ ์ค๋ฅ ์ฝ๋์ธ ECANCELED๋ ์ด๋ป์ต๋๊น?
@drakenclimber ์ด๋ป๊ฒ ์๊ฐํ์๋์ง ๊ถ๊ธํฉ๋๋ค.
๋ค๋ฅธ ์์ ์ฐ์ ์์์ ์ผ๋ถ ์ปค๋ ๋ฌธ์ ๋ก ์ธํด ์ ์ ์ด ์์ ์ ์ค๋จํ์ง๋ง ์ด์ libseccomp๋ก ๋์์์ ์ฌ๊ธฐ์ EIO๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ชป๋ ๊ฒ ๊ฐ๋ค๋ ๊ฒ์ ๊นจ๋ซ๊ณ ์์ต๋๋ค. ์ด์ ๋ํด ์กฐ๊ธ ๋ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์ต๊ทผ์ ์ํฉ์ด ์กฐ๊ธ ๋ฐ๋นด์ต๋๋ค./.
@drakenclimber ์ด๋ป๊ฒ ์๊ฐํ์๋์ง ๊ถ๊ธํฉ๋๋ค.
ํ์ ํ๋. ์ ์ฒด ์ค๋ ๋๋ฅผ ๋ค์ ์ฝ๊ณ ์ถ์ต๋๋ค.
ํฌ๊ด์ ์ธ ์ปค๋ ์ค๋ฅ ์ฝ๋์ธ ECANCELED๋ ์ด๋ป์ต๋๊น?
๋๋ ECANCELED์ ๋ํด ๋ณ๋ก ์ต์ํ์ง ์๋ค๋ ๊ฒ์ ์ธ์ ํฉ๋๋ค. ์ปค๋ ์์ค์์ ์ฌ์ฉ๋ฒ์ ๊ฐ๋จํ ์ดํด๋ณด๊ณ ๊ตฌ๊ธ ๊ฒ์๋ ํ์ต๋๋ค. ECANCELED๋ ์ด์ libseccomp, prctl() ๋๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๋ค๋ฅธ API์ ์ถฉ๋์ด ์์ผ๋ฉฐ ์ปค๋์ด ์ฐ๋ฆฌ์๊ฒ ๋์ง๋ ๋ชจ๋ ์ค๋ฅ๋ฅผ ํฉ๋ฆฌ์ ์ผ๋ก ์บก์ํํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
tl;dr - ์ปค๋ ์ค๋ฅ์ ๋ํ ํฌ๊ด์ ์ธ ์๋ฃจ์ ์ผ๋ก ECANCELED๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค. ๋ฐ์ฏค ๊ตฌ์ด ํจ์น ์ธํธ๊ฐ ์์ต๋๋ค. ๋ง๋ฌด๋ฆฌํ๊ณ ๊ฒํ ๋ฅผ ์ํด PR๋ก ์ ์ถํ ๊ฒ์ ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ฐ์ฌํฉ๋๋ค. ๋ฐ์ฏค ๊ตฌ์ด ํจ์น ์ธํธ๊ฐ ์์ต๋๋ค. ๋ง๋ฌด๋ฆฌํ๊ณ ๊ฒํ ๋ฅผ ์ํด PR๋ก ์ ์ถํ ๊ฒ์ ๋๋ค.