Libseccomp: 버그: μ˜μ‚¬ μ‹œμŠ€ν…œ ν˜ΈμΆœμ— λŒ€ν•΄ BPFλ₯Ό μƒμ„±ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€.

에 λ§Œλ“  2020λ…„ 06μ›” 15일  Β·  20μ½”λ©˜νŠΈ  Β·  좜처: seccomp/libseccomp

문제 #249, 특히 이 λŒ“κΈ€μ„ μ°Έμ‘°ν•˜μ„Έμš”.

μ‹€μ œλ‘œ μƒμ„±λœ bpfμ—μ„œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” syscall 4294957285λ₯Ό ν™•μΈν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

μš°λ¦¬λŠ” κ·Έλ ‡κ²Œ ν•΄μ„œλŠ” μ•ˆ 되며 κ·Έλ ‡κ²Œ ν•˜λŠ” 데 μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ ν˜„μž¬ libseccomp에 여기에 버그가 μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

이 버그λ₯Ό 보고해 μ£Όμ‹  @vt-altμ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

bug prioritmedium

λͺ¨λ“  20 λŒ“κΈ€

μ•„λž˜μ˜ κ°œμ„ λœ μ΄ˆμ•ˆμ„ μœ„ν•΄ 제거된 μž¬μƒκΈ°

λΆ„λͺ…νžˆ ν•˜κΈ° μœ„ν•΄ 디버깅 λͺ©μ μœΌλ‘œ PFCμ—μ„œ μ˜μ‚¬ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ 계속 내보내야 ν•˜μ§€λ§Œ (μ“Έλͺ¨ μ—†λŠ”) BPF ν•„ν„° κ·œμΉ™μ„ λ‚΄λ³΄λ‚΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€.

λ‚΄ λ³΄κ³ μ„œμ—μ„œ 문제λ₯Ό λ§Œλ“€μ–΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

λΆ„λͺ…νžˆ ν•˜κΈ° μœ„ν•΄ 디버깅 λͺ©μ μœΌλ‘œ PFCμ—μ„œ μ˜μ‚¬ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ 계속 내보내야 ν•˜μ§€λ§Œ (μ“Έλͺ¨ μ—†λŠ”) BPF ν•„ν„° κ·œμΉ™μ„ λ‚΄λ³΄λ‚΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€.

λ‹€μ‹œ 생각해 λ³΄μ‹­μ‹œμ˜€. PFCκ°€ BPFλ₯Ό λ°˜μ˜ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λ§Œ 이것이 λ³΅μž‘ν•˜κ³  λͺ¨ν˜Έν•΄μ§ˆ 것이라고 λ―ΏμŠ΅λ‹ˆλ‹€.

λ‹€μ‹œ 생각해 λ³΄μ‹­μ‹œμ˜€. PFCκ°€ BPFλ₯Ό λ°˜μ˜ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λ§Œ 이것이 λ³΅μž‘ν•˜κ³  λͺ¨ν˜Έν•΄μ§ˆ 것이라고 λ―ΏμŠ΅λ‹ˆλ‹€.

PFCμ—μ„œ μ‹œμŠ€ν…œ 호좜이 λˆ„λ½λœ 경우 λΌμ΄λΈŒλŸ¬λ¦¬κ°€ (μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”) μ‹œμŠ€ν…œ ν˜ΈμΆœμ— λŒ€ν•œ ν•„ν„°λ₯Ό μΆ”κ°€ν•˜λŠ” 데 μ‹€νŒ¨ν•˜λŠ” 방법에 λŒ€ν•œ λ§Žμ€ κ°€μ§œ 버그 λ³΄κ³ μ„œλ₯Ό λ°›κ²Œ λ©λ‹ˆλ‹€.

