web-dev-qa-db-ja.com

UNIXドメインソケットを「追跡」する方法

説明するのはちょっと難しいですが、ソケットが開いているPIDをstraceingすると、通信がまったく表示されないことに気付きました。ソケットファイルの真ん中に座って通信を監視するにはどうすればよいですか?

7
user26053

ソケットは、通信用のカーネルAPIです。ソケットAPIを使用すると、TCP/IP接続、SCTPアソシエーション、UDPデータグラムを介して2つのエンドポイント間で、またはUnixドメインソケットを使用して2つのプロセス(データグラムまたは接続)間でデータを交換できます。

カーネルAPIであるため、ソケットとの対話はシステムコール(socketbindconnectlistenacceptsendmsgsendrecvwrite/read...)。

したがって、通常、straceはシステムコールをトレースするため、straceはそれらをトレースできます。 straceが追跡できない唯一の通信メカニズムは、共有メモリを介したIPCです)(メモリ内の何かの読み取り/書き込みは明らかにシステムコールを含まないため)。

おそらく、あなたの場合、それは別のものです。私の賭けは、アプリケーションがマルチスレッドであり、適切なスレッドを束縛していないことです。または、アプリケーションがsetuid/setgidであり、スーパーユーザーとして起動されていない可能性があります。

Unixドメインソケットを介して交換されているものを追跡する場合、オプションは次のとおりです。

  • straceおよびその他のptraceデバッガー(サーバーまたはクライアントをトレース)
  • システムコールを追跡する監査システム(auditd/auditctl
  • 使う LD_PRELOADソケットと相互作用するシステムコールをラップするトリック
  • アプリケーションのコードを計測して、そこにロギングを追加します。
  • systemtapおよびその他の低レベルのカーネルトレース/デバッグシステム
  • 真ん中に男を挿入。

MITMの場合、たとえばsocatを使用できます。 X11のような接続指向のUnixドメインソケットの場合:

socat -x unix-listen:/tmp/.X11-unix/X42,fork unix:/tmp/.X11-unix/X0
DISPLAY=:42 xlogo

次に、xlogoとXサーバーが交換するX11トラフィックが表示されます。

13

「ソケットのトレース」はできません。straceはプロセスで機能するため、ソケットと通信するすべてのプロセスをトレースできますが、straceを使用して、ソケットに関係するすべての通信を完全に確認することはできません。あなたはmayがOSで利用可能であれば、dtraceまたはsystemtapでどこかに行くことができますが、それはかなりの作業です。

3