์๋ !
SCMP_CMP_GT/GE/LT/LE์ ํ์ฌ ๋์์ด ์๋ํ ๋๋ก ์๋ํ๋์ง ๋๋ ๊ตฌํ์ ๋ฒ๊ทธ๊ฐ ์๋์ง ํ์คํ์ง ์์ต๋๋ค. seccomp_rule_add
๋ํ ๋งค๋ด์ผ ํ์ด์ง์๋ SCMP_CMP_GT์ ๋ํด ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ๋ง ์์ต๋๋ค.
SCMP_CMP_GT:
Matches when the argument value is greater than the datum value,
example:
SCMP_CMP( arg , SCMP_CMP_GT , datum )
๋งค๋ด์ผ ํ์ด์ง๋ datum์ ์ ํ์ ์ง์ ํ์ง ์์ผ๋ฉฐ ๋ค์ํ(์์์ ) ์ ํ(๋ฐ scmp_datum_t์ ๋ํ ํ๋์ ์บ์คํธ)์ ๋ํ ์์ ๊ฐ ์์ต๋๋ค.
๋งค๋ด์ผ ํ์ด์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก setpriority์ ์ธ ๋ฒ์งธ ์ธ์์ ์ง์ ๋ ๊ฐ์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ์๋ํ ๊ฒ์ผ๋ก ์์ํ์ต๋๋ค(์ด์ ๋ํด SCMP_ACT_ALLOW์ ๊ธฐ๋ณธ ์ ์ฑ ์ ๊ฐ์ ).
rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM),
SCMP_SYS(setpriority),
3,
SCMP_A0(SCMP_CMP_EQ, PRIO_PROCESS),
SCMP_A1(SCMP_CMP_EQ, 0),
SCMP_A2(SCMP_CMP_GT, 0));
๋์ setpriority(PRIO_PROCESS, 0, -1)
๋ '-1'์ด ๋ถ๋ช
ํ '0'๋ณด๋ค ์์ ๋ ์ฐจ๋จ๋๋ ์์คํ
ํธ์ถ์ ์ด๋ํฉ๋๋ค. setpriority(PRIO_PROCESS, 0, 0)
๋ฐ setpriority(PRIO_PROCESS, 0, 1)
๋ ์์๋๋ก ์๋ํฉ๋๋ค. ์ผ์ด๋๊ณ ์๋ ์ผ์ '-1'์ด scmp_datum_t(secomp.h.in์ uint64_t)๋ก ๋ณํ๋์ด ๋น์ฐํ ๊ธ์ ์ ์ด์ง๋ง SCMP_CMP_GT์ ์น๊ตฌ๋ค์ ์ด ๋ณํ์ ์ฒ๋ฆฌํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. SCMP_CMP_EQ๋ ์์ ๋ฐ์ดํ
์ผ๋ก ์ ์๋ํฉ๋๋ค(๋ฐ์ดํ
์ด ์ฌ์ ํ ์์๋ผ๊ณ ๊ฐ์ ํ์ง๋ง(ํ์ธํ์ง ์์). ๊ทธ๋ฌ๋ ๋น๊ต๋ ๋ณํ๋ scmp_datum_t ์ฌ์ด์
๋๋ค).
์ด ๋์์ 2.1.0+dfsg-1(Ubuntu 14.04 LTS, 3.13 ์ปค๋), 2.2.3-3ubuntu3(Ubuntu 16.04 LTS, 4.9 ์ปค๋), 2.3.1-2ubuntu2(Ubuntu 17.049dev ๋ฆด๋ฆฌ์ค)์์ ํ์ธ๋์์ต๋๋ค. ๋ช ๋ถ ์ ์ ๋ง์คํฐ(Ubuntu 17.04 dev ๋ฆด๋ฆฌ์ค, 4.9 ์ปค๋), ๋ชจ๋ amd64์ ์์ต๋๋ค.
AFAICT, SCMP_CMP_GT ๋ฐ SCMP_CMP_LE์ ๋ํ ํ ์คํธ๊ฐ ์์ต๋๋ค. SCMP_CMP_LT์ ๋ํ ๋ช ๊ฐ์ง ํ ์คํธ๋ ์์ ๊ฐ์ ์ค๋ช ํ์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ SCMP_CMP_GE์ ๋ํ ํ ์คํธ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ด ํ๋์ด ์๋์ ์ ๋๊น? ๊ทธ๋ ๋ค๋ฉด scmp_datum_t๊ฐ ๋ฐ์ดํฐ ์ ํ์ด๋ผ๋ ๊ฒ์ ์ดํดํ ๋ ์ด๊ฒ์ด ์๋ฒฝํ๊ฒ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๊ธฐ ๋๋ฌธ์ ๋งค๋ด์ผ ํ์ด์ง๊ฐ ์ ํํ๋ค๊ณ ์ฃผ์ฅํ ์ ์์์ ์ธ์ ํ์ง๋ง ์ด ์ํฉ์ ์ฆ์ ๋ช ํํ์ง ์์ผ๋ฉฐ ๋งค๋ด์ผ ํ์ด์ง๋ ์๋ง๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ค์์ ์ค๋ช ํด์ผ ํ๋ค๊ณ ๋งํด์ผ ํ ๊ฒ์ ๋๋ค. ์ด๊ฒ. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด๊ฒ์ SCMP_CMP_GT/GE/LT/LE์ ๋ํ ๊ตฌํ์ ๋ฒ๊ทธ๋ก ๋ณด์ ๋๋ค.
๋ค์์ GE, LT ๋ฐ LE๊ฐ ๋ชจ๋ ๋์ผํ ๋์์ ๊ฐ๋ ๊ฒ์ผ๋ก ๊ด์ฐฐ๋ ์ ์์ง๋ง SCMP_CMP_GT์์ ์ด ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์์ ํ๋ก๊ทธ๋จ์ ๋๋ค.
/*
* gcc -o test-nice test-nice.c -lseccomp
* sudo ./test-nice 0 1 # should be denied
* sudo ./test-nice 0 0 # should be allowed
* sudo ./test-nice 0 -1 # should be allowed?
*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>
#include <fcntl.h>
#include <stdarg.h>
#include <seccomp.h>
#include <sys/resource.h>
int main(int argc, char **argv)
{
if (argc < 3) {
fprintf(stderr, "test-nice N N\n");
return 1;
}
int rc = 0;
scmp_filter_ctx ctx = NULL;
int filter_n = atoi(argv[1]);
int n = atoi(argv[2]);
// Allow everything by default for this test
ctx = seccomp_init(SCMP_ACT_ALLOW);
if (ctx == NULL)
return ENOMEM;
printf("set EPERM for nice(>%d)\n", filter_n);
rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM),
SCMP_SYS(setpriority),
3,
SCMP_A0(SCMP_CMP_EQ, PRIO_PROCESS),
SCMP_A1(SCMP_CMP_EQ, 0),
SCMP_A2(SCMP_CMP_GT, filter_n));
if (rc != 0) {
perror("seccomp_rule_add failed");
goto out;
}
rc = seccomp_load(ctx);
if (rc != 0) {
perror("seccomp_load failed");
goto out;
}
// try to use the filtered syscall
errno = 0;
printf("Attempting nice(%d)\n", n);
nice(n);
if (errno != 0) {
perror("could not nice");
if (filter_n > n)
fprintf(stderr, "nice(%d) unsuccessful. bug?\n", n);
rc = 1;
goto out;
} else
printf("nice(%d) successful\n", n);
out:
seccomp_release(ctx);
return rc;
}
๋ฌธ์ ๋ณด๊ณ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทธ๊ฑฐ ์ข๋ค.
ํน์ ์ปค๋์ samples/seccomp ๋๋ ํ ๋ฆฌ์ ์๋ headers/macros๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์์ฐ๊ธฐ๋ฅผ ์์ฑํด
์ปค๋์ BPF ์ฝ๋๊ฐ ์ฆ๊ฐ์ ์ธ ๊ฐ์ ์๋ช ๋ ๊ฒ์ผ๋ก ์ทจ๊ธํ๋ค๋ ์ธ์์ ๋ฐ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ ์๋ ์๊ณ libseccomp ์ฝ๋์์ ๋ญ๊ฐ๋ฅผ ๋ง์ณค์ ์๋ ์์ต๋๋ค.
FWIW, BPF ์์ฒด๋ ์ธ์์ u32๋ฅผ ์ฌ์ฉํฉ๋๋ค. libseccomp๋ compat ์ธ์์ ๋ํด ๋ถํธ ํ์ฅ์ ์ํํฉ๋๊น? (๊ทธ๋ด ์๋ ์์ง๋ง "-1"์ ์ผ์น์ํค๋ ๊ท์น์ 32๋นํธ์ 64๋นํธ ์ฌ์ด์์ ๋ฌ๋ผ์ผ ํฉ๋๋ค...)
์ง๊ธ ๋๋ฅผ ๊ฑฑ์ ์ํค๋ ๋ฌธ์ ๋ ์ ํ ์ฐ์ฐ์์ BPF GT/GE ๋น๊ต์ ๋๋ค. ํนํ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ์ด๋ฌํ ๋น๊ต์ ๋ํด BPF ์ฆ์๊ฐ์ ๋ถํธ ์๋ ๊ฐ์ผ๋ก ์ทจ๊ธํ๊ณ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
@kees ์ปค๋์ seccomp-bpf ์์คํ ๊ณผ syscall ์ธ์์ ์๋ช ๋ ๋น๊ต๋ฅผ ์ํํ๋ ๋ฐ ๊ถ์ฅ๋๋ ์ ๊ทผ ๋ฐฉ์์ ๋ฌด์์ ๋๊น? ๋๋ ๊ทธ๊ฒ์ด "๋์ ๋นํธ๋ฅผ ๋จผ์ ํ์ธํ ๋ค์ ์์๋ฅผ ๋น๊ตํ๊ธฐ ์ ์ ํ์ํ 2์ ์นญ์ฐฌ ๋ณํ์ ์ํํ์ญ์์ค"๋ผ๋ ๋ผ์ธ์ ๋ฐ๋ผ ๋ฌด์ธ๊ฐ๊ฐ ์๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ฑ๊ฐ์์ง๋ง ํ์ํ BPF๋ฅผ ์์ฑํ๋๋ก libseccomp๋ฅผ ๋ณ๊ฒฝํ ์ ์์ง๋ง(์ผ๋ถ ๊ฒฝ์ฐ์๋ ์์ฑ๋ ํํฐ๊ฐ ํจ์ฌ ๋ ์ปค์ง ์ ์์) ์์ฒด BPF ํํฐ๋ฅผ ์์ฑํ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํด ๊ฑฑ์ ํฉ๋๋ค. ๊ทธ๋ค์ด ์ด๊ฒ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ ํ๋ฅ ์ ์๋ง๋ ๊ทธ๋ฆฌ ์ข์ง ์์ ๊ฒ์ ๋๋ค.
๋ถํํ๋ syscall ์ธ์๋ "unsigned long"์ด๊ธฐ ๋๋ฌธ์(syscall_get_arguments() ๋ฐ struct seccomp_data ์ฐธ์กฐ) syscall์ด ๋ถํธ ๋ณํ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. compat ์ฅ๋ฒฝ์ ๋์ ๋ ์ผ๋ถ ์์คํ ํธ์ถ์ ๋ถํธ ํ์ฅ์ ์ํํ๊ณ ๋ค๋ฅธ ์์คํ (prctl)์ ์ํํ์ง ์์ต๋๋ค. ๋ง์ด๋์ค๊ฐ ์๋ ๋ง์ด๋์ค 1 ์์คํ ํธ์ถ ์ธ์๊ฐ ๋ง์ด ์์ต๋๊น?
์ค๋ ์ด๊ฒ์ผ๋ก ๋์๊ฐ์ ์ค๋ ์์นจ์ ์กฐ๊ธ ๋ ๋๊ณ ๋๋ฉด ์ด๊ฒ์ด ๋ฌธ์ํ/"์กฐ์ฌํ์ธ์!"๋ก ๋๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํนํ ๊ธฐ์กด ์ฌ์ฉ์์ ๋ํด ์ด์ผ๊ธฐํ ๋ ์ข์ ์๋ฃจ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ปค๋ ์ธก์์ @kees ์ ์ ์ฉํ ์ค๋ช ๊ณผ ํจ๊ป
FWIW, BPF ์์ฒด๋ ์ธ์์ u32๋ฅผ ์ฌ์ฉํฉ๋๋ค. libseccomp๋ compat ์ธ์์ ๋ํด ๋ถํธ ํ์ฅ์ ์ํํฉ๋๊น? (์๋ง ๊ทธ๋ ๊ฒ ํด์๋ ์๋์ง๋ง "-1"๊ณผ ์ผ์นํ๋ ๊ท์น์ 32[-๋นํธ์ 64๋นํธ ์ฌ์ด์์ ๋ฌ๋ผ์ผ ํฉ๋๋ค...)
libseccomp API ๊ท์น ํจ์๋ ๋ชจ๋ ์ฆ๊ฐ์ ์ธ ๊ฐ์ _uint64_t_๋ก ํด์ํ๋ฏ๋ก ์ ํ/์บ์คํ ์ ๋ถ์ฃผ์ํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์:
$ cat 00-test.c
/* ... */
seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1000, 1,
SCMP_A0(SCMP_CMP_GT, -1));
seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1001, 1,
SCMP_A0(SCMP_CMP_GT, (uint32_t)-1));
seccomp_rule_add_exact(ctx, SCMP_ACT_KILL, 1002, 1,
SCMP_A0(SCMP_CMP_GT, 0xffffffff));
/* ... */
$ make 00-test
CC 00-test.o
CCLD 00-test
$ ./00-test -p
#
# pseudo filter code start
#
# filter for arch x86_64 (3221225534)
if ($arch == 3221225534)
# filter for syscall "UNKNOWN" (1002) [priority: 65533]
if ($syscall == 1002)
if ($a0.hi32 >= 0)
if ($a0.lo32 > 4294967295)
action KILL;
# filter for syscall "UNKNOWN" (1001) [priority: 65533]
if ($syscall == 1001)
if ($a0.hi32 >= 0)
if ($a0.lo32 > 4294967295)
action KILL;
# filter for syscall "UNKNOWN" (1000) [priority: 65533]
if ($syscall == 1000)
if ($a0.hi32 >= 4294967295)
if ($a0.lo32 > 4294967295)
action KILL;
# default action
action ALLOW;
# invalid architecture action
action KILL;
#
# pseudo filter code end
#
$ ./00-test -b | ../tools/scmp_bpf_disasm
line OP JT JF K
=================================
0000: 0x20 0x00 0x00 0x00000004 ld $data[4]
0001: 0x15 0x00 0x0c 0xc000003e jeq 3221225534 true:0002 false:0014
0002: 0x20 0x00 0x00 0x00000000 ld $data[0]
0003: 0x35 0x0a 0x00 0x40000000 jge 1073741824 true:0014 false:0004
0004: 0x15 0x00 0x02 0x000003e8 jeq 1000 true:0005 false:0007
0005: 0x20 0x00 0x00 0x00000014 ld $data[20]
0006: 0x35 0x04 0x06 0xffffffff jge 4294967295 true:0011 false:0013
0007: 0x15 0x01 0x00 0x000003e9 jeq 1001 true:0009 false:0008
0008: 0x15 0x00 0x04 0x000003ea jeq 1002 true:0009 false:0013
0009: 0x20 0x00 0x00 0x00000014 ld $data[20]
0010: 0x35 0x00 0x02 0x00000000 jge 0 true:0011 false:0013
0011: 0x20 0x00 0x00 0x00000010 ld $data[16]
0012: 0x25 0x01 0x00 0xffffffff jgt 4294967295 true:0014 false:0013
0013: 0x06 0x00 0x00 0x7fff0000 ret ALLOW
0014: 0x06 0x00 0x00 0x00000000 ret KILL
... ์ฐ๋ฆฌ๊ฐ ๋ณผ ์ ์๋ฏ์ด ์ ์ ํ ์บ์คํ ์ ์ฌ์ฉํ๋ฉด ๊ฐ์ด ๋ถํธ ํ์ฅ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ด๊ฒ์ด ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ํ๋ ์ผ์ด ์๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์ข์ ์์์ ๋ถ์ ์ ์ธ ์ธ์๋ฅผ ์ทจํ๋ ์์คํ ํธ์ถ์ ์๊ฐ ์๋์ ์ผ๋ก ์ ๊ธฐ ๋๋ฌธ์ ์ํฅ์ด ๋ค์ ์ ํ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค๋ ๊ฒ์ ๋๋ค.
์์ผ๋ก ์ฐ๋ฆฌ๋ ํ์คํ ์ด๊ฒ์ ๋ํ ๋ฌธ์๋ฅผ ์์ฑํ๊ณ _SCMP_A*_ ๋งคํฌ๋ก์ 32๋นํธ ๋ณํ์ ๊ตฌํํ์ฌ ๊ฐ๋ฐ์์ ์ถ์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
@pcmoore - ์์ธํ ๋ต๋ณ์ ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ ๋ ๋นจ๋ฆฌ https://github.com/torvalds/linux/tree/master/samples/seccomp ๊ธฐ๋ฐ์ผ๋ก ์ฌ์์ฐ๊ธฐ๋ฅผ ์์ฑํ๋ ค๊ณ ์๋ํ์ง ์์์ง๋ง ๊ทํ์ ํผ๋๋ฐฑ์ ๋ฐ๋ฅด๋ฉด ๊ทธ๋ด ํ์๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค๋ฅธ ๊ฒ์ด ํ์ํ๋ฉด ์๋ ค์ฃผ์ญ์์ค. ์ง๊ธ์ '์ฃผ์' ๋ฐฉ์์ผ๋ก ์ ๊ทผํ์ฌ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ค์ ๋ณด๊ณ ํ๊ฒ ์ต๋๋ค. ์์ผ๋ก ์ด๋ป๊ฒ ํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ๋ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์์ง ๊ธฐ๋ํ๊ฒ ์ต๋๋ค.
@jdstrand ๋น๋ถ๊ฐ ๋ชจ๋ ์ค๋น๊ฐ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๋ณด์ ๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ ๋์ ๋ต๋ณ์ ๋๋ฆฌ์ง ๋ชปํด ์ฃ์กํฉ๋๋ค. ํ์ง๋ง ์์ผ๋ก๋ ๋ญ๊ฐ๊ฐ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ทธ ๋์ ์ฌ๋ฐ๋ฅธ ์ ํ์ ์บ์คํธ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ธ์ ๋ ์ง ์ด ๋ฌธ์ ๋ฅผ ์ ๋ฐ์ดํธํ์ธ์.
์ข์ ์์์ ๋ถ์ ์ ์ธ ์ธ์๋ฅผ ์ทจํ๋ ์์คํ ํธ์ถ์ ์๊ฐ ์๋์ ์ผ๋ก ์ ๊ธฐ ๋๋ฌธ์ ์ํฅ์ด ๋ค์ ์ ํ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค๋ ๊ฒ์ ๋๋ค.
openat()์ fd ๋งค๊ฐ๋ณ์๊ฐ -100์ธ ํน์ ๊ฐ AT_FDCWD์ ๊ฐ์์ง ์ฌ๋ถ๋ฅผ ํ์ธํ ๋(๋ฌด์๋ณด๋ค๋) ๋ฐฉ๊ธ ์ด ๋ฌธ์ ์ ๋ถ๋ช์ณค์ต๋๋ค. ์ด๋ก ์ธํด ๋ค์์ด ๋ฐ์ํฉ๋๋ค.
# filter for syscall "openat" (257) [priority: 131067]
if ($syscall == 257)
if ($a0.hi32 == 4294967295)
if ($a0.lo32 == 4294967196)
if ($a2.hi32 & 0x00000000 == 0)
if ($a2.lo32 & 0x00000003 == 0)
action ERRNO(2);
์์น:
# filter for syscall "openat" (257) [priority: 131067]
if ($syscall == 257)
if ($a0.hi32 == 0)
if ($a0.lo32 == 4294967196)
if ($a2.hi32 & 0x00000000 == 0)
if ($a2.lo32 & 0x00000003 == 0)
action ERRNO(2);
glibc 2.26+๋ open()์ ๊ตฌํํ๊ธฐ ์ํด AT_FDCWD์ ํจ๊ป openat syscall์ ๋ ์ ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ง์ ์ฌ๋๋ค์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์์์ ์ ์ํ ๋๋ก uint32_t์ ์บ์คํธ๋ฅผ ์ ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
// selector, action, syscall, no of args, args
{ SEL, SCMP_ACT_ERRNO(ENOENT), "openat", 2,
- { SCMP_A0(SCMP_CMP_EQ, AT_FDCWD), /* glibc 2.26+ */
+ { SCMP_A0(SCMP_CMP_EQ, (uint32_t)AT_FDCWD), /* glibc 2.26+ */
SCMP_A2(SCMP_CMP_MASKED_EQ, O_ACCMODE, O_RDONLY) }},
๋ช ์์ ์ธ SCMP_A0_U32๊ฐ ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
@drakenclimber @jdstrand @michaelweiser ์ฌ๋ฌ๋ถ์ https://github.com/pcmoore/misc-libseccomp/commit/b9ce39d776ed5a984c7e9e6db3b87463edce82a7 ์ ๋ํ ์์ ์ฌํญ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?
@pcmoore : ๊ณ์ํด์ ์กฐ์ฌํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๋ฐฉ๊ธ ์์ฉ๋์ด๋ฅผ ์ฃผ์๊ณ ์ฝ๋์์ ์ ๋ง ๋ฉ์ง๊ฒ ๋ณด์ ๋๋ค.
static struct {
const uint64_t promises;
const uint32_t action;
const char *syscall;
const int arg_cnt;
const struct scmp_arg_cmp args[3];
} scsb_calls[] = {
[...]
{ PLEDGE_WPATH, SCMP_ACT_ALLOW, "openat", 2, /* glibc 2.26+ */
{ SCMP_A0_32(SCMP_CMP_EQ, AT_FDCWD),
SCMP_A2_64(SCMP_CMP_MASKED_EQ, O_ACCMODE, O_WRONLY) }},
๋ถํํ๋ ๋์ฐ๋ฏธ ํจ์๋ ๊ตฌ์กฐ์ฒด ์ด๋์ ๋ผ์ด์ ๋ก ์ ํฉํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
In file included from pledge.c:42:
/include/seccomp.h:230:26: error: initializer element is not constant
#define SCMP_CMP32(...) (__scmp_arg_32(SCMP_CMP64(__VA_ARGS__)))
^
/include/seccomp.h:241:26: note: in expansion of macro โSCMP_CMP32โ
#define SCMP_A0_32(...) SCMP_CMP32(0, __VA_ARGS__)
^~~~~~~~~~
pledge.c:188:5: note: in expansion of macro โSCMP_A0_32โ
{ SCMP_A0_32(SCMP_CMP_EQ, AT_FDCWD),
^~~~~~~~~~
/include/seccomp.h:230:26: note: (near initialization for โscsb_calls[21].args[0]โ)
#define SCMP_CMP32(...) (__scmp_arg_32(SCMP_CMP64(__VA_ARGS__)))
^
/include/seccomp.h:241:26: note: in expansion of macro โSCMP_CMP32โ
#define SCMP_A0_32(...) SCMP_CMP32(0, __VA_ARGS__)
^~~~~~~~~~
pledge.c:188:5: note: in expansion of macro โSCMP_A0_32โ
{ SCMP_A0_32(SCMP_CMP_EQ, AT_FDCWD),
^~~~~~~~~~
@michaelweiser ๋ฆฌ๋ทฐ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ถํํ๋ ์ฌ๋๋ค์ด ์ด ๋งคํฌ๋ก๋ฅผ ์ด๋์ ๋ผ์ด์ ๋ก ์ฌ์ฉํ๊ณ ์๋ค๊ณ ์๊ฐํ์ง ์์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ๋ํด ์กฐ๊ธ ์๊ฐํด์ผ ํ ๊ฒ์ ๋๋ค ... ์ฐ์ํ ๋ฐฉ์์ผ๋ก ์ด๊ฒ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น?
๋ชฐ๋ผ, ๋ฏธ์, ์ด๋ฏธ ์ฑ๋ฅ์ผ๋ก ๋์ ๋จ๊ณ ์์์ด. :)
์ง๊ธ ๋ณด๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฐ๋ณ ์ธ์ ๋ชฉ๋ก์ผ๋ก ์ธํด ํ์ํ ์บ์คํธ๋ฅผ ์ฝ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ฃ ?
scmp_arg_cmp์ ์ฌ๋ฐ๋ฅธ ๋๋น, ์ ๋ ฌ(๋ฐ ์๋ง๋ ๋ฐ์ดํธ ์์)(IMO๊ฐ "์ฐ์ํ"๊ณผ ๋ค์ ์ถฉ๋ํจ)์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ๋ํด ๋ค๋ฅธ ๋ณด๊ธฐ๋ฅผ ์ ๊ณตํ๋ ํตํฉ์ด ํฌํจ๋ ์ ์์ต๋๊น? ๊ทธ๊ฒ์ด ์์ ํ libseccomp ๋ด๋ถ์ ์๊ณ ์ปค๋ ์ธํฐํ์ด์ค์ ํธํ๋ ํ์๊ฐ ์๋ค๋ฉด, ๋ฐ์ดํฐ ์ ํ ํ์๊ธฐ๋ฅผ ๋ณ๋์ ํ๋๋ก ๊ฐ๊ณ ์ฌ์ฉ์ ๊ธฐ๋ฅ์ด ์ด๋ฅผ ์ ๋ ฌํ๋๋ก ํ ์ ์์ต๋๊น? ๊ทธ๋ฆฌ๊ณ varargs๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ธฐํํ ์๋ ์์ต๋๊น?
๊ทธ๋ ์ง ์์ผ๋ฉด ์ฐ์ฐ์ ์ ์ฒด 32/64๋นํธ๋ก ํ์ํ๋ ๋์ ํผ์ฐ์ฐ์์ ์ฃผ์์ ๋ฌ์ ์บ์คํธ๋ฅผ ๋ํํ๊ณ ๋๋ฒ๊น ํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ ์ ์ง๋ฉดํ์ ๋ ํญ์ ํด๋น ์ฃผ์์ ์ฌ์ฉํ๋๋ก ์ฌ์ฉ์์๊ฒ ์๊ฒฉํ ๊ถ์ฅ ์ฌํญ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ?
{ SCMP_A0(SCMP_CMP_EQ, SCMP_OP_32(AT_FDCWD)),
SCMP_A2(SCMP_CMP_MASKED_EQ, SCMP_OP_64(O_ACCMODE), SCMP_OP_64(O_WRONLY)) }},
๋๋
{ SCMP_A0(SCMP_CMP_EQ, SCMP_OP1_32(AT_FDCWD)),
SCMP_A2(SCMP_CMP_MASKED_EQ, SCMP_OP2_64(O_ACCMODE, O_WRONLY)) }},
๋ ๋ง์ ๊ฒ์ ์๊ฐํด๋ด๊ธฐ์๋ ์ ์ฒ๋ฆฌ๊ธฐ ํฌ๋์ด ๋ถ์กฑํฉ๋๋ค. ์ฃ์กํฉ๋๋ค.
@pcmoore , ๋ณ๊ฒฝ ์ฌํญ์ด ์ข์ ๋ณด์ ๋๋ค. ์ ๋ ์ ์ฒ๋ฆฌ๊ธฐ ์ ๋ฌธ๊ฐ๋ ์๋์ง๋ง @michaelweiser๊ฐ ์์์ ์ธ๊ธํ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ง๊ธ ๋ณด๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฐ๋ณ ์ธ์ ๋ชฉ๋ก์ผ๋ก ์ธํด ํ์ํ ์บ์คํธ๋ฅผ ์ฝ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ฃ ?
์, ๊ทธ ์ ๋์ ๋๋ค. ์๋ง๋ ๊ทธ ์ฃผ์์ ๋์ฐํ ๋ฐฉ๋ฒ์ด ์์ง๋ง ์์ง ์ฐพ์ง ๋ชปํ์ต๋๋ค.
scmp_arg_cmp์ ์ฌ๋ฐ๋ฅธ ๋๋น, ์ ๋ ฌ(๋ฐ ์๋ง๋ ๋ฐ์ดํธ ์์)(IMO๊ฐ "์ฐ์ํ"๊ณผ ๋ค์ ์ถฉ๋ํจ)์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ๋ํด ๋ค๋ฅธ ๋ณด๊ธฐ๋ฅผ ์ ๊ณตํ๋ ํตํฉ์ด ํฌํจ๋ ์ ์์ต๋๊น? ๊ทธ๊ฒ์ด ์์ ํ libseccomp ๋ด๋ถ์ ์๊ณ ์ปค๋ ์ธํฐํ์ด์ค์ ํธํ๋ ํ์๊ฐ ์๋ค๋ฉด, ๋ฐ์ดํฐ ์ ํ ํ์๊ธฐ๋ฅผ ๋ณ๋์ ํ๋๋ก ๊ฐ๊ณ ์ฌ์ฉ์ ๊ธฐ๋ฅ์ด ์ด๋ฅผ ์ ๋ ฌํ๋๋ก ํ ์ ์์ต๋๊น? ๊ทธ๋ฆฌ๊ณ varargs๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ธฐํํ ์๋ ์์ต๋๊น?
scmp_arg_cmp ๊ตฌ์กฐ์ฒด๊ฐ libseccomp API์ ์ผ๋ถ๋ผ๋ ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก libseccomp ์ฃผ ๋ฒ์ ์ ๋ฒํํ์ง ์๋ ํ ๊ตฌ์กฐ์ฒด์ ํฌ๊ธฐ๋ ๋ฉค๋ฒ ํ๋์ ์คํ์ ์ ์ค์ ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ๊ธฐ์กด ์์ฉ ํ๋ก๊ทธ๋จ๊ณผ์ ๊ธฐ์กด ๋ฐ์ด๋๋ฆฌ ์ธํฐํ์ด์ค๊ฐ ์์๋ฉ๋๋ค. 64๋นํธ ๋ฐ์ดํฐ ํ๋๋ฅผ 64๋นํธ ๋๋ 32๋นํธ ๊ฐ์ ํฌํจํ๋ ๊ณต์ฉ์ฒด๋ก ๋ณํํ๋ ๊ฒ์ ๊ทธ ์์ฒด๋ก ๊ด์ฐฎ์ง๋ง scmp_arg_cmp ๊ตฌ์กฐ์ฒด์ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ ๊ณต์ฉ์ฒด ๊ตฌ์ฑ์์ ํ์ํด์ผ ํฉ๋๋ค. ; ๋ฌธ์ ๊ฐ ๋ ์ ์๋ ๊ฒ์ ์ด ์ถ๊ฐ ํ๋๊ทธ์ ๋๋ค.
"arg" ๋๋ "op" ํ๋์์ ์ผ๋ถ ๋นํธ๋ฅผ ํ์น๋ ๊ฒ์ด ๊ฐ๋ฅํ ์ ์์ต๋๋ค. ๋ ๋ค 32๋นํธ ๊ฐ์ด๊ณ ํด๋น ๊ณต๊ฐ์ ์ผ๋ถ๋ง ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ด ๋ค์ ๊ทน๋จ์ ์ธ ์ ํ์ด๋ผ๊ณ ์๊ฐํ๊ณ ๊ฐ๋ฅํ๋ค๋ฉด ๊ทธ๊ฒ์ ํผํ๊ณ ์ถ์ต๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ์ฐ์ฐ์ ์ ์ฒด 32/64๋นํธ๋ก ํ์ํ๋ ๋์ ํผ์ฐ์ฐ์์ ์ฃผ์์ ๋ฌ์ ์บ์คํธ๋ฅผ ๋ํํ๊ณ ๋๋ฒ๊น ํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ ์ ์ง๋ฉดํ์ ๋ ํญ์ ํด๋น ์ฃผ์์ ์ฌ์ฉํ๋๋ก ์ฌ์ฉ์์๊ฒ ์๊ฒฉํ ๊ถ์ฅ ์ฌํญ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ?
ํผ์ฐ์ฐ์๋ฅผ ๋งคํฌ๋ก๋ก ๊ฐ์ธ์ ์ป์ ์ ์๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ข ๋ ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? ๋ฐ์ดํฐ ๊ฐ์ ๋ํํ๋ ๋งคํฌ๋ก๋ฅผ ์ ๊ณตํ ์ ์์ง๋ง ์ด๋ ํธ์ถ์์๊ฒ ์ ์ ํ ์บ์คํ ์ ์ ๊ณตํ๋๋ก ์์ฒญํ๋ ๊ฒ๊ณผ ์ค์ ๋ก ๋ค๋ฅด์ง ์์ต๋๋ค.
@pcmoore , ๋ณ๊ฒฝ ์ฌํญ์ด ์ข์ ๋ณด์ ๋๋ค. ์ ๋ ์ ์ฒ๋ฆฌ๊ธฐ ์ ๋ฌธ๊ฐ๋ ์๋์ง๋ง @michaelweiser๊ฐ ์์์ ์ธ๊ธํ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค. ๋ฐ๋ผ๊ฑด๋ ์ฐ๋ฆฌ ์ ์ด ์ฌ๊ธฐ์ ์ ์ฉํ ๊ฒ์ ์๊ฐํด๋ผ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@pcmoore : http://efesx.com/2010/07/17/variadic-macro-to-count-number-of-arguments/ ๋ฐ http://efesx.com/2010/08/31/overloading- ๋งคํฌ๋ก/ ๋๋ ๋ค์์ ์๊ฐํด๋ ๋๋ค.
#define VA_NUM_ARGS(...) VA_NUM_ARGS_IMPL(__VA_ARGS__, 5,4,3,2,1)
#define VA_NUM_ARGS_IMPL(_1,_2,_3,_4,_5,N,...) N
#define macro_dispatcher(func, ...) \
macro_dispatcher_(func, VA_NUM_ARGS(__VA_ARGS__))
#define macro_dispatcher_(func, nargs) \
macro_dispatcher__(func, nargs)
#define macro_dispatcher__(func, nargs) \
func ## nargs
#define SCMP_CMP64(...) ((struct scmp_arg_cmp){__VA_ARGS__})
#define SCMP_CMP32_1(x) SCMP_CMP64(x)
#define SCMP_CMP32_2(x, y) SCMP_CMP64(x, y)
#define SCMP_CMP32_3(x, y, z) SCMP_CMP64(x, y, (uint32_t)(z))
#define SCMP_CMP32_4(x, y, z, q) SCMP_CMP64(x, y, (uint32_t)(z), (uint32_t)(q))
#define SCMP_CMP32(...) macro_dispatcher(SCMP_CMP32_, __VA_ARGS__)(__VA_ARGS__)
#define SCMP_A0_64(...) SCMP_CMP64(0, __VA_ARGS__)
#define SCMP_A0_32(...) SCMP_CMP32(0, __VA_ARGS__)
์ด ํ ์คํธ ์ผ์ด์ค์ ๊ฒฝ์ฐ:
struct scmp_arg_cmp f[] = {
SCMP_A0_64(SCMP_CMP_EQ, 1, 20),
SCMP_A0_32(SCMP_CMP_EQ, 2, 3),
SCMP_A0_32(SCMP_CMP_LT, 2),
};
gcc-7.4.0 -E
๋ฐ clang-7 -E
์์ ๋ค์๊ณผ ๊ฐ์ด ๋์ต๋๋ค.
struct scmp_arg_cmp f[] = {
((struct scmp_arg_cmp){0, SCMP_CMP_EQ, 1, 20}),
((struct scmp_arg_cmp){0, SCMP_CMP_EQ, (uint32_t)(2), (uint32_t)(3)}),
((struct scmp_arg_cmp){0, SCMP_CMP_LT, (uint32_t)(2)}),
};
SCMP_A[0-5]_43
๊ฐ ์๋ํ๋ ค๋ฉด op
์ด์์ด ํ์ํ๊ณ SCMP_CMP32
๊ฐ arg
๊ฐ ํ์ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ํด๋น ๋งค๊ฐ๋ณ์๋ฅผ ์์น ์ง์ ํ์ฌ ๋ ์ค์ ์ ์ฅํ ์ ์์ต๋๋ค.
#define SCMP_CMP32_1(x, y, z) SCMP_CMP64(x, y, (uint32_t)(z))
#define SCMP_CMP32_2(x, y, z, q) SCMP_CMP64(x, y, (uint32_t)(z), (uint32_t)(q))
#define SCMP_CMP32(x, y,...) macro_dispatcher(SCMP_CMP32_, __VA_ARGS__)(x, y, __VA_ARGS__)
#define SCMP_A0_32(x,...) SCMP_CMP32(0, x, __VA_ARGS__)
์ํ์ด @michaelweiser! ๋ณ๊ฒฝ ์ฌํญ์ ์ข ๋ ์ฝ๊ฒ ๊ฒํ /์ค๋ช ํ ์ ์๋๋ก PR์ ํตํฉํ๊ณ ์ถ์ต๋๊น? ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์๋ฒฝํ๊ฒ ๊ด์ฐฎ์ต๋๋ค. ํ๋๋ฅผ ํจ๊ป ๋์ ธ์ ๋ง์ ํฌ๋ ๋ง์ ์ป์ ์ ์๋์ง ํ์ธํฉ๋๋ค. :)
์ค๋ ๋ฐค์ ํ๋ก์ ํธ๋ฅผ ํ๋ณดํ๊ฒ ์ต๋๋ค. https://github.com/pcmoore/misc-libseccomp/commit/b9ce39d776ed5a984c7e9e6db3b87463edce82a7 ๋๋ ์ฒ์๋ถํฐ?
Blogger Roman์ ๊ณผ๋ถํ ์๋ฃจ์
์ ์ด๋ป๊ฒ ์ธ์ ํฉ๋๊น? https://kecher.net/overloading-macros/ ์์ ๊ทธ์ ๋ธ๋ก๊ทธ์ ํ์ฌ ์ง์ผ๋ก ๋ณด์ด๋ ๊ฒ์ ์ฐพ์์ต๋๋ค macro_dispatcher
๋
ผ๋ฆฌ ์์ ๊ฒ์๋ฌผ์ ๋ํ ๋งํฌ์ ํจ๊ป ๋๊ธ์ ์์ฑํ์๊ฒ ์ต๋๊น?
์ค๋ ๋ฐค์ ํ๋ก์ ํธ๋ฅผ ํ๋ณดํ๊ฒ ์ต๋๋ค. pcmoore@b9ce39d ์์ ๋๋ ์ฒ์๋ถํฐ?
์ข์์, ๊ฐ์ฌํฉ๋๋ค! ๊ณ์ํด์ ๋ง์คํฐ ๋ธ๋์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ญ์์ค. ์ ๋ misc-libseccomp ํธ๋ฆฌ์ ๋ด์ฉ์ ๋ณํฉํ์ง ์์์ผ๋ฉฐ ๊ทํ์ ์ ๊ทผ ๋ฐฉ์์ด ํจ์ฌ ๋ ์ข๊ธฐ ๋๋ฌธ์ ์ด ์์ ์์ ๊ณํํ์ง ์์ต๋๋ค.
Blogger Roman์ ๊ณผ๋ถํ ์๋ฃจ์ ์ ์ด๋ป๊ฒ ์ธ์ ํฉ๋๊น? https://kecher.net/overloading-macros/ ์์ ๊ทธ์ ๋ธ๋ก๊ทธ์ ํ์ฌ ์ง์ผ๋ก ๋ณด์ด๋ ๊ฒ์ ์ฐพ์์ต๋๋ค
macro_dispatcher
๋ ผ๋ฆฌ ์์ ๊ฒ์๋ฌผ์ ๋ํ ๋งํฌ์ ํจ๊ป ๋๊ธ์ ์์ฑํ์๊ฒ ์ต๋๊น?
์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ผ์ด์ ์ค ์๊ตฌ ์ฌํญ์ด ์๋ ํ ์์ค์ ์ง์ ์ฌ๋์ ํ์ํ์ง ์์ต๋๋ค. ๋๋ Roman์๊ฒ ๊ธฐ๋ณธ ์์ด๋์ด๋ฅผ ์ ๊ณตํ๊ณ ๊ทธ์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๋ํ ๋งํฌ๋ฅผ ์ ๊ณตํ๋ ํจ์น ์ค๋ช ์ ์ฃผ์์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๋ ๊ทธ์ ์์ ๋ํ ๋ผ์ด์ ์ค๋ ์ ํ์ ๋ณด์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ผ๋ฉฐ ๊ทธ์ ๋ธ๋ก๊ทธ ์ํ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ๊ทธ์ ์๋๋ ์ด๋ฌํ ์์ด๋์ด๋ฅผ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๊ณต์ ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ) ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋ก๋ง์ ์ด๋ฉ์ผ ์ฃผ์๊ฐ ์๋ค๋ฉด ํญ์ ๊ทธ์๊ฒ ์ด๋ฉ์ผ์ ๋ณด๋ผ ์ ์์ต๋๋ค. ์ด๋ค ์ด์ ๋ก๋ ๊ทธ์๊ฒ ์ฐ๋ฝํ ์ ์๋ค๋ฉด ๊ณ์ํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค.
80a987d6f8d0152def07fa90ace6417d56eea741์ ํตํด ํด๊ฒฐ๋์์ต๋๋ค.