Androidアプリ : ES ファイルエクスプローラーの脆弱性(CVE-2019-6447)を調べてみた
今回は個人的に興味を持ったAndroidアプリの脆弱性を調べてみました。
きっかけは以下のTweetです。
With more than 100,000,000 downloads ES File Explorer is one of the most famous #Android file manager.
— Elliot Alderson (@fs0c131y) 2019年1月16日
The surprise is: if you opened the app at least once, anyone connected to the same local network can remotely get a file from your phone https://t.co/Uv2ttQpUcN
ES ファイルエクスプローラー という1億以上のダウンロード数のある人気アプリに脆弱性があり、端末内のファイルをネットワーク経由で盗み出すなどができるようです。
ES ファイルエクスプローラー - Google Play のアプリ
PoCが公開されており、影響範囲には現時点の最新バージョンも含まれて、アップデートはまだ提供されていないようです。
この ES ファイルエクスプローラー ですが、私自身以前利用しており、割と使い勝手はよかったと記憶しています。
ただ、一時期「中国に情報を送っている」みたいなよくある曖昧な噂が流れて、ちょっと心配になり、別のアプリに移行しました。
ということで今回、一度アンインストールしたそのアプリを再インストールして、どのような脆弱性なのかを確認してみました。
検証
インストールします
今回は、私の古いタブレットで検証しました。 IPは「192.168.0.7」となっています。
ES ファイルエクスプローラー を起動すると、59777ポートでHTTPを待ち受けるようになります。
nmap を打ってみると、確かにポートが開いていることが確認できます。
上がES ファイルエクスプローラーを起動する前で、下が起動した後です。
ブラウザでアクセスすると、以下のような表示がされました。
ちなみに、一度ES ファイルエクスプローラーを起動すると、このポートはずっと待ち受けるようで、アクティビティを殺しても、端末を再起動してもバックグラウンドサービスとして動き続けているようでした。 インストールして一度起動した時点で、それ以降、いつでも攻撃を受ける可能性があるということになります。
ここに特殊な json のリクエストを投げると、様々な攻撃が行えるとのことです。 具体的には現在公開されているPoCで、以下のようなことができます。
- ファイル一覧の取得
- 指定したファイルの取得
- インストール済みアプリの一覧の取得
- インストール済みアプリのapkパッケージの取得
画像ファイル一覧を取得してみます。
画像ファイルの一覧がずらっと表示されます。 その中のファイルを取得します。
確かに端末内のファイルを取り出すことができました。
攻撃者は端末と同一のLAN内にさえいれば、ES ファイルエクスプローラーが動いている端末内のファイルを自由に取り出すことができるようです。
不特定多数の人が接続可能なWifi環境下では攻撃者により知らない間に端末内に保存した写真などが盗み出されている可能性もあります。
解析
アプリのapkファイルを取り出して簡単に中身を解析してみました。
再び脆弱性をついてapkファイルを取り出します(便利!)。
apkファイルを unzip し、dexファイルをdex2jar で jarファイルに変換し、JD-GUI でデコンパイルしたソースファイルを確認します。
同時に apktool でデコードした中身に対してそれらしい文字列でgrepをかけていくと、サーバとして待ち受けているっぽい箇所がわかります。
以下はコマンドを受け付けるコードです。
コードを見ると、なんか認証しようとしてるっぽい if文が見えます。 ただ、今回のコマンド受付けとは関係なさそうです。
ちなみに、待ち受けているコマンドは以下の通り。
- listFiles
- listPics
- listVideos
- listApps
- listAppsSystem
- listAppsPhone
- listAppsSdcard
- listAppsAll
- getAppThumbnail
- appLaunch
- appPull
- getDeviceInfo
何ができるかは大体予想がつきますね。
脆弱性の根本的な原因はHTTPで待ち受け、認証もなしに情報を取得できてしまうことにあります。
そもそも何のためにHTTPの待ち受けを行っているのでしょうか?
アプリの機能の説明には「ローカル/インターネット管理」といった記載があるので、この辺りの機能に関連しそうですが、詳細についてはどこにも記載が見当たりません。
こういう機能はせめてユーザ側で有効/無効を切り替えられるようにすべきじゃないかと思っており、この辺りは設計上の不備ではないかと考えています。
対策
というほどのものはないけれど、少なくとも現時点で脆弱性に対応したアップデートが出ていないことを考えると、しばらくは利用を控える(アンインストールする)というのがよいかと思います。
開発チームはこの脆弱性を認識しており、近いうちに修正はされるそうです。
ちなみに私が今は X-plore File Manager というやつを使っています。宣伝でもなんでもないですし、安全かと言われれば、はっきり答えられる自信はありませんが、参考になれば……。
以上です。
追記(2018/01/19)
アップデートバージョン(バージョン 4.1.9.9)が配信され、脆弱性が修正されました。
ポートは依然開いたままですが、PoCを打ってみると、500エラーが返ってきました。
更新されたソースを見ると、ちゃんと追ってないですが、コマンドを受け付ける前に、認証か何かの処理を入れたようです。
ひとまず、この脆弱性については、対処されました。 (ただ、別の脆弱性を指摘している方もいるので、そっちがどうなっているかはわかりません)