Libseccomp: Q異なるスレッドでSCMP_ACT_NOTIFYを䜿甚しお異なるフィルタヌを䜿甚するこずはできたせん

䜜成日 2020幎11月06日  Â·  9コメント  Â·  ゜ヌス: seccomp/libseccomp

libseccompは、通知fdをグロヌバル倉数state.notify_fd栌玍したす。 これにより、異なるスレッドで異なるフィルタヌを䜿甚するマルチスレッドアプリケヌションにlibseccompを䜿甚するこずができなくなりたす぀たり、TSYNCを䜿甚しない堎合。

libseccompはありseccomp_reset(NULL, ...)グロヌバル倉数をリセットするにはstate.notify_fd 。 しかし、 seccomp_reset()は、 state.nr_seccomp = -1をリセットするずいう䞍幞な結果をもたらしたす。

この問題は、libseccomp-golangで単䜓テストを解決しようずしたずきに発生したした。https//github.com/seccomp/libseccomp-golang/pull/59#issuecomment-723045033を参照しおください。

cc @yvesf @rata

prioritlow question

最も参考になるコメント

ここでは党員が同意しおいるようですので、この問題を解決したす。 @alban䜕か重芁なものが䞍足しおいるず思われる堎合は、この問題をお知らせいただくか、再床開いおください。すべお解決できたす。

みんな、ありがずう。

党おのコメント9件

@drakenclimberは、これに぀いお䜕らかの説明が埗られるたで、今埌のv2.5.1リリヌスを保持したす。 元のレポヌトを完党に理解しおいるかどうかはただわかりたせんが、v2.5.1はseccomp_reset(NULL, ...)抂念を実装する最初のリリヌスであるため、確認できるたで少し埅ちたしょう...

これをv2.5.1マむルストヌンに今のずころ単なるブロッカヌずしお远加するず、調査䞭に倉曎される可胜性がありたす。

@drakenclimberは、これに぀いお䜕らかの説明が埗られるたで、今埌のv2.5.1リリヌスを保持したす。 元のレポヌトを完党に理解しおいるかどうかはただわかりたせんが、v2.5.1はseccomp_reset(NULL, ...)抂念を実装する最初のリリヌスであるため、確認できるたで少し埅ちたしょう...

同意したした。 したしょう。

libseccompは、通知fdをグロヌバル倉数state.notify_fd栌玍したす。 これにより、異なるスレッドで異なるフィルタヌを䜿甚するマルチスレッドアプリケヌションにlibseccompを䜿甚するこずができなくなりたす぀たり、TSYNCを䜿甚しない堎合。

その最埌の文に぀いおもう少し詳しく説明しおいただけたすか あなたが䜕を䌝えようずしおいるのか理解できたせん。

FWIW、seccomp通知FDはプロセスグロヌバルオブゞェクトであり、カヌネルから芁求できるのは1回だけです。 https://github.com/seccomp/libseccomp/issues/273を読んで、この問題の背景をさらに知るこずができたす。

libseccompはありseccomp_reset(NULL, ...)グロヌバル倉数をリセットするにはstate.notify_fd 。 しかし、 seccomp_reset()は、 state.nr_seccomp = -1をリセットするずいう䞍幞な結果をもたらしたす。

state.nr_seccomp = -1リセットするこずが重芁な問題であるのはなぜですか nr_seccompフィヌルドが-1リセットされた堎合、次にseccomp(2)を䜿甚できる操䜜が芁求されたずきに、ラむブラリはseccomp(2)がサポヌトされおいるかどうかを確認したす。利甚可胜な堎合はそれを䜿甚したす。 はい、それはseccomp(2)ぞの䜙分な呌び出しをもたらす可胜性がありたすが、それは倧きな問題ではないはずです、それはあなたのナヌスケヌスの懞念ですか

@ alban-私からの同様の質問。 私は、賢明なマルチスレッド、マルチseccomp-filterのナヌスケヌスCを発明しようず少し時間を費やしたしたが、実際には䜕も思い぀きたせんでした。

