Linuxでは、他のプロセスが開いたソケット内にデータを書き込むことができますか?
netcatを使ってgoogle.comに接続するとしましょう。
myuser@linux:~$ nc google.com 80
これで、プロセスpidを見つけて、対応するファイル記述子フォルダを開くことができます。
myuser@linux:~$ ls -la /proc/24105/fd
totale 0
dr-x------ 2 myuser myuser 0 2012-03-10 19:01 .
dr-xr-xr-x 7 myuser myuser 0 2012-03-10 19:01 ..
lrwx------ 1 myuser myuser 64 2012-03-10 19:02 0 -> /dev/pts/12
lrwx------ 1 myuser myuser 64 2012-03-10 19:02 1 -> /dev/pts/12
lrwx------ 1 myuser myuser 64 2012-03-10 19:01 2 -> /dev/pts/12
lrwx------ 1 myuser myuser 64 2012-03-10 19:02 3 -> socket:[3947162]
それでは、そのソケット内でechoを使用してHTTPリクエストを作成したいと思います。
myuser@linux:~$ echo "GET / HTTP/1.1" >> /proc/24285/fd/3
bash: /proc/24285/fd/3: no such device or address
rootでこれを実行しても結果は変わりません。
ソケットの内部には書き込めませんが、標準入力の内部には書き込むことができます。
myuser@linux:~$ echo "GET / HTTP/1.1" >> /proc/24285/fd/0
myuser@linux:~$
しかし、それは私がやりたいことではありません。
私は考えている: Linuxのソケットはファイルのように扱われるべきである。そうではありませんか? 1つ以上のプロセスが同じソケットを使用できるのに、なぜそれを行うことはできませんか?
答え1
これは実装が難しく、ほとんど役に立たないため不可能です。ソケットはパイプよりはるかに複雑です。
- ソケットは双方向です。
- さまざまなタイプのソケットがあります。一部のソケットはバイトストリームではありません。たとえば、UDPソケットは、バイトではなくパケットを送信するデータグラムソケットです。
- ソケットは多重化を行います(接続を待っているサーバーで使用されているソケットと、実際に開かれた接続で使用されるソケットの間には多少のオーバーロードがあります)。
ソケットは双方向なので、双方向プロトコルでの通信によく使用されます。会話にデータを挿入すると、相手があなたのデータに対する応答を送信し、その応答を正しい要求者に転送できない可能性があります。これにより、ソケットにデータを注入するユーザビリティを大幅に削減できます。
既存の会話に接続するのではなく、既存のクライアントと同じサーバーに接続したい場合は、すでに実行できる方法があります。同じ方法でサーバーに接続します(ファイルシステムでソケットを開くか、TCPまたはUDPポート)。ソケットが2つのプロセス間の名前が指定されていないソケットである場合、これは参加してはいけないという良いヒントなので、オペレーティングシステムはそれを簡単に作成しません。
データグラムソケット(ここではそうではありません)を使用すると、シェルがバイトストリームのみを理解し、パケットを送信するのではなく呼び出すことをsend
知らないため、データを直接注入できませんwrite
。
一致させるエンドポイントがある場合は、ファイル記述子を渡すように指示できます。1 2 サム。
それ以外の場合は、ソケットを開いたプロセスにデータ自体を送信させることができますptrace
(これはgdb
後で使用されます)。これは主に意図的に設計されており、汚れたトリックによってプロセスが複雑すぎないようにプロセスを一時停止します。プロセスが一時停止しても、プロセスのデータ構造が挿入されたデータの現実や環境の変更と一致しなくなるという大きなリスクがあります。 (システムがソケットを介したデータ注入を許可していても、これらの不整合がプロセスを混同する危険性は小さいが似ている可能性があります。)
答え2
可能だと言いたいのですが、そのためには両方のプロセスが協力する必要があります。あるプロセスにソケット接続を介して別のプロセスにファイル記述子を送信させることができます。私が見つけたこの例では、これは最新のArch Linuxシステムで動作するようです。