2002/02/04
TCP偽装の話1
2ちゃんねるという総合掲示板サイトではfusianasanというコマンドがあります。このコマンドを自分の名前欄に入れると、リモートホスト名が表示されるという仕組みになっています。さて、これは偽装できるでしょうか。
そのためにはまず、HTTPについて知っておく必要があります。HTTPは動作プロトコルがTCPです。動作プロトコルにはこれ以外にUDPというのもあります(他にもpingで使用されるIPMPなどがあるが省略)。この2つの違いはTCPが双方向でUDPは一方向です。わかりやすく説明しますと、TCPは電話でUDPは手紙です。つまりTCPの場合は相手に接続をして、相手からの接続応答を貰ってからデータを流し、データがついたという応答をもらってから次のデータを流し、というのを繰り返す仕組みです。よって双方向でデータのやりとりが発生します(これをストリーム型と言う)。対して、UDPは相手と接続をせずに相手に一方的にデータを流します。データが届いたかどうかも気にしません(これをデータダイヤグラム型という。ただしFTPのように工夫して投げ捨てにならない仕組みを作ることもできる)。UDPは投げ捨てなのです。ですからその気になれば手紙のように差出人(IPアドレス)に嘘を書くこともできます。しかしTCPは嘘をつくことは極めて困難です。何せサーバ側はデータを受け取ったことを接続側に伝えようとして失敗しますから。そして、fusianasanは恐らくREMOTE_HOSTキーを使って生成しています。前に書いたとおりHTTPで接続した場合、自分の情報を相手に伝えます。それにはHTTP_REFERERなどのキーがあるのですが、REMOTE_HOSTというキーはありません。これは現在接続しているソケットのアドレスがわかるTCPの仕組みを用いて、直接サーバがデータを格納する仕組みになっているからです。つまりfusianasanは(相手にTROIでも仕込んでPROXY動作でもさせない限り)偽装できないのです。しかし、まったく偽装ができないのか、と言われると、実はこれには裏技が存在しています。私が自分のサーバが落ちたときに疑ったのはこの点でした。
続きます。


 

Topへ