Libseccomp: RFE: ๋” ์ •ํ™•ํ•˜๊ฒŒ ์ •์˜๋œ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ๊ฐ’

์— ๋งŒ๋“  2017๋…„ 10์›” 07์ผ  ยท  24์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: seccomp/libseccomp

์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ libseccomp ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋ณด๋ฉด ๋‹ค์Œ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์ด์œ ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  1. syscall์ด ์ผ๋ถ€ ์•„์น˜์— ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
  2. syscall์€ ์ผ๋ถ€ ์•„์น˜์—์„œ ์ผ์น˜๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋‹ค์ค‘ํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— socket/socketcall์„ ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค)
  3. ๊ธฐํƒ€ ์˜ค๋ฅ˜ ์‚ฌ๋ก€

seccomp ํ•„ํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ํ˜ธ์ถœ์ž๋Š” ์ด๋Ÿฌํ•œ ์ด์œ  ์ค‘ ์ผ๋ถ€๋ฅผ ์น˜๋ช…์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚˜๋จธ์ง€๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋” ์ž์„ธํ•œ ์˜ค๋ฅ˜ ์ •๋ณด(๋‹จ์ง€ -EINVAL ๋ณด๋‹ค ๋” ๋„“์€ ์˜ค๋ฅ˜ ๊ฐ’ ์„ธํŠธ)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

systemd PR 6952 ๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

enhancement prioritmedium

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

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜์ฏค ๊ตฌ์šด ํŒจ์น˜ ์„ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  ๊ฒ€ํ† ๋ฅผ ์œ„ํ•ด PR๋กœ ์ œ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@topimiettinen ๋‹˜ , ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ ธ์ง€๋งŒ ์ด์ œ ์ด ๋ฌธ์ œ๋ฅผ ๊ณ ์น  ๋•Œ๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@drakenclimber ์ด๊ฒƒ์€ ๋ฐ”๋ณด๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  libseccomp API์—๋Š” ์ด ์‹œ์ ์—์„œ ๋งจํŽ˜์ด์ง€๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ(ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ) ๋ชจ๋“  ๋งจํŽ˜์ด์ง€์—๋Š” RETURN VALUE ์„น์…˜์— ์†์œผ๋กœ ๋ฌผ๊ฒฐ ๋ชจ์–‘์˜ "์˜ค๋ฅ˜ ์‹œ ์Œ์ˆ˜ ๊ฐ’" ์ฃผ์„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐ€๋Šฅํ•œ ๋ฐ˜ํ™˜ ๊ฐ’ ๋ชฉ๋ก์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ API ํ˜ธ์ถœ์„ ์ˆ˜๋™์œผ๋กœ ๊ฐ์‚ฌ
  • ์ด๋Ÿฌํ•œ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒฐ์ •ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜ ์ฝ”๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๋‚ด์šฉ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ ๊ด€๋ จ ๋งจํŽ˜์ด์ง€์—์„œ ๊ฐ€๋Šฅํ•œ ๊ฐ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ƒ๊ฐ?

@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"๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฑฑ์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์œ ์‚ฌํ•œ ์ฝ”๋“œ ๊ฒฝ๋กœ ๋ฐ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ํ•จ์ˆ˜์˜ ๊ฐ€๋Šฅํ•œ ๊ทธ๋ฃนํ™”.

  • ๊ทธ๋ฃน A
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)
  • ๊ทธ๋ฃน B
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)
  • ๊ทธ๋ฃน C
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)
  • ๊ทธ๋ฃน D
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, ...)
  • ๊ทธ๋ฃน E
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)
  • ๊ทธ๋ฃน F
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๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ํ•˜์ง€๋งŒ ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • SCMP_ERROR_UNKNOWN_SYSCALL: ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด libseccomp์— ์˜ํ•ด ์•Œ๋ ค์ ธ ์žˆ์ง€ ์•Š์Œ: ํ˜ธ์ถœ์ž๋Š” ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ด๋ฆ„์˜ ์˜คํƒ€).
  • SCMP_ERROR_SYSCALL_NOT_FOR_THIS_ARCH: ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ libseccomp์— ์˜ํ•ด ์•Œ๋ ค์ ธ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž๋Š” ์ด ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•ด์„œ๋งŒ ์ด ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • SCMP_ERROR_API_USAGE: libseccomp๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑ๋œ ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ํ˜ธ์ถœ ๋…ผ๋ฆฌ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž๊ฐ€ assert()๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ
  • SCMP_ERROR_KERNEL_OTHER: libseccomp๋Š” ์ž…๋ ฅ๊ณผ ํ˜ธ์ถœ ์ˆœ์„œ์— ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์ง€๋งŒ ์ปค๋„์€ ENOMEM, EPERM, ENOSYS์™€ ๊ฐ™์ด ์ž˜ ์ •์˜๋œ ํŠน์ • ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž๋Š” ์กฐ์น˜๋ฅผ ์œ„ํ•ด errno๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. libseccomp๊ฐ€ ์˜ค๋ฅ˜์˜ ์›์ธ์ด ํ˜ธ์ถœ์ž์— ์˜ํ•œ ์˜ค๋ฅ˜(์˜ˆ: EFAULT)๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ง„ ๊ฒฝ์šฐ SCMP_ERROR_API_USAGE๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • SCMP_ERROR_KERNEL_API_USAGE: libseccomp๋Š” ์ž…๋ ฅ ๋“ฑ์œผ๋กœ ๊ดœ์ฐฎ์•˜์ง€๋งŒ ์ปค๋„์€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ณ  ๋ช…๋ฐฑํ•œ ์ด์œ ๋กœ ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ปค๋„ ๋ณ€๊ฒฝ, ๋น„ํ™œ์„ฑํ™”๋œ ๊ตฌ์„ฑ, libseccomp ๋˜๋Š” ํ˜ธ์ถœ์ž์˜ ๋ฒ„๊ทธ, ๋งค์šฐ ์ด์ƒํ•œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋“ฑ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž๋ฅผ ์œ„ํ•œ ์กฐ์น˜๋Š” ์ด๋ฒคํŠธ ๋ฐ ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๊ฐœ๋ฐœ์ž(ํ˜ธ์ถœ์ž ๋ฐ/๋˜๋Š” libseccomp)์—๊ฒŒ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋ผ๋Š” ์š”์ฒญ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋ถ„์„, assert() ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜๋Š” 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๋กœ ์ œ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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