os.LockOSThread()のGoドキュメントを読みたしたが、それは私には理にかなっおいたす。 しかし、私はこの知識をマルチスレッド、マルチseccomp-filter゜リュヌションに倉換するのに苊劎しおいたす。

あなたが考えおいるこずのいく぀かの擬䌌コヌドたたはいく぀かの高レベルの蚭蚈を共有できたすか それなら、喜んでCでプロトタむプを䜜成したす。

その最埌の文に぀いおもう少し詳しく説明しおいただけたすか あなたが䜕を䌝えようずしおいるのか理解できたせん。

libseccomp-golangで単䜓テストに取り組んでいるずきに、次のシナリオがテストされおいるこずに気付きたした。

  1. ナニットテストの最初の実行では、seccompポリシヌをせずに適甚されたSECCOMP_FILTER_FLAG_TSYNC これは、スレッドレベルではなく、プロセス・レベルで適甚されるこずを意味するが、でSECCOMP_FILTER_FLAG_NEW_LISTENER libseccompを栌玍するように state.notify_fdのfd。
  2. 同じナニットテストが同じプロセスで別のスレッドで再床実行されたすGoでruntime.LockOSThreadを䜿甚しお確認したす。 ただし、libseccompは、新しいフィルタヌの新しいfdを取埗する代わりに、前のseccompフィルタヌ state.notify_fd のfdを再利甚したす。 次に、間違ったseccomp fdでむベントを受信するこずが予想されるため、テストは倱敗したす。

FWIW、seccomp通知FDはプロセスグロヌバルオブゞェクトであり、カヌネルから芁求できるのは1回だけです。 この問題の背景に぀いおは、273をご芧ください。

私が理解したずころによるず、カヌネルは、フィルタヌツリヌで1぀のseccomp通知FDのみを取埗するように制限しおいたす。 ただし、䞊蚘のシナリオでは、同じプロセスの2぀のスレッドが異なるフィルタヌツリヌを䜿甚しおいるため、カヌネルの芳点からは問題ありたせん。

SECCOMP_FILTER_FLAG_NEW_LISTENER異なるフィルタヌツリヌを䜿甚するこのシナリオは、意図的に䜜成されたものではなく、同じプロセスで実行されおいるlibseccomp-golang単䜓テストの結果ずしお䜜成されたものです。 しかし、根本的な原因はスレッド間で共有されるグロヌバル倉数state.notify_fdを䜿甚するlibseccompであるため、ここでこのバグを開いおディスカッションを開く必芁があるず思いたした。 ただし、これが「WONTFIX」ずしお閉じられれば問題ありたせん他のlibseccompナヌザヌがこの皮のシナリオをサポヌトする必芁があるかどうかはわかりたせん。 その堎合、libseccomp-golang単䜓テストを別の方法で䜜成できたす぀たり、テストの反埩ごずに個別のプロセスを䜿甚したす。 ずにかくそれを行う必芁がありたすスレッドレベルのフィルタヌずプロセスレベルのフィルタヌの混合を避けるために-カヌネルによっお拒吊されたす。

libseccomp-golangで単䜓テストに取り組んでいるずきに、次のシナリオがテストされおいるこずに気付きたした。

  1. ナニットテストの最初の実行では、seccompポリシヌをせずに適甚されたSECCOMP_FILTER_FLAG_TSYNC これは、スレッドレベルではなく、プロセス・レベルで適甚されるこずを意味するが、でSECCOMP_FILTER_FLAG_NEW_LISTENER libseccompを栌玍するように state.notify_fdのfd。
  2. 同じナニットテストが同じプロセスで別のスレッドで再床実行されたすGoでruntime.LockOSThreadを䜿甚しお確認したす。 ただし、libseccompは、新しいフィルタヌの新しいfdを取埗する代わりに、前のseccompフィルタヌ state.notify_fd のfdを再利甚したす。 次に、間違ったseccomp fdでむベントを受信するこずが予想されるため、テストは倱敗したす。

ああ、それは今より理にかなっおいたす。 TSYNCをlibseccomp-golangバむンディングのデフォルトにするべきかどうか疑問に思うこずがよくありたす。 Goのスレッドのあいたいさを考えるず、はるかに安党な遞択のようです。

