ããã
ãŸããlibseccompã«æè¬ããŸããããã¯ãæ°å¹Žåããæ¬çªç°å¢ã§åé¡ãªã䜿çšãããŠãããïŒä»ãŸã§ïŒåé¡ã¯çºçããŠããŸããã ãããã³ãŒãã®ãã°ãªã®ããããã¥ã¡ã³ãã®èª€è§£ãªã®ãããããšãä»ã®äœããªã®ãã¯ããããŸãããããã®1ãæéãããã远跡ããŠç¡é§ã«ããããšããããŸãã
æè¿ãDockerã³ã³ããã®ããã±ãŒãžãã¢ããã°ã¬ãŒãããŸãããããã«ã¯ãlibseccomp 2.3.3ïŒDebianå®å®ãªããžããªã®ããŒãžã§ã³ïŒãã2.4.3ãžã®ã¢ããã°ã¬ãŒããå«ãŸããŠããŸãã ä»ã«ãã¢ããã°ã¬ãŒããããã·ã¹ãã ããã±ãŒãžããããŸããããç§ã¯ããããèšé²ããŸããã§ããã ç§ãã¡ã®ã«ãŒãã«ã¯ã¢ããã°ã¬ãŒããããŠããããããŒãžã§ã³4.19.0-8-amd64ã§ãã
SCMP_ACT_TRACE
ã䜿çšããlibseccompã®ç䌌çªå·ã§ã¯ãªãããã€ãã£ãã®syscallçªå·ã䜿çšããŠè¿œå ãããSCMP_ACT_ALLOW
ã«ãŒã«ã®ã¿ã§æ§æããããã£ã«ã¿ãŒãäœæããŸãã å¥ã®64ããããã€ããªãexec
ããåã«ãseccompãã£ã«ã¿ãŒããã«ãããŠããŒããã64ããããã«ããŒããã»ã¹ããã©ãŒã¯ããŸãã
åèãŸã§ã«ãããã¯ã seccomp_rule_add
ããã¥ã¢ã«ããŒãžãšåæ§ã®ãšã©ãŒãã§ãã¯ã䜿çšãããseccompåæåã«ãŒãã³å
šäœã§ãã
ãã ãã seccomp_load
åŒã³åºãã§ã¯ãããã»ã¹ã®åæåã®1 / 100,000ã®ãªãŒããŒã§-EINVAL
ãè¿ããå§ããŠããŸãã ïŒç¢ºå®ã«åçŸã§ããªãããããããã°ãé¢åã«ãªããŸãããïŒãã®éãã¢ããªã±ãŒã·ã§ã³ã«ã³ãŒãã®å€æŽã¯ãããŸããã§ããã ãã£ã«ã¿ã«è¿œå ãããã·ã¹ãã ã³ãŒã«ã¯ããã¹ãŠã®å®è¡ã§åäžã§ãã
äœãããŸããããªãå¯èœæ§ããããïŒãŸãã¯äœãããŸããããªãããããã«æãäžããæ¹æ³ïŒããŸãã¯ãããäœããã®åœ¢ã§äºæ³ããããã©ããã«ã€ããŠã®ã¢ã€ãã¢ã¯ãããŸããïŒ åçãªå¯åéšåã¯ããã»ã©å€ããªãããªããããçºçããã®ãã«ã€ããŠã®ããã¥ã¡ã³ãã«ã¯äœãèŠã€ãããŸããã§ããã
ããã«ã¡ã¯@Xyene ã
seccomp_loadïŒïŒã³ãŒããã¹ã§-EINVALãè¿ãå Žæã¯å€ããããŸããã libseccomp v2.4.3ã³ãŒãã®ç°¡åãªèª¿æ»ã«åºã¥ããšãç¡å¹ãªscmp_filter_ctx
ãããã£ã«ã¿ãŒãããŒãããprctl(...)
åŒã³åºãã«ã€ããŠã«ãŒãã«ãæå¥ãèšã£ãŠããããšãåå ã®ããã§ãã
v2.4.3ãäžè¬çã«æ©èœããã«ãŒãã«ãå€æŽããŠããªãããšãèãããšã prctl(...)
åŒã³åºãããç¡å¹ãªãã£ã«ã¿ãŒã³ã³ããã¹ãã«ã€ãªããåå ã§ãããã©ããã¯çãããããã§ãã ã¢ããã°ã¬ãŒã以éãããã°ã©ã ã«ä»ã®å¥åŠãªåäœãããããšã«æ°ã¥ããŸãããïŒ åé¡ãåŒãèµ·ãããŠããä»ã®å Žæã§ã¡ã¢ãªç Žæã®åé¡ããããã©ããçåã«æããŸãã
libseccompã«é害ãããå¯èœæ§ã¯åžžã«ãããŸããããã¹ãŠã®ååž°ãã¹ãã®valgrindå®è¡ãããã³clangãšCoverityã®äž¡æ¹ã䜿çšããéçåæãå«ãäžé£ã®ãã§ãã¯ãéããŠãåãªãªãŒã¹ãå®è¡ããŸãã
ãŸããããã¯v2.4.3ã«ã¯åœ¹ç«ã¡ãŸããããã»ãŒæºåãæŽã£ãv2.5.0ãªãªãŒã¹ã§ç®æšãšããŠããæ¹åã®1ã€ã¯ãããã¥ã¡ã³ããšãšã©ãŒã³ãŒãã®åŠçã®æ¹åã§ãã
æè¿ãDockerã³ã³ããã®ããã±ãŒãžãã¢ããã°ã¬ãŒãããŸãããããã«ã¯ãlibseccomp 2.3.3ïŒDebianå®å®ãªããžããªã®ããŒãžã§ã³ïŒãã2.4.3ãžã®ã¢ããã°ã¬ãŒããå«ãŸããŠããŸãã ä»ã«ãã¢ããã°ã¬ãŒããããã·ã¹ãã ããã±ãŒãžããããŸããããç§ã¯ããããèšé²ããŸããã§ããã ç§ãã¡ã®ã«ãŒãã«ã¯ã¢ããã°ã¬ãŒããããŠããããããŒãžã§ã³4.19.0-8-amd64ã§ãã
ã³ãŒããšåºç€ãšãªãã«ãŒãã«ãå€æŽãããŠããªãããšã確èªããŠããã ãããããšãããããŸãã ããã¯åé¡ã远跡ããã®ã«åœ¹ç«ã€ã¯ãã§ãã
åèãŸã§ã«ãããã¯ã
seccomp_rule_add
ããã¥ã¢ã«ããŒãžãšåæ§ã®ãšã©ãŒãã§ãã¯ã䜿çšãããseccompåæåã«ãŒãã³å šäœã§ãã
ããªãã®ãã£ã«ã¿ãŒã¯ç§ã«ã¯åççã«èŠããŸãã
äœãããŸããããªãå¯èœæ§ããããïŒãŸãã¯äœãããŸããããªãããããã«æãäžããæ¹æ³ïŒããŸãã¯ãããäœããã®åœ¢ã§äºæ³ããããã©ããã«ã€ããŠã®ã¢ã€ãã¢ã¯ãããŸããïŒ åçãªå¯åéšåã¯ããã»ã©å€ããªãããªããããçºçããã®ãã«ã€ããŠã®ããã¥ã¡ã³ãã«ã¯äœãèŠã€ãããŸããã§ããã
v2.4.3 seccomp_load()
ã³ãŒãã調ã¹ãŸããããlibseccompã-EINVAL
æ»ãã³ãŒããçæããå Žæã¯2ã€ãããªããšæããŸãã
seccomp_load()
_gen_bpf_build_bpf()
äžèšã®ãšã©ãŒã¯äž¡æ¹ãšããç¡å¹ãªãã£ã«ã¿ãŒãåå ã§çºçããŸãã ããªãã®ãã£ã«ã¿ãŒã³ãŒãã«åºã¥ããŠãããã¯ç§ã«ã¯ããããããªãããã§ãã
seccomp_set_mode_filter()
ã§ã®ã«ãŒãã«ã®ããã©ã«ãã®æ»ãå€ã¯-EINVAL
ã§ããããšã«æ³šæããŠãã ããããã®ãããã·ã¹ãã äžã®ä»ã®äœããå€æŽããããã®ãã¹ã«é¥ãå¯èœæ§ããããŸãã Dockerã§å®è¡ããŠãããšãã£ããã£ãŠããŸãã ããã©ã«ãã®Dockerseccompãã£ã«ã¿ãŒãç¡å¹ã«ããŸããïŒ
seccomp_load()
ã倱æããåŸãifå
ã®ã³ãŒãã«ãããã°ãè¿œå ããããªãã§ãããã ããšãã°ããã£ã«ã¿ãŒèªäœã®PFCãBPFãåºåããŠãé©åã«èŠããããšã確èªã§ããŸãã seccomp_export_pfc()
ããã³seccomp_export_bpf()
åç
§ããŠãã ããã
v2.4.3
seccomp_load()
ã³ãŒãã調ã¹ããšãããlibseccompã-EINVAL
æ»ãã³ãŒããçæããå Žæã¯2ã€ãããªããšæããŸãã
- 283è¡ç®ã®
seccomp_load()
- 1657è¡ç®ã®
_gen_bpf_build_bpf()
gen_bpf_generate(...)
以äžã§èŠã€ãã£ãé害ã¯ã src / system.cïŒ267ã§sys_filter_load(...)
ã«ãã£ãŠ-ENOMEMã«å¹æçã«çµåãããããšã«æ³šæããŠãã ããã
ãã¡ã¢ãªã®ç Žæãã«æ»ãã®ã¯å«ãã ã ãšãŠãéãã§ãããããã§ã¯ãããããããŸããã
è¿ éã§è©³çŽ°ãªè¿ä¿¡ãããããšãïŒ åœŒãã¯æ¢çŽ¢ã®ããã€ãã®éãçã¿åºããŸããïŒslightly_smiling_faceïŒ
ã¢ããã°ã¬ãŒã以éãããã°ã©ã ã«ä»ã®å¥åŠãªåäœãããããšã«æ°ã¥ããŸãããïŒ åé¡ãåŒãèµ·ãããŠããä»ã®å Žæã§ã¡ã¢ãªç Žæã®åé¡ããããã©ããçåã«æããŸãã
ããããããã ãã§ãã ç§ãã¡ã®ãŠããããã¹ããšçµ±åãã¹ãã¯åŒãç¶ãåæ Œãããã®éåžžã«ãŸããªEINVAL
ãé€ããŠããšã©ãŒã¯è£œåã«èšé²ãããŠããŸããã ããã¯ç¢ºãã«ãããäžå¯è§£ã«ããŸãã ç§ãã¡ã¢ãªã®ç Žæãçã£ããããããè£ä»ãã蚌æ ãèŠã€ããããšãã§ããªãã£ãïŒslightly_frowning_faceïŒ
ããå°ãã³ã³ããã¹ãã«ã€ããŠïŒ
seccomp_init
ãªã©ã®libseccompèªäœããã®ãã®ã§ãããããå
¥åããŠãããšãã«ãç§ã¯èããŸããããã©ãŒã¯åŸã«malloc
ã䜿çšããã®ã¯å®å
šã§ã¯ãªããšãããã©ãŒã¹ããŒãªãŒãèããããšããããŸãããlibseccompèªäœã«ããã€ããããŸãã Pythonã¢ããªèªäœã¯ãã«ãã¹ã¬ããã§ããããã€ãã£ãã³ãŒãã§ã¯åžžã«GILãä¿æãããããããã¯å®å
šã§ããå¿
èŠããããŸãïŒïŒïŒã ãã ããmalloc-after-forkã§ãããããã¯ãçºçããŠãããšèããããšããããŸãã ïŒããã«ããã次ã®æ³šæã®ããžãã¹ãseccomp_init
ãã©ãŒã¯ã®åã«ç§»åãããã©ãŒã¯åŸã«seccomp_load
åŒã³åºãã ãã§ããšã©ãŒãçºçãç¶ãããã©ããã確èªã§ãããšæããŸããïŒ
seccomp_loadïŒïŒã倱æããåŸãifå ã®ã³ãŒãã«ãããã°ãè¿œå ããããªãã§ãããã
ææ¡ãããããšãïŒ seccomp_export_pfc
ãžã®åŒã³åºããè¿œå ããå
¥åã®å
容ããã£ã«ã¿ãŒïŒ config->syscall_whitelist
ïŒã«ãã³ãããŸããã 次åããã倱æãããšãã«ãã©ããŒã¢ããããŸãã
ããã«ã¡ã¯@ Xyene-çŽ1é±éã
æ®å¿µãªããããŸã ã§ãã seccomp_export_pfc
ã«ããããè¿œå ããåŸãããã¯ç¡é³ã«ãªããŸããã æšæ¥ãåé¡ãæçµçã«çºçãããšãã«åé¡ããã£ããã£ããããšãæåŸ
ããŠããã®ããããïŒåãªããã¹ãã§ã¯ãªãïŒãã¹ãŠã®VMã«ããã·ã¥ããŸããã
æ²é»ã¯å¥åŠã ãšæããŸããããã¹ãŠã®ãããã°/ãšã¯ã¹ããŒãããžãã¯ã¯seccomp_load
倱æåŸã«çºçãããããä»ã®ãšããå¶ç¶ã«ããããã§ãŒã¯ããŠããŸãããããã£ãŠã倱æèªäœã«åœ±é¿ãäžããããšã¯ãªãã¯ãã§ãã
é²æïŒ
æ²é»ããŠããçç±ã¯ã seccomp_export_bpf
ãsegfaultingã§ããïŒ seccomp_load
åŸã«åŒã³åºãããå Žåã¯ïŒïŒãseccompã®å€±æãæ¢ããŠããå Žæã§ã¯ãªããä»ã®å Žæã§å ±åãããŠããããã§ãã ããã«éèŠãªããšã«ãçŽ150åã®åŒã³åºãã§åé¡ã確å®ã«åçŸã§ããã±ãŒã¹ã«ééãããããé
管äœæ¥ãè¡ãããšã§ãããã€ãã®ã³ã¢ãã³ããæœåºã§ããã¯ãã§ãã
äºè§£ããŸãããã³ã¢ãã³ããåãåºããŸãããããããã¬ãŒã¹ã§ããïŒ https ïŒ
jemallocã®realloc
ã«ãŒãã³å
ã§ã¯ã©ãã·ã¥ããŠãããããããã¯å°ãçããããã®
次ã«ãjemallocãååŸãã -O0
ãšãããã°ã·ã³ãã«ã䜿çšããŠã³ã³ãã€ã«ããè€è£œãåå®è¡ããŸããã ä»åã¯ãåŸã§ã¯ãªãseccomp_load
ã§ã¯ã©ãã·ã¥ããŸããã ãã®ãã¬ãŒã¹ãããã«ã¢ããããŒãããŸããïŒ https ïŒ
ãã®ãã¬ãŒã¹ã®ã¹ããããïŒ
#9 0x00007ff962698495 in free (ptr=0x5a5a5a5a5a5a5a5a) at src/jemalloc.c:2867
No locals.
#10 0x00007ff96062d087 in _program_free (prg=prg@entry=0x7ff95e963010) at gen_bpf.c:511
No locals.
#11 0x00007ff96062f605 in gen_bpf_release (program=program@entry=0x7ff95e963010) at gen_bpf.c:1986
No locals.
#12 0x00007ff96062c04f in sys_filter_load (col=col@entry=0x7ff95e9a5000) at system.c:293
rc = -1
prgm = 0x7ff95e963010
#13 0x00007ff96062b666 in seccomp_load (ctx=ctx@entry=0x7ff95e9a5000) at api.c:286
col = 0x7ff95e9a5000
jemallocãæ€çŽ¢ãããšã 0x5a
ã空ããã€ãã空ããšããŠããŒã¯ããããã«äœ¿çšãããŠããããã«èŠããŸããããã¯ããã§ã«è§£æŸãããŠãããã®ã解æŸããããšããŠããã³ãŒããã¯ã©ãã·ã¥ããããšããç¹å®ã®ç®çã§ãã
v2.4.3ã®gen_bpf.c:511
ã¯æ¬¡ã®ãšããã§ãïŒ https ïŒ
ããããããã°ã©ã ã®åç¶æéã¯sys_filter_load
æ¬äœã«ãããªããããããã¯ããŸãæå³ããããŸããã
ç§ã¯å°ãªããšã1ã€ã®åé¡ãèŠã€ãããšæããŸãã gen_bpf_generate
;
state.bpf = prgm
zmalloc
ã倱æããªãéãã _gen_bpf_build_bpf
ãåŒã³åºããããã®rc
ã«åºã¥ããŠã state.bpf
ãNULL
èšå®ãããŸãã
rc != 0
ã®å Žåãèãããšã _state_release
åŒã³åºãæã«ã state.bpf
ã¯ãŸã prgm
ããŠããŸãã ããã«ããã prgm
ãæãã¡ã¢ãªã解æŸãããŸãã
次ã«ã gen_bpf_generate
ã¯return prgm
ã«ãªããŸããããã¯è§£æŸãããã«ããããããããŒã以å€ã®ãã€ã³ã¿ãŒã®ãŸãŸã§ãã
sys_filter_load
ã«æ»ããšã gen_bpf_generate
ãè¿ããã prgm
ã¯NULL
ãªããããç¶è¡ãããŸãã
æåŸã«ã sys_filter_load
ã®çµããã«ããã§ã«ç¡æã®prgm
ã§gen_bpf_release
ãåŒã³åºãããŸãã
ããã¯ããªã_gen_bpf_build_bpf
ãæåã«å€±æããã®ããšããæžå¿µã«å¯ŸåŠããŠããŸãããã倱æããå Žåã«çºçããå¯èœæ§ã®ããäœãæªãããšã®ããã«èŠããŸãã
ç·šéïŒå®éã«ã¯ãããã¯ããããhttps://github.com/seccomp/libseccomp/commit/3a1d1c977065f204b96293cccfe7d3e5aa0d7aceã®å¯äœçšãšããŠä¿®æ£ããããã
rcïŒ= 0ã®å Žåãèãããšãstate.bpfã¯_state_releaseã®åŒã³åºãæã«ãŸã prgmã«èšå®ãããŠããŸãã ããã«ãããprgmãæãã¡ã¢ãªã解æŸãããŸãã
ãã¯ã¯ïŒ ã°ãããã£ãã@XyeneïŒ
ããã3a1d1c977065f204b96293cccfe7d3e5aa0d7aceãè¶ ããŠä¿®æ£ããå¿ èŠããããšæããŸããããã«ã€ããŠå°ãèããããŠãã ãã...ä¿®æ£ãããã»ã©é£ãããªããšæããŸã...ãããŠãPRãèãåºãããšãã§ãããã©ããã確èªããŠãã ããã
ããã3a1d1c9ãè¶ ããŠä¿®æ£ããå¿ èŠããããšæããŸããããã«ã€ããŠå°ãèããããŠãã ãã...ä¿®æ£ãããã»ã©é£ãããªããšæããŸã...ãããŠãPRãèãåºãããšãã§ãããã©ããã確èªããŠãã ããã
ãã£ãšãç§ããããæžãããšããç§ã¯å€ãã³ãŒããèŠãŠããŸããã ã¯ãã3a1d1c9ã§ãããä¿®æ£ããããšæããŸãããrelease-2.4ãã©ã³ãã®ããããå¿ èŠã«ãªããŸãã ä»ããåãçµãã§ãããŸãã
_ïŒã¡ã¿ïŒç§ã¯ãã®ã¡ãã»ãŒãžã調æ»çµæã§æŽæ°ãç¶ããã€ãããªã®ã§ãã¡ãŒã«ã§ã¹ãã ãéä¿¡ããã«ããããæžãçããå ŽæããããŸãïŒïŒ_
äºè§£ããŸãããããããé©çšããŠ2.4.3ã«æ»ããšã倱æããŠãããã£ã«ã¿ãŒãåŒãåºãããšãã§ããŸããïŒ link ã
å ±åãããåå ã¯ãä»ããENOMEM
ã®ä»£ããã«EINVAL
Iã®æšæž¬ã¯ããšãèãããšäºæ³ããã _gen_bpf_build_bpf
倱æããè¿ããŠããNULL
ããã°ã©ã ãã ãã ããPFCã¯æ£åžžã«å°å·ãããŸãã _gen_bpf_build_bpf
ã®æ»ãå€ãå ±åããããã«seccompã³ãŒããå€æŽãããšãåå ãšããŠEFAULT
ããŸãã
è¿
éãªããã¯ãšããŠãç§ã¯èµ°ã£ã:%s/return -EFAULT/abort()
以äžsrc/gen_bpf.c
ããã®ã¹ã¿ãã¯ãã¬ãŒã¹ãæœåºããããšãã§ããŸããïŒ
EFAULTã¹ã¿ãã¯ãã¬ãŒã¹
(gdb) bt full
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
set = {__val = {0, 140084028365964, 140083248439464, 140083248438968, 140083248431088, 140084028368143, 28659884033, 140083965300736,
140083248439464, 140083248438968, 140083248431088, 140084028351031, 140084019988760, 140083248439624, 140083248431200, 140084028372597}}
pid = <optimized out>
tid = <optimized out>
ret = <optimized out>
#1 0x00007f67daa4d55b in __GI_abort () at abort.c:79
save_stage = 1
act = {__sigaction_handler = {sa_handler = 0x7f67d6f3eec0, sa_sigaction = 0x7f67d6f3eec0}, sa_mask = {__val = {140083965300736,
140083965300736, 0, 0, 140083248438968, 140083248438968, 140083248439464, 140083248431504, 140084028417173, 140083964793344,
140083965300736, 140083248431552, 140083994791895, 140083248431552, 140083994787642, 140083965300736}}, sa_flags = -1404894496,
sa_restorer = 0x0}
sigs = {__val = {32, 0 <repeats 15 times>}}
#2 0x00007f67d8bfd455 in _gen_bpf_build_bpf (state=0x7f67ac4302e0, col=0x7f67d6f63040) at gen_bpf.c:1943
rc = 0
iter = 1
h_val = 1425818561
res_cnt = 0
jmp_len = 0
arch_x86_64 = 0
arch_x32 = -1
instr = {op = 32, jt = {tgt = {imm_j = 0 '\000', imm_k = 0, hash = 0, db = 0x0, blk = 0x0, nxt = 0}, type = TGT_NONE}, jf = {tgt = {
imm_j = 0 '\000', imm_k = 0, hash = 0, db = 0x0, blk = 0x0, nxt = 0}, type = TGT_NONE}, k = {tgt = {imm_j = 4 '\004', imm_k = 4,
hash = 4, db = 0x4, blk = 0x4, nxt = 4}, type = TGT_K}}
i_iter = 0x7f67d6fdcb60
b_badarch = 0x7f67d6fd9000
b_default = 0x7f67d6fd9060
b_head = 0x7f67d6fda1a0
b_tail = 0x7f67d6fd9000
b_iter = 0x0
b_new = 0x7f67d6fe3300
b_jmp = 0x0
db_secondary = 0x0
pseudo_arch = {token = 0, token_bpf = 0, size = ARCH_SIZE_UNSPEC, endian = ARCH_ENDIAN_LITTLE, syscall_resolve_name = 0x0,
syscall_resolve_num = 0x0, syscall_rewrite = 0x0, rule_add = 0x0}
#3 0x00007f67d8bfd560 in gen_bpf_generate (col=0x7f67d6f63040) at gen_bpf.c:1971
rc = 0
state = {htbl = {0x0 <repeats 256 times>}, attr = 0x7f67d6f63044, bad_arch_hsh = 889798935, def_hsh = 742199527, arch = 0x7f67ac4301e0,
bpf = 0x7f67d6f64010}
prgm = 0x7f67d6f64010
#4 0x00007f67d8bf64a7 in sys_filter_load (col=0x7f67d6f63040) at system.c:265
rc = 32615
prgm = 0x0
#5 0x00007f67d8bf4f10 in seccomp_load (ctx=0x7f67d6f63040) at api.c:287
col = 0x7f67d6f63040
ããã¯1943è¡ã«å¯Ÿå¿ããŠããŸãã
眮æã®æ§è³ªãèãããšããã«ããŒé¢æ°ã®EFAULT
ã¯æåã«äžæ¢ããããããé€å€ã§ãããšæããŸãã
ãã®åŸãHEADã§åããã®ãåçŸããŠã¿ãŸããããããã§ãçºçããŸãã 次ã«ã %s:/goto build_bpf_free_blks/abort()
ãç¹°ãè¿ããŸãã åå ã¯æ¬¡ã®ãšããã§ãã
ãããããããšã«ããã®é¢æ°ã¯çããé害ç¹ã¯ã»ãã®äžæ¡ãã§ããã åŸã§abort
æ¿å
¥ã®å¥ã®ã©ãŠã³ãã
çè·¡
(gdb) bt full
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
set = {__val = {0, 140050183343588, 0, 448, 140049402494880, 140049402509040, 140049402494832, 140050183342988, 140049402495088,
140049402509040, 140049402494896, 140050183343588, 4294967296, 140049402509040, 140049402509040, 140049402509040}}
pid = <optimized out>
tid = <optimized out>
ret = <optimized out>
#1 0x00007f5ff953055b in __GI_abort () at abort.c:79
save_stage = 1
act = {__sigaction_handler = {sa_handler = 0x7f5ff595d260, sa_sigaction = 0x7f5ff595d260}, sa_mask = {__val = {139642271694862,
140050119389792, 0, 0, 140049402502840, 0, 140049402503336, 140049402502888, 140049402502840, 112, 384, 140049402502840, 140050149861504,
140049402495328, 140050149857273, 392}}, sa_flags = 448, sa_restorer = 0x7f5ff595d240}
sigs = {__val = {32, 0 <repeats 15 times>}}
#2 0x00007f5ff76edee5 in _bpf_append_blk (prg=0x7f5ff5964010, blk=0x7f5ff59df1a0) at gen_bpf.c:452
rc = -12
i_new = 0x0
i_iter = 0x7f5ff59fa178
old_cnt = 48
iter = 1
#3 0x00007f5ff76f3716 in _gen_bpf_build_bpf (state=0x7f5fcae302d0, col=0x7f5ff59c5000) at gen_bpf.c:2223
rc = 0
iter = 1
h_val = 1425818561
res_cnt = 0
jmp_len = 0
arch_x86_64 = 0
arch_x32 = -1
instr = {op = 32, jt = {tgt = {imm_j = 0 '\000', imm_k = 0, hash = 0, db = 0x0, blk = 0x0, nxt = 0}, type = TGT_NONE}, jf = {tgt = {
imm_j = 0 '\000', imm_k = 0, hash = 0, db = 0x0, blk = 0x0, nxt = 0}, type = TGT_NONE}, k = {tgt = {imm_j = 4 '\004', imm_k = 4,
hash = 4, db = 0x4, blk = 0x4, nxt = 4}, type = TGT_K}}
i_iter = 0x7f5ff59e1b60
b_badarch = 0x7f5ff59de000
b_default = 0x7f5ff59de060
b_head = 0x7f5ff59df1a0
b_tail = 0x7f5ff59de000
b_iter = 0x7f5ff59df1a0
b_new = 0x7f5ff59e8300
b_jmp = 0x7f5ff59df0e0
db_secondary = 0x0
pseudo_arch = {token = 0, token_bpf = 0, size = ARCH_SIZE_UNSPEC, endian = ARCH_ENDIAN_LITTLE, syscall_resolve_name = 0x0,
syscall_resolve_num = 0x0, syscall_rewrite = 0x0, rule_add = 0x0}
#4 0x00007f5ff76f3874 in gen_bpf_generate (col=0x7f5ff59c5000, prgm_ptr=0x7f5fcae30b40) at gen_bpf.c:2270
rc = 0
state = {htbl = {0x0, 0x7f5ff593ef80, 0x7f5ff593efe0, 0x7f5ff593efc0, 0x0, 0x7f5ff595d000, 0x7f5ff593ef60, 0x7f5ff593ef00,
0x0 <repeats 248 times>}, attr = 0x7f5ff59c5004, bad_arch_hsh = 889798935, def_hsh = 742199527, bpf = 0x7f5ff5964010,
arch = 0x7f5fcae301c0, b_head = 0x7f5ff59e8300, b_tail = 0x7f5ff59de120, b_new = 0x7f5ff59e8300}
prgm = <optimized out>
#5 0x00007f5ff76eb275 in sys_filter_load (col=0x7f5ff59c5000, rawrc=false) at system.c:307
rc = 0
prgm = 0x0
#6 0x00007f5ff76e9505 in seccomp_load (ctx=0x7f5ff59c5000) at api.c:386
col = 0x7f5ff59c5000
rawrc = false
ããã¯ã§ãã®ã§ã realloc
åã³å€±æãããã³_bpf_append_blk
æ»ã£ãŠãã-ENOMEM
ã§ãã¹ã¯ãããŸããã®_gen_bpf_build_bpf
ãšåã-EFAULT
ã ããã¯å€§ããããšã§ã¯ãããŸããããããè¯ããšã©ãŒå ±åã¯2.5ã®ç®æšã§ãããšãã£ããã£ãŠããã®ã§ãããã¯ç¯å²å
ã«ããããã«èŠããã®ã§ãèšåããããšæããŸãïŒslightly_smiling_faceïŒ
GDBããããããŸããïŒ
(gdb) f 2
#2 0x00007f5ff76edee5 in _bpf_append_blk (prg=0x7f5ff5964010, blk=0x7f5ff59df1a0) at gen_bpf.c:452
452 abort();
(gdb) info args
prg = 0x7f5ff5964010
blk = 0x7f5ff59df1a0
(gdb) print prg->blks
$4 = (bpf_instr_raw *) 0x7f5ff59fa000
(gdb) x/32bx &prg->blks
0x7f5ff5964018: 0x00 0xa0 0x9f 0xf5 0x5f 0x7f 0x00 0x00
0x7f5ff5964020: 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
0x7f5ff5964028: 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
0x7f5ff5964030: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
(gdb) print ((prg)->blk_cnt * sizeof(*((prg)->blks)))
$5 = 392
(gdb) print prg->blk_cnt
$6 = 49
ããã¯æ¬åœã«ã¢ãã±ãŒã¿ã®å€±æã®ããã«èŠãå§ããŸã...
ããããã®è©±ã¯ã€ãã«ãã®_ã¹ãªãªã³ã°ãª_çµè«ã«éããŸããâäœãèµ·ãã£ãŠããã®ããç解ããä¿®æ£ãæ€èšŒããŸããïŒslightly_smiling_faceïŒ
ããã¯é¢çœã話ã«ãªããããããªãã®ã§ãããã«ãããŸãïŒ
ã¯ãŒã«ãŒããã©ãŒã¯ãªãããäž»ãªããã»ã¹ã¯ãéåžžãæ倧80MBã®RSSã«ãããŸãã ãã©ãŒã¯ããåŸã rlimit
ãä»ããŠã¡ã¢ãªäœ¿çšéã64MBã«å¶éããŸãã ããã«ãããçŸåšã®ã¡ã¢ãªäœ¿çšéãå¶éãè¶
ããäœçœ®ã«é
眮ãããŸãããããã¯rlimit
èš±å¯ãããŠããŸãã ã»ãšãã©ã®å Žåãã¡ã¢ãªã¢ãã±ãŒã¿ã«ã¯ãã«ãŒãã«ããã®è¿œå èŠæ±ãªãã«libseccompã®åæåã«ãŒãã³ãåŠçããã®ã«ååãªç©ºãã¡ã¢ãªããããŸãã ããããããã_ããªã_å Žåãè¿œå ã®ã¢ãªãŒããªã©ã®ããã«ã¹ããŒã¹ãèŠæ±ããå¿
èŠãããå Žåãããã»ã¹ã¯ãã§ã«å¶éãè¶
ããŠãããããã«ãŒãã«ã¯ãããæäŸããŸããã
2.4.3ã§ã¯ããã®ã¡ã¢ãªååŸã®å€±æã¯EINVAL
ãšããã«ããªãŒã§çŸããŸããã ãã¹ã¿ãŒãã¹ã-https ïŒ//github.com/seccomp/libseccomp/commit/3a1d1c977065f204b96293cccfe7d3e5aa0d7aceã§ã¯ã代ããã«EFAULT
ãå ±åãããŸãã https://github.com/seccomp/libseccomp/pull/257ãé©çšãããšã ENOMEM
ãæ£ããå ±åãããŸãã
ããããã£ãã«èµ·ãããªãçç±ã¯ããã®åŸæããã«ãªããŸããããã¯ãã«ãŒãã«ã«è¿œå ãèŠæ±ããã«BPFããã°ã©ã ãæ§ç¯ããã®ã«ååãªã¡ã¢ãªãã¢ãã±ãŒã¿ã«ãããã©ããã«å®å
šã«äŸåããŠããŸãã glibcã®ã¢ãã±ãŒã¿ã¯ãæçåã®èç©ãèš±å¯ããããšã«ã€ããŠããç·©ãã®ã§ããããé©åãªå Žæã§çºçããããšã¯ãããŸããã§ããã jemallocã¯ããå³ããå¢çãèšå®ãã seccomp_load
éã«ã¡ã¢ãªãèŠæ±ããå¿
èŠãããå¯èœæ§ãé«ããŸãâçµæãšããŠçããé害ã«æ°ä»ãã®ã«ååã§ãããããã§ã远跡ããã®ã¯è
¹ç«ãããã§ãã
ãããã£ãŠãä¿®æ£ã¯ããã¹ãŠã®setrlimit
åŒã³åºãã_after_ seccomp_load
ã§ãã ããããããšã§ã realloc
ã_bpf_append_blk
ã§å€±æããªããªãããã£ã«ã¿ãŒãæ£åžžã«ããŒããããŸãã ããã¯ããã£ã«ã¿ãŒãsetrlimit
ãèš±å¯ããå¿
èŠãããããšãæå³ããŸãããç§ã®å Žåã¯ããã§åé¡ãããŸããhttps://github.com/seccomp/libseccomp/issues/123ã®ãããªãã®ã§è§£æ±ºããããšæã
@ pcmoore ã @ drakenclimber-ãã®åé¡ã®ãããã°ã«ãååããã ãããããšã
ãã®ãã°ã¯ãã³ãããhttps://github.com/seccomp/libseccomp/commit/c0a6e6fd15f74c429a0b74e0dfd4de5a29aabebdã«ãã£ãŠä¿®æ£ãããŸãã
æãåèã«ãªãã³ã¡ã³ã
æ®å¿µãªããããŸã ã§ãã
seccomp_export_pfc
ã«ããããè¿œå ããåŸãããã¯ç¡é³ã«ãªããŸããã æšæ¥ãåé¡ãæçµçã«çºçãããšãã«åé¡ããã£ããã£ããããšãæåŸ ããŠããã®ããããïŒåãªããã¹ãã§ã¯ãªãïŒãã¹ãŠã®VMã«ããã·ã¥ããŸãããæ²é»ã¯å¥åŠã ãšæããŸããããã¹ãŠã®ãããã°/ãšã¯ã¹ããŒãããžãã¯ã¯
seccomp_load
倱æåŸã«çºçãããããä»ã®ãšããå¶ç¶ã«ããããã§ãŒã¯ããŠããŸãããããã£ãŠã倱æèªäœã«åœ±é¿ãäžããããšã¯ãªãã¯ãã§ãã