11

を利用するプログラムをデバッグしていますlibnetfilter_queue。ドキュメントには、ユーザースペースのキュー処理アプリケーションがCAP_NET_ADMIN機能するための機能が必要であると記載されています。setcap私は次のようにユーティリティを使用してこれを行いました:

$ sudo setcap cap_net_raw,cap_net_admin=eip ./a.out

getcapa)プログラムが機能し、b)次の出力が返されるため、機能が正しく適用されていることを確認しました。

$ getcap ./a.out
./a.out = cap_net_admin,cap_net_raw+eip

gdbただし、コマンドラインから(など)を使用してこのプログラムをデバッグしようとする$ gdb ./a.outと、正しいアクセス許可が設定されていないために失敗します。のデバッグ機能は、gdbそれ以外の場合は完全に機能し、通常どおりにデバッグします。

私はこれらの機能をgdbバイナリ自体に適用しようとしても無駄になりました。私はこれを見た目どおりに実行しました(マンページに記載されているように、「i」フラグを使用すると、デバッグ対象者がデバッガーから機能を継承できる可能性があります。

私が見逃している些細なことはありますか、それともこれは本当にできないのでしょうか?

4

6 に答える 6

17

私は同じ問題に遭遇し、最初はセキュリティ上の理由から gdb が実行可能ファイルの機能を無視している可能性があると考えました。ただし、ソースコードを読んだり、開く ext2fs-prog をデバッグしているときに eclipse デバッグ gdb 自体を使用したりすると、次のことがわかります/dev/sda1

  1. gdb は他のプログラムのように特別なものではありません。(マトリックスにあるように、エージェント自身でさえ、同じ物理法則、重力などに従いますが、それらはすべてドアキーパーです。)
  2. gdb は、デバッグされた実行可能ファイルの親プロセスではなく、祖父です。
  3. デバッグされた実行可能ファイルの真の親プロセスは「シェル」です。つまり/bin/bash、私の場合です。

したがって、解決策は非常に簡単cap_net_admin,cap_net_raw+eipです。gdb に追加する以外に、これをシェルにも適用する必要があります。すなわちsetcap cap_net_admin,cap_net_raw+eip /bin/bash

gdb に対してもこれを行う必要があるのは、gdb が/bin/bashデバッグ済みプロセスを作成する前の親プロセスであるためです。

gdb 内の真の実行可能コマンド ラインは次のようになります。

/bin/bash exec /my/executable/program/path

そして、これは gdb 内の vfork へのパラメーターです。

于 2014-08-18T14:03:53.290 に答える
3

しばらく前、私は同じ問題に遭遇しました。私の推測では、追加機能を使用してデバッグされたプログラムを実行することはセキュリティの問題です。

プログラムには、それを実行するユーザーよりも多くの特権があります。デバッガーを使用すると、ユーザーはプログラムの実行を操作できます。したがって、プログラムが追加の特権を使用してデバッガーの下で実行される場合、ユーザーは、プログラムがそれらを使用することを意図した目的以外の目的でこれらの特権を使用できます。ユーザーはそもそも特権を持っていないため、これは深刻なセキュリティホールになります。

于 2010-12-05T08:08:29.023 に答える
0

OK、これで少し苦労したので、答えをまとめて要約すると思いました。

簡単な解決策はsudo gdb、提案されているとおりですが、少し注意してください。ここで行っているのは、デバッグされたプログラムを root として実行することです。これにより、通常のユーザーとしてコマンド ラインから実行した場合とは動作が異なる可能性があります。少し混乱するかもしれません。私は決してこの罠に陥るわけではありません... おっと。

デバッグされたプログラムにビットが設定されsudoている場合、ORを使用してデバッグされたプログラムをルートとして実行している場合、これは問題ありません。setuidただし、デバッグされたプログラムが POSIX 機能 ( setcap/ getcap) で実行されている場合は、「sudo」を使用してパーミッションを強引に強制するのではなく、Nick Huang が提案したように、bash と gdb でこれらのより細かいパーミッションをミラーリングする必要があります。

他のことをすると、極端な学習の悪い場所につながる可能性があります.

于 2020-01-14T20:31:21.840 に答える