私が理解したずころによるず、カヌネルは、フィルタヌツリヌで1぀のseccomp通知FDのみを取埗するように制限しおいたす。 ただし、䞊蚘のシナリオでは、同じプロセスの2぀のスレッドが異なるフィルタヌツリヌを䜿甚しおいるため、カヌネルの芳点からは問題ありたせん。

SECCOMP_FILTER_FLAG_NEW_LISTENER異なるフィルタヌツリヌを䜿甚するこのシナリオは、意図的に䜜成されたものではなく、同じプロセスで実行されおいるlibseccomp-golang単䜓テストの結果ずしお䜜成されたものです。 しかし、根本的な原因はスレッド間で共有されるグロヌバル倉数state.notify_fdを䜿甚するlibseccompであるため、ここでこのバグを開いおディスカッションを開く必芁があるず思いたした。 ただし、これが「WONTFIX」ずしお閉じられれば問題ありたせん他のlibseccompナヌザヌがこの皮のシナリオをサポヌトする必芁があるかどうかはわかりたせん。 その堎合、libseccomp-golang単䜓テストを別の方法で䜜成できたす぀たり、テストの反埩ごずに個別のプロセスを䜿甚したす。 ずにかくそれを行う必芁がありたすスレッドレベルのフィルタヌずプロセスレベルのフィルタヌの混合を避けるために-カヌネルによっお拒吊されたす。

これに぀いお@drakenclimberの意芋を

libseccompでこれを「修正」するには、libseccompスレッドを認識させる必芁がありたす。これには、倚くの課題ず萜ずし穎がありたす。珟圚、これは悪い考えだず思いたす。 ただし、議論のために、libseccompスレッドを認識させるず、内郚グロヌバル状態をスレッド固有の状態にしたり、堎合によっおはフィルタヌツリヌ固有の状態にするこずもできたす。 どちらの堎合でも、珟圚のAPI seccomp_reset(NULL, ...) はただ劥圓だず思うので、APIをそのたたにしおおくようにしたいず思いたす。 懞念がある堎合は、すぐにお知らせください。

@drakenclimber 䞊蚘に異議がない限り、v2.5.1リリヌスに戻ったず思いたす。

これに぀いお@drakenclimberの意芋を

同意したす。 @ tych0の元のパッチセットずコメント、およびカヌネルコヌド自䜓を掘り䞋げるこずに時間を費やしたした。 圌が想定しおいるナヌスケヌスは、コンテナ化されたプロセスが行き来する間に通知ハンドラを実行する監芖プロセスです。 これらのコンテナ化されたプロセスが通知のあるシステムコヌルを呌び出すず、監芖プロセスは远加のロゞックを実行しお芁求を蚱可/拒吊できたす。

そうは蚀っおも、私は耇数の通知呌び出し元ずハンドラヌを持぀マルチスレッドの単䞀プロセスのナヌスケヌスを考え出そうずしたした。 正盎なずころ、私はそのようなシナリオを銖尟䞀貫しお䜜成するこずができたせんでした。 これはかなり䞍自然なナヌスケヌスであり、珟実的なナヌスケヌスを理解できないため、このWONTFIXにマヌクを付ける必芁がありたす。

䜙談ですが、カヌネルに耇数の通知fdsをプロセスに返すようにさせるこずができたした。 耇数のpthreadを䜜成し、それらすべおに通知アクションを含むseccompフィルタヌをすぐにロヌドさせるこずで、2぀たたは3぀の異なる通知fdをナヌザヌスペヌスプロセスに返すこずができる堎合がありたした。 これは非垞に非珟実的であるため、このカヌネルの問題をWONTFIXずしおマヌクするこずにも傟倒したす。

@drakenclimber 䞊蚘に異議がない限り、v2.5.1リリヌスに戻ったず思いたす。

玠晎らしい。 来週初めに䜜業を開始できるはずです。

ここでは党員が同意しおいるようですので、この問題を解決したす。 @alban䜕か重芁なものが䞍足しおいるず思われる堎合は、この問題をお知らせいただくか、再床開いおください。すべお解決できたす。

みんな、ありがずう。

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