FTPクライアントへの攻撃:想定以上のファイルを取得するMGET
2018年4月4日
0 分で読めますはじめに
WebブラウザーなどのHTTPクライアントの脆弱性が、悪意のあるWebコンテンツによって悪用されるという話はよく耳にします。これは目新しいことではありません。しかし、FTPクライアント自体にも脆弱性があり、悪用される可能性があることをご存じでしょうか。FTPクライアントは、接続先の悪意あるサーバーから攻撃を受ける可能性があります。
この記事では、2017年11月に発見し、影響を受ける複数のベンダーに責任ある形で開示した、興味深いパストラバーサル脆弱性をご紹介します。この脆弱性は複数のアプリケーションやライブラリに影響し、悪意のあるFTPサーバーによってローカルファイルシステム上の任意の場所にファイルを作成したり、上書きしたりできる可能性があります。以下で詳しく見ていくように、この脆弱性の原因は検証の欠如です。影響するのはFTPクライアントだけではなく、Javaやnpmなど、さまざまなエコシステムの多くのアプリケーションやライブラリにも及びます。
脆弱性
では、問題を詳しく見ていきましょう。リモートのFTPフォルダーの内容をローカルにダウンロードする関数を実装するとします。ご存じのとおり、FTPプロトコルにはフォルダーをダウンロードするコマンドはありませんが、ほかのいくつかのコマンドを組み合わせれば目的を達成できます。
次のように処理します。
リモートフォルダー内のファイルをすべて一覧表示する(FTPの
LISTまたはNLSTコマンド)上記の一覧にある各ファイルについて、ファイルをダウンロードしてローカルフォルダーに保存する(FTPの
GETまたはMGETコマンド)
Apache commons-netライブラリを使ってこの処理を行うJavaコードの例は、次のようになります。
上記のコードは、サーバーから返された各ファイルを順に処理し、ローカルの保存先フォルダーにダウンロードします。たとえば、リモートフォルダーにある最初のファイルの名前がpasswdで、ローカルの保存先が/var/data/sync/の場合、ファイルは/var/data/sync/passwdにダウンロードされます。
しかし、FTPサーバーが悪意のあるものに変わり、LISTコマンドに対してpasswdではなく、ファイル名として../../../../etc/passwdを返したらどうなるでしょうか。上記のコードはファイルを/var/data/sync/../../../../etc/passwdに保存し、結果として/etc/passwdをダウンロードしたファイルで上書きしてしまいます。
../../../../etc/passwdは有効なファイル名ではない、と思うかもしれません。確かにそうですが、RFCでは無効だとは定められていません。技術的にはファイルシステムに関して規定しておらず、クライアントとサーバーそれぞれの判断に委ねています。たとえば、WindowsベースのFTPサーバーがLISTコマンドに応答する形式はこのようになります。
一方、Unixベースのサーバーではこのようになります。
実際には、ほかにもさまざまなファイルシステム形式があります。apache commons-netライブラリがサポートする形式の一覧をご覧ください。
一般的なFTPクライアントはファイル名を検証せず、開発者が検証できるようにそのまま返します。当然ながら、検証は見落とされがちです。GitHubで公開されているプロジェクトや、StackOverflowやCodeJavaのような各種コードスニペット・サンプルサイトを見ると、これは明らかです。
ケーススタディ:Apache HIVE
Apache Hiveは、データの要約、クエリ、分析を提供するためにApache Hadoop上に構築されたデータウェアハウスソフトウェアです。Hiveは、Hadoopと連携するさまざまなデータベースやファイルシステムに保存されたデータをクエリするための、SQLに似たインターフェースを提供します。機能の一つとして、COPY-FROM-FTPコマンドを使ったFTPサーバーからのデータコピーをサポートしています。
コードを確認すると、retrieveFileList()の呼び出しがあります。
retrieveFileList関数の中では、サーバーから返されたファイル名が検証されずにディレクトリ名へ追加されていることがわかります(name = dir + name;)。ファイルはキューに追加され、後でダウンロードされます。
その後、ダウンローダースレッドでキューからファイルが取り出され、サーバーからダウンロードされます。
考えられる攻撃の一つは、rootユーザーのSSH認証鍵ファイルauthorized_keysを上書きし、後からrootとしてログインできるようにすることです。Apache Hiveのインスタンスが、商取引データを毎日ダウンロードするために攻撃者のFTPサーバーへ接続すると仮定しましょう。この攻撃を実行するには、FTPサーバーを変更して、クライアントに悪意のあるパストラバーサルを含むファイル名を返すようにします。たとえば、LISTコマンドへの応答として../../../../../../../home/root/.ssh/authorized_keysを返すことができます。
Hiveがこのステートメントを実行すると(rootとして実行されている場合)、rootのauthorized_keys SSHファイルが、攻撃者が用意した内容で上書きされます。
上記の脆弱性はApache Foundationに責任ある形で開示しました。対応の経緯は以下のとおりです。
日付 | イベント |
|---|---|
2017年11月2日 | Snyk Security Researchが脆弱性を発見 |
2017年11月8日 | 影響を受けるApache製品の一覧をFoundationに開示 |
2018年2月5日 | Apacheから、2月末までに修正版をリリースする予定との連絡 |
2018年4月4日 | 記事を公開 |
Apache Hiveプロジェクトについて、詳細は2018年4月4日にCVEデータベースにも公開されました。CVE-2018-1315:FTPサーバーが侵害されている場合、HPL/SQLの「COPY FROM FTP」ステートメントによって任意の場所に書き込みが可能:
深刻度:中
ベンダー:The Apache Software Foundation
影響を受けるバージョン:Hive 2.1.0~2.3.2
説明:HiveのHPL/SQL拡張を使用して「COPY FROM FTP」ステートメントを実行すると、侵害された、または悪意のあるFTPサーバーにより、コマンドを実行したクラスタ上の任意の場所にファイルを書き込まれる可能性があります。HPL/SQLのFTPクライアントコードが、ダウンロードしたコードの保存先を検証していないためです。HPL/SQLは別のコマンドラインスクリプトであり、個別に起動する必要があるため、hivecliユーザーおよびhiveserver2ユーザーには影響しません。
緩和策:Hive 2.1.0~2.3.2でHPL/SQLを使用している場合は、2.3.3にアップグレードしてください。また、ほかの方法でHPL/SQLの使用を無効にすることもできます。
まとめ
一部のFTPクライアントアプリやライブラリに存在する脆弱性は、FTPサーバーからのデータが適切に検証されないことに起因する点を説明しました。同様の問題は過去にも見つかっています。たとえば2002年には、MITREの主任情報セキュリティエンジニアであるSteve Christeyが、Linux標準のFTPクライアントやwgetを含む複数のFTPクライアントでこの問題を発見しました。
セキュリティのためだけでなく、入力を検証することは不可欠です。開発者は、一般的なユーザーがAPIをどう使うかを考えがちですが、攻撃者による予想外の入力にも備えることが同じくらい重要です。FTPサーバーから受け取ったディレクトリ一覧を処理する際は、/で始まるファイル名や..を含むファイル名を拒否するなど、必ず検証してください。
CTFを始めよう
オンデマンドのバーチャル入門ワークショップで、CTFチャレンジの解き方を学びましょう。