μ˜μ‚¬ μ‹œμŠ€ν…œ 호좜의 κ°œλ…μ„ μ΄ν•΄ν•˜λŠ” μ‚¬λžŒλ“€μ—κ²ŒλŠ” PFC 좜λ ₯μ—μ„œ ​​이λ₯Ό μ œκ±°ν•˜λŠ” 것은 κ°„λ‹¨ν•œ μ—°μŠ΅μž…λ‹ˆλ‹€. λ˜ν•œ PFC 좜λ ₯은 BPF 좜λ ₯의 μ •ν™•ν•œ 볡사본을 μ˜λ„ν•œ 것이 μ•„λ‹ˆλΌ λ‹¨μˆœνžˆ 디버깅 λ„κ΅¬μ΄μž μƒμ„±λœ ν•„ν„° μ½”λ“œλ₯Ό μ‹œκ°ν™”ν•˜λŠ” μ‰¬μš΄ λ°©λ²•μ΄λΌλŠ” 점을 μ–ΈκΈ‰ν•  κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

μƒμ„±λœ ν•„ν„° μ½”λ“œλ₯Ό μ‹œκ°ν™”ν•˜λŠ” μ‰¬μš΄ 방법

κ·ΈλŸ¬λ‚˜ μƒμ„±λœ μ½”λ“œμ—μ„œ μ˜μ‚¬ μ‹œμŠ€ν…œ 호좜이 μ—†μ–΄μ•Ό ν•˜λ―€λ‘œ _generated_ ν•„ν„° μ½”λ“œλ₯Ό μ‹œκ°ν™”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

PFCμ—μ„œ μ‹œμŠ€ν…œ 호좜이 λˆ„λ½λœ 경우 λΌμ΄λΈŒλŸ¬λ¦¬κ°€ (μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”) μ‹œμŠ€ν…œ ν˜ΈμΆœμ— λŒ€ν•œ ν•„ν„°λ₯Ό μΆ”κ°€ν•˜λŠ” 데 μ‹€νŒ¨ν•˜λŠ” 방법에 λŒ€ν•œ λ§Žμ€ κ°€μ§œ 버그 λ³΄κ³ μ„œλ₯Ό λ°›κ²Œ λ©λ‹ˆλ‹€.

μ˜μ‚¬ μ‹œμŠ€ν…œ 호좜 검사가 μ½”λ“œμ— μžˆμ–΄μ„œλŠ” μ•ˆ λœλ‹€λŠ” 것을 μ΄ν•΄ν•˜λŠ” 것이 훨씬 μ‰½μŠ΅λ‹ˆλ‹€('μ΅œμ ν™”'μ—μ„œμ™€ 같이 'μ•„μΉ˜μ— λŒ€ν•œ κ·ΈλŸ¬ν•œ μ‹œμŠ€ν…œ 호좜이 μ—†κΈ° λ•Œλ¬Έμ—'). μ½”λ“œμ™€ μ‹€μ œ μ½”λ“œμ˜ μ‹œκ°ν™”.

PFC 좜λ ₯이 훨씬 읽기 쉽기 λ•Œλ¬Έμ— scmp_bpf_disasm λ₯Ό μ‚¬μš©ν•˜λŠ” 것보닀 bpfλ₯Ό λ°˜μ˜ν•˜λŠ” PFCλ₯Ό μ„ ν˜Έν•©λ‹ˆλ‹€.

@vt-alt에 λŒ€ν•œ 우렀λ₯Ό μ΄ν•΄ν•˜κ³  있으며 ν–₯ν›„ λ¦΄λ¦¬μŠ€μ—μ„œλŠ” PFC둜 이λ₯Ό μˆ˜ν–‰ν•  수 μžˆμ§€λ§Œ PFC 좜λ ₯μ—μ„œ β€‹β€‹μ˜μ‚¬ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ œκ±°ν•˜λŠ” 것은 μ‹€μˆ˜λΌκ³  μƒκ°ν•©λ‹ˆλ‹€.

@drakenclimber 이에 λŒ€ν•œ κ°•λ ₯ν•œ 의견이 μžˆμŠ΅λ‹ˆκΉŒ?

