λ¬Έμ #249, νΉν μ΄ λκΈμ μ°Έμ‘°νμΈμ.
μ€μ λ‘ μμ±λ bpfμμ μ‘΄μ¬νμ§ μλ syscall 4294957285λ₯Ό νμΈνλ μ΄μ λ 무μμ λκΉ?
μ°λ¦¬λ κ·Έλ κ² ν΄μλ μ λλ©° κ·Έλ κ² νλ λ° μ¬μ©νμ§ μμμ§λ§ νμ¬ libseccompμ μ¬κΈ°μ λ²κ·Έκ° μλ κ² κ°μ΅λλ€.
μ΄ λ²κ·Έλ₯Ό λ³΄κ³ ν΄ μ£Όμ @vt-altμκ² κ°μ¬λ립λλ€.
μλμ κ°μ λ μ΄μμ μν΄ μ κ±°λ μ¬μκΈ°
λΆλͺ ν νκΈ° μν΄ λλ²κΉ λͺ©μ μΌλ‘ 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 μΆλ ₯μ΄ μ¬λ¬ κ°μ§ λ€μν λ°©μμΌλ‘ μ¬μ©λκ³ μλ€λ κ²μ λλ€.
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λ₯Ό ν΅ν΄ λ§κ°ν©λλ€.