web-dev-qa-db-ja.com

Linuxの別のプロセスによって開かれたソケット内に書き込む

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]

だから今私はそのソケット内のエコーを使用してHTTPリクエストを作成したいと思います:

myuser@linux:~$ echo "GET / HTTP/1.1" >> /proc/24285/fd/3
bash: /proc/24285/fd/3: no such device or address

ルートとしてそれを行っても結果は変わりません。

ソケット内に書き込むことはできませんが、stdin内に書き込むことができます。

myuser@linux:~$ echo "GET / HTTP/1.1" >> /proc/24285/fd/0
myuser@linux:~$

しかし、それは私がやりたいことではありません。

Linuxソケットはファイルのように扱うべきだと思いましたよね。 1つ以上のプロセスが同じソケットを使用できるので、なぜこれができないのですか?

9
otaku22

実装するのが難しく、ほとんど役に立たないため、これは不可能です。ソケットはパイプよりもはるかに複雑です。

  • ソケットは双方向です。
  • ソケットにはさまざまなタイプがあります。一部のソケットはバイトストリームではありません(たとえば、UDPソケットはデータグラムソケットであり、バイトではなくパケットを送信します)。
  • ソケットは多重化を実行します(接続を待機しているサーバーが使用するソケットと実際に開かれた接続が使用するソケットの間には、過負荷があります)。

ソケットは双方向であるため、双方向プロトコルでの通信によく使用されます。会話にデータを注入すると、相手側がデータへの応答を送信する可能性があり、正しいリクエスタに応答をディスパッチする方法はありません。これにより、ソケットでのデータインジェクションを許可することの有用性が大幅に低下します。

既存のクライアントと同じサーバーに接続しようとしていて、既存の会話にタックしない場合は、すでにそれを行う方法があります。同じ方法でサーバーに接続します(ファイルシステムのソケットを開くか、= TCPまたはUDPポート)ソケットが2つのプロセス間で名前のないソケットである場合、それは参加するべきではないことを示す良いヒントであり、オペレーティングシステムでは簡単に行えません。

データグラムソケットの場合(ここでは該当しません)、シェルはバイトのストリームしか認識せず、送信するためにsendではなくwriteを呼び出すことを知らないため、データを直接注入できませんでした。パケット。

1つのエンドポイントの連携がある場合は、ファイル記述子を使用してmake 12 を渡すことができます。

それ以外の場合は、ソケットを開いているプロセスにptraceを使用してデータ自体を送信させることができます(これはgdbが内部で使用するものです)。これは、設計によりプロセスを非常に一時停止するため、ダーティトリックがプロセスを混乱させすぎないようにします。プロセスが一時停止されている場合でも、プロセスのデータ構造を、注入したデータまたは環境の変更の現実と一致しないという大きなリスクがあります。 (システムがソケットを介してデータを注入することを許可したとしても、これらの不整合とプロセスを混同するリスクは、より少ないとしても同様であることに注意してください。)

それは可能だと思いますが、これを行うには両方のプロセスが協力する必要があります。あるプロセスに、ソケット接続を介して別のプロセスにファイル記述子を送信させることができます。私は この例では を見つけました。これは最新のArch Linuxマシンで動作するようです。

1
Bruce Ediger