x86_64용 μˆ˜μ •λœ μž¬μƒκΈ°:

#include <stdlib.h>
#include <errno.h>

#include <seccomp.h>

#include "util.h"

int main(int argc, char *argv[])
{
        int rc;
        struct util_options opts;
        scmp_filter_ctx ctx = NULL;

        rc = util_getopt(argc, argv, &opts);
        if (rc < 0)
                goto out;

        ctx = seccomp_init(SCMP_ACT_KILL);
        if (ctx == NULL)
                return ENOMEM;

        rc = seccomp_arch_add(ctx, SCMP_ARCH_X32);
        if (rc < 0)
                goto out;

        rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(access), 0);
        if (rc < 0)
                goto out;
        rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(arm_fadvise64_64), 0);
        if (rc < 0)
                goto out;

        rc = util_filter_output(&opts, ctx);
        if (rc)
                goto out;

out:
        seccomp_release(ctx);
        return (rc < 0 ? -rc : rc);
}

μ—…λ°μ΄νŠΈλ¨: TSKIP 문제 μˆ˜μ •

아직 μ™„μ „νžˆ ν…ŒμŠ€νŠΈλ˜μ§€λŠ” μ•Šμ•˜μ§€λ§Œ μˆ˜μ •λ  수 μžˆμŠ΅λ‹ˆλ‹€. κ· ν˜• 트리 μ΅œμ ν™” μ•Œκ³ λ¦¬μ¦˜ @drakenclimber에 λŒ€ν•΄ 이것이 합리적인지 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ?

diff --git a/src/arch-arm.c b/src/arch-arm.c
index 3465111..4dd4b63 100644
--- a/src/arch-arm.c
+++ b/src/arch-arm.c
@@ -54,7 +54,7 @@ int arm_syscall_resolve_name_munge(const char *name)
        if (sys == __NR_SCMP_ERROR)
                return sys;

