Libseccomp: BUG: SCMP_CMP_GT/GE/LT/LE๊ฐ€ ๋ถ€์ •์ ์ธ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ธ์ˆ˜์— ๋Œ€ํ•ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์•ˆ๋…•!

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;
}
bug prioritmedium

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

๋ฌธ์ œ ๋ณด๊ณ ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๊ฑฐ ์ข‹๋„ค.

ํ˜น์‹œ ์ปค๋„์˜ 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์„ ํ†ตํ•ด ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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