Libseccomp: バグgen_bpf_generateが倱敗を適切に凊理しない

䜜成日 2020幎05月28日  Â·  15コメント  Â·  ゜ヌス: seccomp/libseccomp

やあ、

たず、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が返され始めおいたす。 確実に再珟できないため、デバッグが面倒になりたした。この間、アプリケヌションにコヌドの倉曎はありたせんでした。 フィルタに远加されたシステムコヌルは、すべおの実行で同䞀です。

䜕がうたくいかない可胜性があるかたたは䜕がうたくいかないかをさらに掘り䞋げる方法、たたはこれが䜕らかの圢で予想されるかどうかに぀いおのアむデアはありたすか 動的な可動郚品はそれほど倚くなく、なぜこれが発生するのかに぀いおのドキュメントには䜕も芋぀かりたせんでした。

bug prioritmedium

最も参考になるコメント

残念ながら、ただです。 seccomp_export_pfcにパッチを远加した埌、それは無音になりたした。 昚日、問題が最終的に発生したずきに問題をキャプチャするこずを期埅しお、そのパッチを単なるテストではなくすべおのVMにプッシュしたした。

沈黙は奇劙だず思いたすが、すべおのデバッグ/゚クスポヌトロゞックはseccomp_load倱敗埌に発生するため、今のずころ偶然にそれをチョヌクしおいたす。したがっお、倱敗自䜓に圱響を䞎えるこずはないはずです。

党おのコメント15件

こんにちは@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_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぀しかないず思いたす。

gen_bpf_generate(...)以䞋で芋぀かった障害は、 src / system.c267でsys_filter_load(...)によっお-ENOMEMに効果的に結合されるこずに泚意しおください。

「メモリの砎損」に戻るのは嫌いだ。 ずおも速いですが、ここではそうかもしれたせん。

迅速で詳现な返信をありがずう 圌らは探玢のいく぀かの道を生み出したしたslightly_smiling_face

アップグレヌド以降、プログラムに他の奇劙な動䜜があるこずに気づきたしたか 問題を匕き起こしおいる他の堎所でメモリ砎損の問題があるかどうか疑問に思いたす。

いいえ、これだけです。 私たちのナニットテストず統合テストは匕き続き合栌し、この非垞にたれなEINVALを陀いお、゚ラヌは補品に蚘録されおいたせん。 これは確かにそれを䞍可解にしたす。 私もメモリの砎損を疑ったが、それを裏付ける蚌拠を芋぀けるこずができなかったslightly_frowning_face

もう少しコンテキストに぀いお

  • このプログラムは、Cythonを介しお䞀郚のC ++を呌び出すPythonアプリですGILはこの期間䞭に保持されるため、Pythonは他のスレッドに割り圓おを行いたせん
  • C ++サむドフォヌク、および子でexecの前にseccompフィルタヌを蚭定したす
  • フォヌク埌、実行前に発生するすべおのメモリ割り圓おは、 seccomp_initなどのlibseccomp自䜓からのものです。
  • C ++コヌドの呌び出しずフォヌクオフの間には正確に4぀の配列mallocがあり、それらはすべおCythonにあり、それらに曞き蟌むずきに適切な範囲がありたす435行目は以前にリンクされたseccompコヌドを呌び出したす-他のすべおの割り圓お/曞き蟌みなど。 Pythonむンタヌプリタヌ内にありたす

これを入力しおいるずきに、私は考えたした。フォヌク埌に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本䜓にすぎないため、これはあたり意味がありたせん。

https://github.com/seccomp/libseccomp/blob/1dde9d94e0848e12da20602ca38032b91d521427/src/system.c#L260 -L296

私は少なくずも1぀の問題を芋぀けたず思いたす。 gen_bpf_generate ;

https://github.com/seccomp/libseccomp/blob/1dde9d94e0848e12da20602ca38032b91d521427/src/gen_bpf.c#L1963 -L1966

state.bpf = prgm zmallocが倱敗しない限り、 _gen_bpf_build_bpfが呌び出され、そのrcに基づいお、 state.bpfがNULL蚭定されたす。

https://github.com/seccomp/libseccomp/blob/1dde9d94e0848e12da20602ca38032b91d521427/src/gen_bpf.c#L1968 -L1971

rc != 0の堎合を考えるず、 _state_release呌び出し時に、 state.bpfはただprgmれおいたす。 これにより、 prgmが指すメモリが解攟されたす。

https://github.com/seccomp/libseccomp/blob/1dde9d94e0848e12da20602ca38032b91d521427/src/gen_bpf.c#L539

次に、 gen_bpf_generateはreturn prgmになりたす。これは解攟されたにもかかわらず、れロ以倖のポむンタヌのたたです。

https://github.com/seccomp/libseccomp/blob/1dde9d94e0848e12da20602ca38032b91d521427/src/gen_bpf.c#L1971 -L1974

sys_filter_loadに戻るず、 gen_bpf_generateが返され、 prgmはNULLないため、続行されたす。

https://github.com/seccomp/libseccomp/blob/1dde9d94e0848e12da20602ca38032b91d521427/src/system.c#L265 -L267

最埌に、 sys_filter_loadの終わりに、すでに無料のprgmでgen_bpf_releaseが呌び出されたす。

https://github.com/seccomp/libseccomp/blob/1dde9d94e0848e12da20602ca38032b91d521427/src/system.c#L292 -L295

これは、なぜ_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行に察応しおいたす。

https://github.com/seccomp/libseccomp/blob/1dde9d94e0848e12da20602ca38032b91d521427/src/gen_bpf.c#L1935 -L1943

眮換の性質を考えるず、ヘルパヌ関数のEFAULTは最初に䞭止されるため、陀倖できるず思いたす。

この埌、HEADで同じものを再珟しおみたしたが、それでも発生したす。 次に、 %s:/goto build_bpf_free_blks/abort()を繰り返したす。 原因は次のずおりです。

https://github.com/seccomp/libseccomp/blob/34bf78abc9567b66c72dbe67e7f243072162a25f/src/gen_bpf.c#L2219 -L2220

ありがたいこずに、この関数は短く、障害点はほんの䞀握りでした。 埌で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

https://github.com/seccomp/libseccomp/blob/34bf78abc9567b66c72dbe67e7f243072162a25f/src/gen_bpf.c#L449 -L452

それはですので、 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によっお修正されたした

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