【Android脆弱性】StrandHogg攻撃(タスクハイジャック):解説編

ヴァイキングロゴ
StrandHogg攻撃とは
ヴァイキングの強奪戦略が由来、スパイネットワークを使って奇襲することです。
Android端末のマルチタスクの穴を悪用して銀行やSNSアプリのタスクに侵入し、ユーザーが気づかずに個人情報などを奪い取るマルウェアです。その恐ろしさは許可要求されず、Rootアクセスを取られなくても攻撃が効きます。致命的な脆弱性として分類されます。
2015年にセキュリティ研究者が見つけて、2019年3月にGoogleさんがパッチで埋め始めました。
2020年9月に完全に埋めたらしいですが、Android11の前バージョンはリスク残しているままです。
現在(2025年)アプリ開発している我々はこの脆弱性を気にしなくても良いと思っているかもしれませんが、古い端末を使っているユーザーさんは世の中にまだいますので被害が出る前に防ぐべきです。
実際に被害が出たケースがあって、有名なのがチェコ共和国のケース、複数の銀行アプリの口座からお金が謎に奪い取られた件でした。
ここまで話した内容はStrandHogg攻撃のv1ですが、実はもっと恐ろしいv2があります。[1]
v1はTaskAffinityというアプリタスクの設定を利用して狙ったアプリを乗っ取る仕組み、Playstoreに載っているAndroidManifest.xmlの確認で怪しさを検知することが可能です。
v2はそのTaskAffinityと関係なくて検知することはほぼ不可能になって、それより同時に複数のアプリを攻撃できる最悪な攻撃です。
幸い、StrandHogg攻撃v2はセキュリティチームが悪用される前に見つかりました。
具体的な内容が公開されませんが、もうAndroidのパッチで埋められました。
GoogleがStrandHogg攻撃v2を以下の共通脆弱性識別子の番号を付けました。
cve-2020-0096
v1攻撃パターンの事例
どこからインストールされたマルウェアがアプリのタスクを乗っ取ることが原因なので、いろんなパターンが出て来ます。
1) フィッシング

2015年の論文からの画像
マルウェアがonBackPressed()コールバックを書き換えてフィッシング画面を表示する事例です。[2]
a) 銀行アプリのチュートリアル動画をタップ
b) ビデオプレイヤー選び
c) 銀行の動画が再生される
d) バックボタンでログイン画面に戻る(フィッシング画面が出て来る)
e) 情報入力してログインする(情報を盗まれるところ)
f) 元の本物ログイン画面に戻り、ログイン失敗を表示される
2) スパイウェア

アプリを起動する時に謎の許可要求が出てくる
1)と違って許可要求されるケースです。アプリの起動する時だけに乗っ取ります。
ユーザーが気付きずに許可を与えて、バックグラウンドでユーザーの動きを監視されます。
スマホの情報(SMSや画像)も盗まれます。
3) ランサムウェア

マルウェアのアンインストールがブロックされる
2)の攻撃が成功した場合はアプリの使用をロックしながら、身代金要求UIを出すパターンです。
ひどい場合はマルウェアのアンインストールもブロックされます。[2:1]
開発側の防ぐ方法
1)最低Sdkは30から対応しておく
Android11(Sdk30)からはパッチされましたので、最低限Sdk30にしておけばある程度安心できます。[3]もしどうしても古い端末にも対応しなければならなかったら他の防ぐ方法をご確認ください。
android:minSdkVersion="30"
| Androidバージョン | SDK | v1 | v2 |
|---|---|---|---|
| >=11 | >=30 | ✅ | ✅ |
| 10 | 29 | ❌* | ✅ |
| <=9 | <=28 | ❌ | ❌ |
* Android10の場合は防ぐ方法2)を参考してください
2)taskAffinityという乗っ取られる道を無くす
最近だと以下のコードが自動生成されますが、古いアプリは要注意です。
私はflutter開発者なので、公式のアプデを確認したら割と最近にテンプレート更新しました。[4]
AndroidManifest.xmlにtaskAffinityを空に設定するだけで、Strandhogg攻撃v1はもう効かなくなります。
taskAffinity=""
3)別のタスクにアクティビティ移動機能を使わない
allowTaskReparentingという機能は乗っ取られる原因になる可能性があります。[5]
この機能の活用性は特別な要件だけですが、使われている場合は要注意です。
デフォルトはfalseですので、AndroidManifest.xmlに以下のコードがなくても大丈夫です。
allowTaskReparenting=false
まとめ
2020年9月に埋められた致命的な脆弱性、StrandHogg攻撃はAndroidマルチタスク機能の穴を悪用し、アプリのタスクを乗っ取るマルウェア攻撃です。様々な悪さを行えるので、Android11前の端末を対応するアプリは気を付けるべきです。
関連:
【Android脆弱性】StrandHogg攻撃(タスクハイジャック):実演編
-
https://promon.io/resources/downloads/strandhogg-2-0-new-serious-android-vulnerability ↩︎
-
https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-ren-chuangang.pdf ↩︎ ↩︎
-
https://developer.android.com/privacy-and-security/risks/strandhogg?hl=ja ↩︎
-
https://github.com/flutter/flutter/commit/47b0ef8127d912f79eb1228dcaa1b944690bba64 ↩︎
-
https://promon.io/security-news/the-strandhogg-vulnerability ↩︎
Discussion