連載「OSS脆弱性ウォッチ」では、さまざまなオープンソースソフトウェアの脆弱性に関する情報を取り上げ、解説していく。今回は、memcachedを用いたDDos攻撃について詳しく見ていきます。
「OSSセキュリティ技術の会」の面和毅です。本連載「OSS脆弱性ウォッチ」では、さまざまなオープンソースソフトウェア(OSS)の脆弱(ぜいじゃく)性に関する情報を取り上げ、解説しています。
2018年2月下旬に、JPCERT/CCからPort 11211に対するアクセスが急増しているとして、注意喚起情報が出されました(参考)。
Port 11211は、「memcached」が使用しているポートです。JPCERT/CCからは「memcachedを踏み台にして悪用したと見られるDDoS攻撃が報告されている」との情報も出ています。より詳しい動きに関しては、アカマイのブログに情報が出ています。また、PoCコードも出ています(PoCコードは公開されていますが、ここでの提示は控えさせていただきます)。
今回は、このmemcachedを用いたDDos攻撃について詳しく見ていきます。
memcahedは、汎用の分散型メモリキャッシュシステムです。DBと組み合わせてキャッシュとして使用することにより、Webサイトのレスポンスが向上します。
memcachedに関しての詳細は、@ITの記事などに詳しく載っていますので、そちらを参照するといいでしょう。
今回、memcachedがDDoS攻撃に使われた主な理由として下記の2つが挙げられます。
以下、実験環境にはDebian 9(Stretch)のmemcached 1.5.1-1を使用しています。
memcachedは、キャッシュへのSet/Getを行う際に認証する必要がないため、大きいサイズのデータをキャッシュしておけば、1つのリクエスト(Get)を行うだけで、大きいサイズのデータをストリームで何度でも引き出すことが可能になっています。
まず、実験環境(172.16.148.145)のPort 11211(memcached)に、外部(172.16.148.1)からtelnetで接続します。
memcachedでは、指定したKeyでデータを格納する際に下記のように入力します。
set [Key] [フラグ:1:zip圧縮/0:非圧縮] [キャッシュの有効期間] [サイズ]
データを取得するには、下記のように入力します。
get [Key]
テストとして、「aaa……」ばかりのファイル(1519bytes)を用意して、「Key = "testdata"として格納します。ここでは、非圧縮(0)にし、有効期間は0(期限切れなし)にしています(図1)。
格納後、「get testdata」とすると、「Key="testdata"」で格納されているデータを参照することができます(図2)。
netcatでUDPを使って「Key="testdata"」のデータをgetします。下記コマンドを実行します(参考)。
echo -en "\x00\x00\x00\x00\x00\x01\x00\x00get testdata\r\n" |nc -q1 -u 172.16.148.145 11211
memcachedのサーバの方でパケットをキャプチャーしたものを図示します。データがUDP内での最大値(1400bytes)で分割されたパケットが見えます(図3)(図4)。
今回は、1520bytesのデータを用意していたため、その他のヘッダも併せてUDP部分が1400bytesと166bytesの2つのパケットに分割されましたが、最初に準備しておくデータキーを選ぶことで大きさは好きなように変えられます(しかも認証なしです)。元のGetのサイズがヘッダを含めて1パケット64bytesなので、キャッシュから引き出すデータのサイズを大きくすればするほど、DoSの効果が高まることになります。
Copyright © ITmedia, Inc. All Rights Reserved.