-       return sys + __SCMP_NR_BASE;
+       return (sys | __SCMP_NR_BASE);
 }

 /**
@@ -68,7 +68,7 @@ int arm_syscall_resolve_name_munge(const char *name)
  */
 const char *arm_syscall_resolve_num_munge(int num)
 {
-       return arm_syscall_resolve_num(num - __SCMP_NR_BASE);
+       return arm_syscall_resolve_num(num & (~__SCMP_NR_BASE));
 }

 const struct arch_def arch_def_arm = {
diff --git a/src/arch-x32.c b/src/arch-x32.c
index 7b97fb3..3890968 100644
--- a/src/arch-x32.c
+++ b/src/arch-x32.c
@@ -43,7 +43,7 @@ int x32_syscall_resolve_name_munge(const char *name)
        if (sys == __NR_SCMP_ERROR)
                return sys;

-       return sys + X32_SYSCALL_BIT;
+       return (sys | X32_SYSCALL_BIT);
 }

 /**
@@ -57,7 +57,7 @@ int x32_syscall_resolve_name_munge(const char *name)
  */
 const char *x32_syscall_resolve_num_munge(int num)
 {
-       return x32_syscall_resolve_num(num - X32_SYSCALL_BIT);
+       return x32_syscall_resolve_num(num & (~X32_SYSCALL_BIT));
 }

 const struct arch_def arch_def_x32 = {
diff --git a/src/gen_bpf.c b/src/gen_bpf.c
index 55a7958..ae9c3f4 100644
--- a/src/gen_bpf.c
+++ b/src/gen_bpf.c
@@ -1555,6 +1555,10 @@ static int _gen_bpf_syscalls(struct bpf_state *state,
        for (s_iter = s_tail; s_iter != NULL; s_iter = s_iter->pri_prv) {
                if (!s_iter->valid)
                        continue;
+               /* skip pseudo-syscalls */
+               if ((s_iter->num & 0x80000000) &&
+                   (state->attr->api_tskip == 0 || s_iter->num != -1))
+                       continue;

                if (*bintree_levels > 0 &&
                    ((syscall_cnt + empty_cnt) % SYSCALLS_PER_NODE) == 0)

@vt-alt에 λŒ€ν•œ 우렀λ₯Ό μ΄ν•΄ν•˜κ³  있으며 ν–₯ν›„ λ¦΄λ¦¬μŠ€μ—μ„œλŠ” PFC둜 이λ₯Ό μˆ˜ν–‰ν•  수 μžˆμ§€λ§Œ PFC 좜λ ₯μ—μ„œ β€‹β€‹μ˜μ‚¬ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ œκ±°ν•˜λŠ” 것은 μ‹€μˆ˜λΌκ³  μƒκ°ν•©λ‹ˆλ‹€.

@drakenclimber 이에 λŒ€ν•œ κ°•λ ₯ν•œ 의견이 μžˆμŠ΅λ‹ˆκΉŒ?

μ‹€μ œλ‘œλŠ” μ•„λ‹ˆμ§€λ§Œ 문제의 근본은 PFC 좜λ ₯이 μ—¬λŸ¬ 가지 λ‹€μ–‘ν•œ λ°©μ‹μœΌλ‘œ μ‚¬μš©λ˜κ³  μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

  1. μœ„μ—μ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ μ‹ κ·œ μ‚¬μš©μžκ°€ ν•„ν„°λ₯Ό λŒ€λž΅μ μœΌλ‘œ 확인할 수 μžˆλŠ” μ‰¬μš΄ λ°©λ²•μž…λ‹ˆλ‹€.
  2. κ³ κΈ‰ μ‚¬μš©μžλŠ” μ‹€μ œ BPF 필터와 거의 λΉ„μŠ·ν•  κ²ƒμœΌλ‘œ κΈ°λŒ€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

PFC λ‘œμ§μ— --no-pseudo-syscalls ν”Œλž˜κ·Έλ₯Ό μΆ”κ°€ν•  수 μžˆμ„κΉŒμš”? 그러면 μ΄ˆμ‹¬μž μ‚¬μš©μžμ—κ²ŒλŠ” λ™μΌν•˜κ²Œ μœ μ§€λ  수 μžˆμ§€λ§Œ κ³ κΈ‰ μ‚¬μš©μžλŠ” BPF에 λŒ€ν•œ 더 λ‚˜μ€ 근사값을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

_μ—…λ°μ΄νŠΈλ¨: TSKIP_ 문제λ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

아직 μ™„μ „νžˆ ν…ŒμŠ€νŠΈλ˜μ§€λŠ” μ•Šμ•˜μ§€λ§Œ μˆ˜μ •λ  수 μžˆμŠ΅λ‹ˆλ‹€. κ· ν˜• 트리 μ΅œμ ν™” μ•Œκ³ λ¦¬μ¦˜ @drakenclimber에 λŒ€ν•΄ 이것이 합리적인지 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ?

ν•  것이닀. 이 μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μž¬ν˜„ν•  μžλ™ν™”λœ ν…ŒμŠ€νŠΈλ₯Ό λ§Œλ“€ 수 μžˆλŠ”μ§€ ν™•μΈν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

_μ—…λ°μ΄νŠΈλ¨: TSKIP_ 문제λ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.
아직 μ™„μ „νžˆ ν…ŒμŠ€νŠΈλ˜μ§€λŠ” μ•Šμ•˜μ§€λ§Œ μˆ˜μ •λ  수 μžˆμŠ΅λ‹ˆλ‹€. κ· ν˜• 트리 μ΅œμ ν™” μ•Œκ³ λ¦¬μ¦˜ @drakenclimber에 λŒ€ν•΄ 이것이 합리적인지 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ?

ν•  것이닀. 이 μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μž¬ν˜„ν•  μžλ™ν™”λœ ν…ŒμŠ€νŠΈλ₯Ό λ§Œλ“€ 수 μžˆλŠ”μ§€ ν™•μΈν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

그리고 λ¬Όλ‘  μœ„μ— μžˆλŠ” μž¬ν˜„μž ν…ŒμŠ€νŠΈλΆ€ν„° μ‹œμž‘ν•˜κ² μŠ΅λ‹ˆλ‹€. 감사 ν•΄μš”!

_μ—…λ°μ΄νŠΈλ¨: TSKIP_ 문제λ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

아직 μ™„μ „νžˆ ν…ŒμŠ€νŠΈλ˜μ§€λŠ” μ•Šμ•˜μ§€λ§Œ μˆ˜μ •λ  수 μžˆμŠ΅λ‹ˆλ‹€. κ· ν˜• 트리 μ΅œμ ν™” μ•Œκ³ λ¦¬μ¦˜ @drakenclimber에 λŒ€ν•΄ 이것이 합리적인지 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ?

이진 νŠΈλ¦¬λŠ” λˆ„μ‚°κΈ°λ₯Ό μˆ˜μ •ν•΄μ•Ό ν•  λ•Œ 미리 κ³„μ‚°ν•˜κ³  이것이 jge 논리λ₯Ό μ‚½μž…ν•˜λŠ” 방법을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€. ν•„ν„°λ₯Ό κ΅¬μΆ•ν•˜λŠ” λ™μ•ˆ μ‹œμŠ€ν…œ 호좜(μœ„μ˜ μ œμ•ˆκ³Ό 같이)을 μ œκ±°ν•˜λ©΄ 이 논리가 κΉ¨μ§‘λ‹ˆλ‹€.

λ‚΄ λ³€κ²½ 사항도 아직 μ™„μ „νžˆ ν…ŒμŠ€νŠΈν•˜μ§€λŠ” μ•Šμ•˜μ§€λ§Œ, μ˜μ‚¬ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ œκ±°ν•˜μ—¬ λ°”μ΄λ„ˆλ¦¬ 트리λ₯Ό μž‘λ™μ‹œν‚€λ €λ©΄ 이와 같은 것이 ν•„μš”ν•  것이라고 ν™•μ‹ ν•©λ‹ˆλ‹€. 이것을 μ‚¬μš©ν•˜μ—¬ BPF λ°”μ΄λ„ˆλ¦¬ 트리λ₯Ό μƒμ„±ν–ˆλŠ”λ° ν•©λ¦¬μ μœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. 생산 μ€€λΉ„κ°€ 된 μ†”λ£¨μ…˜μ— κ°€κΉŒμ›Œμ§€λ©΄ μ™„μ „νžˆ κ²€μ¦ν•˜κ² μŠ΅λ‹ˆλ‹€.

@@ -1532,11 +1532,31 @@ static int _gen_bpf_syscalls(struct bpf_state *state,
                _sys_sort(db_secondary->syscalls, &s_head, &s_tail, optimize);

        if (optimize == 2) {
+               /* since pseudo-syscalls are removed from the filter, we need
+                * to calculate the syscall count by hand
+                */
+               for (s_iter = s_tail; s_iter != NULL; s_iter = s_iter->pri_prv) {
+                       if (!s_iter->valid)
+                               continue;
+
+                       /* skip pseudo-syscalls */
+                       if ((s_iter->num & 0x80000000) &&
+                           (state->attr->api_tskip == 0 || s_iter->num != -1))
+                               continue;
+
+                       syscall_cnt++;
+               }
+
                rc = _gen_bpf_init_bintree(&bintree_hashes, &bintree_syscalls,
-                                          bintree_levels, db->syscall_cnt,
+                                          bintree_levels, syscall_cnt,
                                           &empty_cnt);
                if (rc < 0)
                        goto out;
+
+               /* reset the syscall_cnt variable because later in this
+                * function it's used as a counter
+                */
+               syscall_cnt = 0;
        }

db ꡬ쑰체에 "μœ νš¨ν•œ" μ‹œμŠ€ν…œ 호좜 수λ₯Ό μΆ”μ ν•˜λŠ” λ³€μˆ˜κ°€ 있으면 더 λ˜‘λ˜‘ν•˜κ³  λΉ λ₯΄κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

PFC λ‘œμ§μ— --no-pseudo-syscalls ν”Œλž˜κ·Έλ₯Ό μΆ”κ°€ν•  수 μžˆμ„κΉŒμš”?

이 κΉƒλ°œμ€ μ–΄λ””λ‘œ κ°ˆκΉŒμš”? λ‚˜λŠ” 이것을 λΉŒλ“œ μ‹œκ°„ μ˜΅μ…˜μœΌλ‘œ μ›ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. ν•„ν„° μ˜΅μ…˜μ„ μΆ”κ°€ν•  수 μžˆλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ μ €λŠ” 그것에 λŒ€ν•΄ λ³„λ‘œ κΈ°λŒ€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” PFC의 μ˜μ‚¬ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ κ³ μˆ˜ν•˜μ§€λ§Œ μ§€κΈˆμ€ BPFμ—μ„œ μ‚­μ œν•˜λŠ” 것에 νˆ¬ν‘œν•  κ²ƒμž…λ‹ˆλ‹€.

λ‚΄ λ³€κ²½ 사항도 아직 μ™„μ „νžˆ ν…ŒμŠ€νŠΈν•˜μ§€λŠ” μ•Šμ•˜μ§€λ§Œ, μ˜μ‚¬ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ œκ±°ν•˜μ—¬ λ°”μ΄λ„ˆλ¦¬ 트리λ₯Ό μž‘λ™μ‹œν‚€λ €λ©΄ 이와 같은 것이 ν•„μš”ν•  것이라고 ν™•μ‹ ν•©λ‹ˆλ‹€. 이것을 μ‚¬μš©ν•˜μ—¬ BPF λ°”μ΄λ„ˆλ¦¬ 트리λ₯Ό μƒμ„±ν–ˆλŠ”λ° ν•©λ¦¬μ μœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. 생산 μ€€λΉ„κ°€ 된 μ†”λ£¨μ…˜μ— κ°€κΉŒμ›Œμ§€λ©΄ μ™„μ „νžˆ κ²€μ¦ν•˜κ² μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이것이 트리 μ΅œμ ν™”λ₯Ό 깨뜨릴 것이라고 μ˜μ‹¬ν–ˆμŠ΅λ‹ˆλ‹€.

@drakenclimber λŠ” 이것이 ν‘œμ€€ μ΅œμ ν™”λ³΄λ‹€ 트리 정렬에 훨씬 더 λ§Žμ€ 영ν–₯을 미친

ν•œ κ°€μ§€λŠ” "arch-arm.c" 및 "arch-x32.c"의 λ³€κ²½ 사항에 관계없이 더 ν•©λ¦¬μ μœΌλ‘œ μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

PFC λ‘œμ§μ— --no-pseudo-syscalls ν”Œλž˜κ·Έλ₯Ό μΆ”κ°€ν•  수 μžˆμ„κΉŒμš”?

이 κΉƒλ°œμ€ μ–΄λ””λ‘œ κ°ˆκΉŒμš”? λ‚˜λŠ” 이것을 λΉŒλ“œ μ‹œκ°„ μ˜΅μ…˜μœΌλ‘œ μ›ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. ν•„ν„° μ˜΅μ…˜μ„ μΆ”κ°€ν•  수 μžˆλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ μ €λŠ” 그것에 λŒ€ν•΄ λ³„λ‘œ κΈ°λŒ€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” PFC의 μ˜μ‚¬ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ κ³ μˆ˜ν•˜μ§€λ§Œ μ§€κΈˆμ€ BPFμ—μ„œ μ‚­μ œν•˜λŠ” 것에 νˆ¬ν‘œν•  κ²ƒμž…λ‹ˆλ‹€.

λ‚΄κ°€ μƒκ°ν•˜κΈ° 전에 μž…λ ₯ν–ˆμŒμ„ μΈμ •ν•©λ‹ˆλ‹€. ;)

예, ν•„ν„° μ˜΅μ…˜μ΄ μžˆμ–΄μ•Ό ν•˜κ³  잘λͺ»λœ λŠλ‚Œμž…λ‹ˆλ‹€. λ‚˜λŠ” λ™μ˜ν•œλ‹€; μœ„μ—μ„œ μ„€λͺ…ν•œ λŒ€λ‘œ ν•΄λ³΄μž. κ³„μ†ν•΄μ„œ μ§ˆλ¬Έμ„ λ°›μœΌλ©΄ λ‹€μ‹œ λ°©λ¬Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚΄ λ³€κ²½ 사항도 아직 μ™„μ „νžˆ ν…ŒμŠ€νŠΈν•˜μ§€λŠ” μ•Šμ•˜μ§€λ§Œ, μ˜μ‚¬ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ œκ±°ν•˜μ—¬ λ°”μ΄λ„ˆλ¦¬ 트리λ₯Ό μž‘λ™μ‹œν‚€λ €λ©΄ 이와 같은 것이 ν•„μš”ν•  것이라고 ν™•μ‹ ν•©λ‹ˆλ‹€. 이것을 μ‚¬μš©ν•˜μ—¬ BPF λ°”μ΄λ„ˆλ¦¬ 트리λ₯Ό μƒμ„±ν–ˆλŠ”λ° ν•©λ¦¬μ μœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. 생산 μ€€λΉ„κ°€ 된 μ†”λ£¨μ…˜μ— κ°€κΉŒμ›Œμ§€λ©΄ μ™„μ „νžˆ κ²€μ¦ν•˜κ² μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이것이 트리 μ΅œμ ν™”λ₯Ό 깨뜨릴 것이라고 μ˜μ‹¬ν–ˆμŠ΅λ‹ˆλ‹€.

@drakenclimber λŠ” 이것이 ν‘œμ€€ μ΅œμ ν™”λ³΄λ‹€ 트리 정렬에 훨씬 더 λ§Žμ€ 영ν–₯을 미친

ν•œ κ°€μ§€λŠ” "arch-arm.c" 및 "arch-x32.c"의 λ³€κ²½ 사항에 관계없이 더 ν•©λ¦¬μ μœΌλ‘œ μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

ν™•μ‹ ν•˜λŠ”. λ‚˜λŠ” 이것을 μ†Œμœ ν•  수 μžˆλ‹€.

@drakenclimber "> μœ„μ—μ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ μ‹ κ·œ μ‚¬μš©μžκ°€ ν•„ν„°λ₯Ό λŒ€λž΅μ μœΌλ‘œ 확인할 수 μžˆλŠ” μ‰¬μš΄ λ°©λ²•μž…λ‹ˆλ‹€."

"Pseudo syscall"은 컀널에 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©° 잘 μ•Œλ €μ§„ κ°œλ…λ„ μ•„λ‹™λ‹ˆλ‹€. 이것은 μˆœμ „νžˆ libseccomp의 발λͺ…ν’ˆμ΄λ©° μ—¬κΈ°μ—μ„œλŠ” μ„€λͺ…ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 음수라고만 λͺ…μ‹œν–ˆμœΌλ©° μ•„ν‚€ν…μ²˜μ— λŒ€ν•΄ 주어진 μ‹œμŠ€ν…œ 호좜이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ λ‚˜νƒ€λ‚©λ‹ˆλ‹€. 이것은 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” syscallκ³Ό μ–΄λ–»κ²Œ λ‹€λ¦…λ‹ˆκΉŒ? μ–΄λ–€ λͺ©μ μœΌλ‘œ λΆ€μ •μ μΈκ°€μš”? μ˜μ‚¬ μ‹œμŠ€ν…œ 호좜 κ°œλ…μ€ μƒˆλ‘œμš΄ μ‚¬μš©μžμ—κ²Œ 정말 ν˜Όλž€μŠ€λŸ½μŠ΅λ‹ˆλ‹€.

μƒˆλ‘œμš΄(er) μ‚¬μš©μžκ°€ ν•„ν„°μ—μ„œ ν™•μΈλœ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ 보고 μ‹Άμ–΄ν•œλ‹€λŠ” 것을 믿을 수 μ—†μŠ΅λ‹ˆλ‹€.

ν•œ 점 더 μΆ”κ°€ν•˜κ² μŠ΅λ‹ˆλ‹€. 이 λͺ¨λ“  것은 μ‹ μ€‘ν•˜κ³  μƒμ„Έν•œ μ΄ν•΄λ§Œμ΄ μž‘λ™ν•˜λŠ” λ³΄μ•ˆ 뢄야에 μžˆμŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ λͺ¨ν˜Έν•œ κ°œλ…(μ˜μ‚¬ μ‹œμŠ€ν…œ 호좜)κ³Ό ν‘œν˜„μ˜ 차이(bpf 및 pfc)λ₯Ό λ§Œλ“­λ‹ˆλ‹€. 이것은 μ •λ§λ‘œ μƒˆλ‘œμš΄ μ‚¬μš©μžλ₯Ό μœ„ν•œ 것이며 더 ν˜Όλž€μŠ€λŸ½μŠ΅λ‹ˆκΉŒ?

@vt-alt κ±±μ •ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ v2.5.0 λ¦΄λ¦¬μŠ€μ—μ„œλŠ” BPF ν•„ν„°μ—μ„œ μ˜μ‚¬ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ–΅μ œν•˜κ³  PFC 필터에 계속 ν‘œμ‹œν•  κ²ƒμž…λ‹ˆλ‹€. κ·€ν•˜κ°€ 이 결정에 λ™μ˜ν•˜μ§€ μ•Šμ„ 수 μžˆμŒμ„ μ΄ν•΄ν•˜μ§€λ§Œ 이 결정을 쑴쀑해 μ£Όμ‹œκΈ° λ°”λžλ‹ˆλ‹€. ν–₯ν›„ λ¦΄λ¦¬μŠ€μ—μ„œλŠ” μ˜μ‚¬ μ‹œμŠ€ν…œ 호좜(닀쀑 ABI 지원을 μœ„ν•œ 것)의 이면에 μžˆλŠ” λͺ©μ μ„ μ„€λͺ…ν•˜κ³  λ§¨νŽ˜μ΄μ§€μ— λ¬Έμ„œν™”ν•˜λŠ” μž‘μ—…μ„ 더 잘 μˆ˜ν–‰ν•  κ²ƒμž…λ‹ˆλ‹€. 이에 λŒ€ν•œ 문제λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€(μ•„λž˜ 링크). ν•΄λ‹Ή ν† λ‘ κ³Ό 그에 λ”°λ₯Έ PR에 μ°Έμ—¬ν•˜λŠ” 것을 ν™˜μ˜ν•©λ‹ˆλ‹€. λ―Έλž˜μ— PFC 필터에 λŒ€ν•œ μ ‘κ·Ό 방식을 μˆ˜μ •ν•  μˆ˜λ„ μžˆμ§€λ§Œ μ—¬κΈ°μ„œ 아무 것도 μ•½μ†ν•˜κ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€.

λ‹€μ‹œ ν•œ 번 BPF 문제λ₯Ό μ•Œλ €μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. λ‹€μŒ libseccomp 릴리슀λ₯Ό κ°œμ„ ν•˜λŠ” 데 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

#264λ₯Ό 톡해 λ§ˆκ°ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