
新しいタップジャッキング技術は、ユーザーインターフェイスのアニメーションを悪用してAndroidの許可システムを迂回し、機密データへのアクセスを許可したり、ユーザーを騙してデバイスを消去するなどの破壊的なアクションを実行させたりすることができます。
従来のオーバーレイベースのタップジャッキングとは異なり、TapTrap攻撃は、ゼロパーミッションアプリでも機能し、悪意のあるアクティビティの上に無害な透明アクティビティを起動します。
TapTrapは、TU Wienとバイロイト大学のセキュリティ研究者チーム(Philipp Beer、Marco Squarcina、Sebastian Roth、Martina Lindorfer)によって開発され、来月USENIXセキュリティ・シンポジウムで発表される。
しかし、チームはすでに攻撃の概要をまとめた技術論文と、詳細の大部分をまとめたウェブサイトを発表している。
TapTrapの仕組み
TapTrapは、Androidがカスタム・アニメーションでアクティビティ遷移を処理する方法を悪用し、ユーザーが見るものとデバイスが実際に登録するものとの間に視覚的な不一致を生じさせる。
ターゲット端末にインストールされた悪意のあるアプリは、カスタムの不透明度の低いアニメーションを使用して、’startActivity()’を使用して別のアプリから機密性の高いシステム画面(許可プロンプト、システム設定など)を起動します。
「TapTrapの鍵は、ターゲットのアクティビティをほぼ見えなくするアニメーションを使用することです」と、研究者はこの攻撃を説明するウェブサイトで述べている。
「これは、開始時と終了時の不透明度(アルファ値)を0.01などの低い値に設定したカスタムアニメーションを定義することで実現できる。
“オプションで、特定のUI要素(例えば、許可ボタン)にズームインするためにスケールアニメーションを適用することができ、それが全画面を占めるようにし、ユーザーがそれをタップする可能性を高めます。”

出典:taptrap.click
起動されたプロンプトはすべてのタッチイベントを受け取りますが、ユーザーが見ているのは、独自のUI要素を表示する基礎となるアプリだけです。
ユーザーは、ベニングアプリを操作しているつもりで、ほとんど見えないプロンプト上の「許可」や「認証」ボタンなど、危険なアクションに対応する特定の画面位置をタップする可能性があります。
研究者らが公開したビデオでは、ゲームアプリがTapTrapを活用して、Chromeブラウザ経由でウェブサイトへのカメラアクセスを可能にする方法を実演している。
リスク暴露
TapTrapがAndroidの公式リポジトリであるPlayストアにあるアプリケーションで機能するかどうかを確認するため、研究者らは10万近いアプリケーションを分析した。その結果、以下の条件を満たす画面(”アクティビティ”)を含むアプリの76%がTapTrapの脆弱性があることが判明した:
- 他のアプリから起動できる
- 呼び出し元のアプリと同じタスクで実行される
- 遷移アニメーションを上書きしない
- ユーザー入力に反応する前にアニメーションが終了するのを待たない
研究者によると、最新のAndroidバージョンでは、ユーザーが開発者向けオプションやアクセシビリティ設定から無効にしない限りアニメーションが有効になっており、デバイスがTapTrap攻撃にさらされる可能性があるという。
この攻撃を開発する際、研究者たちは当時の最新バージョンであるAndroid 15を使用したが、Android 16が登場した後、いくつかのテストも行った。
Marco Squarcina氏によると、Android 16を搭載したGoogle Pixel 8aでTapTrapを試したところ、問題が未修正であることが確認できたという。
プライバシーとセキュリティに焦点を当てたモバイル・オペレーティング・システムであるGrapheneOSも、最新のアンドロイド16がTapTrapの手法に対して脆弱であることを確認し、次のリリースに修正を含めると発表した。
TapTrapについてグーグルに問い合わせたところ、広報担当者は、TapTrapの問題は将来のアップデートで緩和されると述べた:
「Androidは、タップジャッキング攻撃に対する既存の緩和策を常に改善しています。私たちはこの研究を認識しており、将来のアップデートでこの問題に対処する予定です。Google Playでは、ユーザーの安全を守るために、すべての開発者が遵守しなければならないポリシーを定めており、アプリがポリシーに違反していることが判明した場合、適切な措置を講じています。
.ia_ad { background-color:#width: 95%; max-width: 800px; margin: 15px auto; border-radius: 8px; border:1px solid #d6ddee; display: flex; align-items: stretch; padding: 0; overflow: hidden; }:0; overflow: hidden; } .ia_lef { flex: 1; max-width: 200px; height: auto; display: flex; align-items: stretch; } .ia_lef a { display: flex; width: 100%; height: 100%; } .ia_lef a img { width: 100%; height: 100%; object-fit: cover; border-radius: 8px 0 0 8px; margin: 0; display: block; } .ia_rig { flex: 2; padding:display: flex; flex-direction: column; justify-content: center; } .ia_rig h2 { font-size: 17px !important; font-weight: 700; color:#line-height: 1.4; font-family:margin: 0 0 14px 0; } .ia_rig p { font-weight: bold; font-size: 14px; margin: 0 0 clamp(6px, 2vw, 14px) 0; } .ia_button { background-color:#border:1px solid #3b59aa; color: black; text-align: center; text-decoration: none; border-radius: 8px; display: inline-block; font-size: 16px; font-weight: bold; cursor: pointer; padding:10px 20px; width: fit-content; } .ia_button a { text-decoration: none; color: inherit; display: block; } @media (max-width: 600px) { .ia_ad { flex-direction: column; align-items: center; text-align: center; } .ia_lef { max-width: 100%; } .ia_lef a img { border-radius: 8px 8px 0 0; } .ia_rig { padding:15px;
width: 100%;
}
.ia_button {
width: 100%;
margin: 0px auto;
}
}




Comments