åé¡ïŒ249ãç¹ã«ãã®ã³ã¡ã³ããåç §ããŠãã ããïŒ
å®éã«çæãããbpfã«ååšããªãsyscall4294957285ããã§ãã¯ããã®ã¯ãªãã§ããïŒ
ãã¹ãã§ã¯ãªãã以åã¯ããããŠããŸããã§ããããçŸåšã®libseccompã«ã¯ãã°ãããããã§ãã
ãã®ãã°ãå ±åããŠããã@ vt-altã®å瞟ã§ãã
以äžã®æ¹åããããã©ãããåªå ããŠåé€ããããªãããã¥ãŒãµãŒ
æ確ã«ããããã«ããããã°ã®ç®çã§ãPFCã§ç䌌ã·ã¹ãã ã³ãŒã«ãçºè¡ããå¿ èŠããããŸãããïŒåœ¹ã«ç«ããªãïŒBPFãã£ã«ã¿ãŒã«ãŒã«ãçºè¡ããã¹ãã§ã¯ãããŸããã
ã¬ããŒãããåé¡ãäœæããŠããã ãããããšãããããŸãã
æ確ã«ããããã«ããããã°ã®ç®çã§ãPFCã§ç䌌ã·ã¹ãã ã³ãŒã«ãçºè¡ããå¿ èŠããããŸãããïŒåœ¹ã«ç«ããªãïŒBPFãã£ã«ã¿ãŒã«ãŒã«ãçºè¡ããã¹ãã§ã¯ãããŸããã
ãããèãçŽããŠãã ããã ããã¯ãPFCãBPFãåæ ããªãå Žåã«ã®ã¿ãäºæ ãè€éã«ããææ§ã«ããã ãããšç§ã¯ä¿¡ããŠããŸãã
ãããèãçŽããŠãã ããã ããã¯ãPFCãBPFãåæ ããªãå Žåã«ã®ã¿ãäºæ ãè€éã«ããææ§ã«ããã ãããšç§ã¯ä¿¡ããŠããŸãã
ã·ã¹ãã ã³ãŒã«ãPFCã«ãªãå Žåãã©ã€ãã©ãªãïŒååšããªãïŒã·ã¹ãã ã³ãŒã«ã®ãã£ã«ã¿ãŒãè¿œå ã§ããªãã£ãæ¹æ³ã«ã€ããŠèª¬æããåœã®ãã°ã¬ããŒããå€æ°å±ããŸãã
ç䌌ã·ã¹ãã ã³ãŒã«ã®æŠå¿µãç解ããŠãã人ã«ãšã£ãŠã¯ãPFCåºåããããããåé€ããã®ã¯ç°¡åãªããšã§ãã ãŸããPFCåºåã¯BPFåºåã®æ£ç¢ºãªã³ããŒãæå³ãããã®ã§ã¯ãªããåã«ãããã°ããŒã«ãšããŠååšããçæããããã£ã«ã¿ãŒã³ãŒããèŠèŠåããç°¡åãªæ¹æ³ãšããŠååšããŸãã
çæããããã£ã«ã¿ãŒã³ãŒããèŠèŠåããç°¡åãªæ¹æ³
ãã ããçæãããã³ãŒãã«ã¯ç䌌ã·ã¹ãã ã³ãŒã«ãååšããªãããã_çæããã_ãã£ã«ã¿ãŒã³ãŒãã¯èŠèŠåãããŸããã
ã·ã¹ãã ã³ãŒã«ã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ã®ããè¯ãè¿äŒŒãåŸãããšãã§ããŸãã
_UPDATEDïŒTSKIPã®åé¡ãä¿®æ£ããŸãã_
ãŸã å®å šã«ã¯ãã¹ããããŠããŸããããããã¯ä¿®æ£ãããå¯èœæ§ããããŸã-ããã平衡ããªãŒæé©åã¢ã«ãŽãªãºã @drakenclimberã«ãšã£ãŠåŠ¥åœã§ããããšã確èªã§ããŸããïŒ
ããŸãããã ãã®ã·ããªãªãåçŸããèªåãã¹ããäœæã§ãããã©ããã確èªããããšæããŸãã
_UPDATEDïŒTSKIPã®åé¡ãä¿®æ£ããŸãã_
ãŸã å®å šã«ã¯ãã¹ããããŠããŸããããããã¯ä¿®æ£ãããå¯èœæ§ããããŸã-ããã平衡ããªãŒæé©åã¢ã«ãŽãªãºã @drakenclimberã«ãšã£ãŠåŠ¥åœã§ããããšã確èªã§ããŸããïŒããŸãããã ãã®ã·ããªãªãåçŸããèªåãã¹ããäœæã§ãããã©ããã確èªããããšæããŸãã
ãããŠãã¡ãããç§ã¯ããªããäžã§æã£ãŠããåçåšãã¹ãããå§ããŸãã ããããšãïŒ
_UPDATEDïŒ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ã¯ããããæšæºã®æé©åãããããªãŒã®äžŠã¹æ¿ãã«å€§ããªåœ±é¿ãäžããããšãèæ ®ããŠããŸãããã®åé¡ãåãäžããŸããïŒ äžã«ã³ããŒããŠè²Œãä»ããã³ãŒãããæå³ã®ããç¯å²ã§èªç±ã«çãã§ãã ããã
é¢ä¿ãªãããã¹ãã ãšæãããšã®1ã€ã¯ããarch-arm.cããšãarch-x32.cãã®å€æŽãããçã«ããªã£ãŠããããšã§ãã
ãããããPFCããžãã¯ã«--no-pseudo-syscallsãã©ã°ãè¿œå ã§ããŸããïŒ
ãã®æã¯ã©ãã«è¡ããŸããïŒ ãã«ãæã®ãªãã·ã§ã³ãšããŠãããæãã§ããªããšæããŸãã ãã£ã«ã¿ãªãã·ã§ã³ãè¿œå ã§ãããšæããŸãããããŸãè奮ããŠããŸããã ç§ã¯PFCã®ç䌌ã·ã¹ãã ã³ãŒã«ã«åºå·ããããšã«æ祚ããŸãããä»ã®ãšããBPFããåé€ããŸãïŒæããã«ïŒãå°æ¥ã®ããæç¹ã§ãããæ¡åŒµããå¿ èŠãããå Žåã¯å¯èœã§ãã
æã£ãåã«ã¿ã€ãããããšã¯èªããŸãã ;ïŒ
ãããããã¯ãã£ã«ã¿ãŒãªãã·ã§ã³ã§ãªããã°ãªããªãã§ãããããããŠããã¯ééã£ãŠãããšæããŸãã åæããŸã; äžã§æŠèª¬ããããã«ããŸãããã åŒãç¶ã質åãããã°ãå蚪ããããšãã§ããŸãã
ç§ããŸã å®å šã«å€æŽããã¹ãããŠããŸãã:)ããç䌌ã·ã¹ãã ã³ãŒã«ãåé€ããŠãã€ããªããªãŒãæ©èœãããã«ã¯ããã®ãããªãã®ãå¿ èŠã«ãªããšç¢ºä¿¡ããŠããŸãã ç§ã¯ããã䜿çšããŠBPFäºåæšãçæããŸããããããŠããã¯åççã«èŠããŸãã æ¬çªç°å¢ã«å¯Ÿå¿ãããœãªã¥ãŒã·ã§ã³ã«è¿ã¥ããããå®å šã«æ€èšŒããŸãã
ãããããªãŒã®æé©åãå£ããŠããŸãã®ã§ã¯ãªãããšæããŸããã
@drakenclimberã¯ããããæšæºã®æé©åãããããªãŒã®äžŠã¹æ¿ãã«å€§ããªåœ±é¿ãäžããããšãèæ ®ããŠããŸãããã®åé¡ãåãäžããŸããïŒ äžã«ã³ããŒããŠè²Œãä»ããã³ãŒãããæå³ã®ããç¯å²ã§èªç±ã«çãã§ãã ããã
é¢ä¿ãªãããã¹ãã ãšæãããšã®1ã€ã¯ããarch-arm.cããšãarch-x32.cãã®å€æŽãããçã«ããªã£ãŠããããšã§ãã
ãã¡ããã ç§ã¯ãããææããããšãã§ããŸãã
@drakenclimber ">åè¿°ã®ããã«ãããã¯ãæ°ããïŒããïŒãŠãŒã¶ãŒããã£ã«ã¿ãŒã倧ãŸãã«æ€èšŒããããã®ç°¡åãªæ¹æ³ã§ããã
ãç䌌ã·ã¹ãã ã³ãŒã«ãã¯ã«ãŒãã«ã«ååšãããããç¥ãããæŠå¿µã§ããããŸããã ããã¯çŽç²ã«libseccompã®çºæã§ãããããã§ã¯èª¬æããŸããã ãããã¯è² ã®æ°ã§ãããæå®ãããsyscallãã¢ãŒããã¯ãã£ã«ååšããªãå Žåã«è¡šç€ºããããšè¿°ã¹ãã ãã§ãã ããã¯ååšããªãã·ã¹ãã ã³ãŒã«ãšã©ãéãã®ã§ããïŒ åœŒãã¯ã©ã®ãããªç®çã§åŠå®çã§ããïŒ ç䌌ã·ã¹ãã ã³ãŒã«ã®æŠå¿µã¯ãæ°ãããŠãŒã¶ãŒã«ãšã£ãŠã¯æ¬åœã«æ··ä¹±ãæããŸãã
æ°ããïŒããïŒãŠãŒã¶ãŒããååšããªãã·ã¹ãã ã³ãŒã«ããã£ã«ã¿ãŒã§ãã§ãã¯ãããŠããã®ãèŠãããšæã£ãŠãããªããŠä¿¡ããããŸããã
ããäžç¹ä»ãå ããããŠããã ããŸãã ããã¯ãã¹ãŠã»ãã¥ãªãã£ã®åéã§ããã泚ææ·±ã詳现ãªç解ã®ã¿ãæ©èœããŸãã ïŒç䌌ã·ã¹ãã ã³ãŒã«ã®ïŒæ°ãããããŸããªæŠå¿µãšãè¡šçŸïŒbpfãšpfcïŒã®éããäœæããŸãã ããã¯æ¬åœã«æ°ãããŠãŒã¶ãŒãæ··ä¹±ãããããã®ãã®ã§ããïŒ
@ vt-altæžå¿µãè¡šæããŠããã ãããããšãããããŸãããv2.5.0ãªãªãŒã¹ã§ã¯ãBPFãã£ã«ã¿ãŒããã®ç䌌ã·ã¹ãã ã³ãŒã«ãæå¶ããåŒãç¶ãPFCãã£ã«ã¿ãŒã«è¡šç€ºããŸãã ãã®æ±ºå®ã«åæã§ããªãå Žåãããããšã¯æ¿ç¥ããŠãããŸããããã®æ±ºå®ãå°éããŠããã ããŸããããé¡ãããããŸãã å°æ¥ã®ãªãªãŒã¹ã§ã¯ãç䌌ã·ã¹ãã ã³ãŒã«ã®èåŸã«ããç®çïŒè€æ°ã®ABIãµããŒãçšïŒã説æãããã³ããŒãžã«ææžåããããšã§ãããè¯ãä»äºãããäºå®ã§ãã ãã®ããã®åé¡ãäœæããŸããïŒä»¥äžã®ãªã³ã¯ïŒããã®ãã£ã¹ã«ãã·ã§ã³ãšçµæãšããŠçããPRã«åå ããããšãæè¿ãã奚å±ããŸãã å°æ¥çã«ã¯PFCãã£ã«ã¿ãŒãžã®ã¢ãããŒããä¿®æ£ããããšãå¯èœã§ãããããã§ã¯äœãçŽæããããããŸããã
ç¹°ãè¿ãã«ãªããŸãããBPFã®åé¡ã«æ³šæãåããŠããã ãããããšãããããŸãã ããªãã¯æ¬¡ã®libseccompãªãªãŒã¹ãæ¹åããã®ãæäŒã£ãŠãããŸããïŒ
ïŒ264ã§ç· ãããããŸãã