UNIXドメインソケットを盗聴


9

一部のプロセスが特定のUNIXドメインソケット(/var/run/asterisk/asterisk.ctl)に書き込んでいることはわかっていますが、送信者のPIDはわかりません。誰がソケットに書き込んでいるかを知るにはどうすればよいですか?私は試しました:

sudo lsof /var/run/asterisk/asterisk.ctl

しかし、それはソケットの所有者をリストするだけです。誰がこのソケットに書き込み/読み取りを行っているのかを知りたいし、データを盗聴したい。これは可能ですか?

回答:


4

短い答えはノーであり、簡単ではありません。

Linuxでは、lsofは/proc/net/unixUNIXドメインソケットに関する情報の取得に依存しています。このインターフェースは、バインドされたすべてのソケットをリストしますが、エンドポイントを追跡しませ。そのため、存在するソケット確認できますが、それらに接続されているソケットは確認できません。この情報追跡されている場所では、追跡する必要があります。そうしないと、ソケット接続が機能しません。接続情報を取得するメカニズムはまだ見つかっていません。

スニッフィングの質問はもう少し興味深いですが、それよりも残念なことです。「簡単ではない」とは、データをこっそりつかみ取るためのフックが存在しないことを意味します。最も近いアナログは、tcpdumpまたはWiresharkを使用しています。どちらもlibpcapを使用して、実際に重い作業を行います。ネットワーク(AF_INET)とUNIXドメイン(AF_UNIX)はどちらもsocket()関数呼び出しを使用して作成されますが、どちらもデータconnect()への接続、使用read()、およびwrite()処理に使用されますが、これらは異なるカーネルサブシステムによって処理されます。これには、libpcapがUNIXドメインソケットで動作するように設計されていないという残念な副作用があります。

この問題には、少し薄暗い部分があります。のマニュアルページをご覧くださいrecv(2)。これは、read()使用する低レベルのシステムコールです。recv()と呼ばれるためのフラグが存在しMSG_PEEKます。これにより、UNIXドメインソケットを通過するトラフィックを傍受できます。つまり、これは明るい面であり、暗い面は、私の知る限り、これを行うように設計された現在のアプリケーションは存在しないということです。だからあなたはいくつかの開発努力を見ています。

私はあなたの質問の両方の部分にF'YEAHの素晴らしく単純な答えがあったことを本当に望みます。


11

はい、できます。必要なのはsystemtapだけです。

指定されたiノードを読み書きするプログラムのPIDとプロセス名を出力するsystemtapスクリプト例の 1つを検討してください(Unixドメインソケットはまさにそのようなものです)。

このスクリプトを簡単に変更して、読み書きされる実際のデータを出力できます。読者への演習としてそうします。


3

これは主要な質問への回答ではないことはわかっていますが、ここではソケットの通信を傍受するだけで検索を終了しました。私のような人のために投稿することにしました。ここに私がそれをした方法があります:

$> sudo socat -t100 -x -v UNIX-LISTEN:/var/run/php5-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT:/var/run/php5-fpm.sock

-xを削除し、ASCII通信のために-vをそのままにしておくことができます。それが誰かを助けることを願っています。


完全に動作します
JSmyth

-1

socat -t100 UNIX-LISTEN:/tmp/file.sock,mode=777,reuseaddr,fork STDOUT

出力の重複、循環出力はありません。以前のコメント「.sock.socat」のエラー


2
それは便利なコマンドかもしれませんが、説明/説明を追加してください(そしてそれはこの回答とどのように違うのですか?)
HBruijn

申し訳ありません。出力の重複、循環出力はありません。以前のコメント「.sock.socat」のエラー
srvf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.