生産性のない話

趣味の範囲でサイバーセキュリティの話

Androidアプリ : ES ファイルエクスプローラーの脆弱性(CVE-2019-6447)を調べてみた

今回は個人的に興味を持ったAndroidアプリの脆弱性を調べてみました。

きっかけは以下のTweetです。

ES ファイルエクスプローラー という1億以上のダウンロード数のある人気アプリに脆弱性があり、端末内のファイルをネットワーク経由で盗み出すなどができるようです。

ES ファイルエクスプローラー - Google Play のアプリ

PoCが公開されており、影響範囲には現時点の最新バージョンも含まれて、アップデートはまだ提供されていないようです。

この ES ファイルエクスプローラー ですが、私自身以前利用しており、割と使い勝手はよかったと記憶しています。

ただ、一時期「中国に情報を送っている」みたいなよくある曖昧な噂が流れて、ちょっと心配になり、別のアプリに移行しました。

ということで今回、一度アンインストールしたそのアプリを再インストールして、どのような脆弱性なのかを確認してみました。

検証

インストールします

f:id:blueBLUE:20190117230341p:plain

今回は、私の古いタブレットで検証しました。 IPは「192.168.0.7」となっています。

ES ファイルエクスプローラー を起動すると、59777ポートでHTTPを待ち受けるようになります。

nmap を打ってみると、確かにポートが開いていることが確認できます。

f:id:blueBLUE:20190117230358p:plain

上がES ファイルエクスプローラーを起動する前で、下が起動した後です。

ブラウザでアクセスすると、以下のような表示がされました。

f:id:blueBLUE:20190117230410p:plain

ちなみに、一度ES ファイルエクスプローラーを起動すると、このポートはずっと待ち受けるようで、アクティビティを殺しても、端末を再起動してもバックグラウンドサービスとして動き続けているようでした。 インストールして一度起動した時点で、それ以降、いつでも攻撃を受ける可能性があるということになります。

ここに特殊な json のリクエストを投げると、様々な攻撃が行えるとのことです。 具体的には現在公開されているPoCで、以下のようなことができます。

  • ファイル一覧の取得
  • 指定したファイルの取得
  • インストール済みアプリの一覧の取得
  • インストール済みアプリのapkパッケージの取得

画像ファイル一覧を取得してみます。

f:id:blueBLUE:20190117230435p:plain

画像ファイルの一覧がずらっと表示されます。 その中のファイルを取得します。

f:id:blueBLUE:20190117230457p:plain

確かに端末内のファイルを取り出すことができました。

f:id:blueBLUE:20190117230513p:plain

f:id:blueBLUE:20190117230522p:plain

攻撃者は端末と同一のLAN内にさえいれば、ES ファイルエクスプローラーが動いている端末内のファイルを自由に取り出すことができるようです。

不特定多数の人が接続可能なWifi環境下では攻撃者により知らない間に端末内に保存した写真などが盗み出されている可能性もあります。

解析

アプリのapkファイルを取り出して簡単に中身を解析してみました。

再び脆弱性をついてapkファイルを取り出します(便利!)。

f:id:blueBLUE:20190117230540p:plain

apkファイルを unzip し、dexファイルをdex2jar で jarファイルに変換し、JD-GUIデコンパイルしたソースファイルを確認します。

同時に apktool でデコードした中身に対してそれらしい文字列でgrepをかけていくと、サーバとして待ち受けているっぽい箇所がわかります。

以下はコマンドを受け付けるコードです。

f:id:blueBLUE:20190117230602p:plain

コードを見ると、なんか認証しようとしてるっぽい 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)が配信され、脆弱性が修正されました。

f:id:blueBLUE:20190119010630p:plain

ポートは依然開いたままですが、PoCを打ってみると、500エラーが返ってきました。

f:id:blueBLUE:20190119010751p:plain

更新されたソースを見ると、ちゃんと追ってないですが、コマンドを受け付ける前に、認証か何かの処理を入れたようです。

f:id:blueBLUE:20190119011028p:plain

ひとまず、この脆弱性については、対処されました。 (ただ、別の脆弱性を指摘している方もいるので、そっちがどうなっているかはわかりません)