Hunting mobile tapjacking and overlay abuse: when a tap lands on a screen the user cannot see
A mobile user acts by touching what they see, and that trust breaks when another app can draw over the screen
or intercept the interaction. An overlay app puts its own window on top of a sensitive screen, a permission
grant, a payment confirmation, a credential prompt, and either hides what the user is really touching or fakes
a benign interface over it, so the tap the user believes is dismissing a game lands on the real approve
button underneath. Related abuses intercept rather than draw: an accessibility-style service drives the
interaction programmatically. The sensitive screen is complicit when it accepts a touch it cannot confirm the
user saw: it does not detect that it is obscured, does not filter touches that passed through an overlay, or
confirms an action without binding the confirmation to what was actually displayed. The bug is a consequential
approval taken while the screen cannot vouch for what the user saw or touched. You hunt these by finding every
sensitive screen and checking whether it defends against being overlaid or driven.
When to use
- A mobile app presents consent, confirmation, or credential-entry screens another app could overlay.
- A sensitive action is approved by a tap that an overlay could hide, fake, or pass through.
- An accessibility-style service or intercepting app could drive the interaction programmatically.
Scope check
Hunt overlay and tapjacking abuse only on apps and devices you own or are authorized to assess, on test
devices and accounts, using a benign test overlay you control against a test screen rather than deceiving a
real user. A confirmed case makes a user approve an unintended sensitive action, so keep every probe within
scope. If you can't name the authorization, stop.
The loop
Establish whether the sensitive screen can vouch for what the user saw and touched first. For each
consequential screen, determine whether it detects when it is obscured and refuses or filters the touch,
and binds its confirmation to the action actually displayed, or whether it accepts a tap without knowing
whether an overlay hid or faked the interface. This is the false-positive killer: a screen that rejects
obscured touches and confirms only the displayed action cannot be redressed by an overlay. Name the
screen's defense before crafting an overlay.
Enumerate the consequential screens. List the screens where a single interaction has real
consequence: granting a permission, confirming a payment or a transfer, entering a credential or a
one-time value, or approving an irreversible action. These are the targets an overlay would redress.
Check obscured-touch handling. Determine whether each screen detects that another window is drawn over
it and either refuses the touch or ignores touches that passed through an overlay, or whether it accepts
the interaction regardless, so an overlay can hide or fake the interface while the real control receives
the tap.
Check the confirmation binding. Determine whether the approval is bound to what was displayed, so a
user confirming sees and confirms the actual action, or whether the confirmation is a generic tap that an
overlay can steer to a different underlying action than the one the user believes they are approving.
Check programmatic interception. Determine whether an accessibility-style service or another mechanism
could drive the interaction without a genuine user touch, approving the sensitive action programmatically,
and whether the screen distinguishes a real user interaction from a synthesized one where it matters.
Confirm and record. Confirm by placing a benign test overlay over a test screen, or driving it
programmatically, and showing a sensitive action is approved while the user's apparent interaction was with
the overlay, on a test device. Kill the lead if the screen rejects obscured touches, binds confirmation to
the displayed action, and resists programmatic approval, or if the action carries no consequence worth
redressing. Record the screen, the overlay or interception, the approved action, and the redress observed,
or set a kill_reason.
Where overlay abuse leaks
- The screen's ability to vouch is the finding. A sensitive approval is safe only if the screen knows the
user saw and touched the real control; the bug is accepting a tap it cannot vouch for. Name the missing
defense.
- Obscured touches redress the action. A screen that accepts a touch while obscured lets an overlay hide
the real control and fake a benign one, so the user taps approve believing they tapped something else.
- Unbound confirmations approve the wrong thing. A generic confirming tap not bound to the displayed
action can be steered by an overlay to approve an action the user never saw.
- Programmatic interaction skips the user. An accessibility-style service can approve a sensitive action
without a genuine touch, so a screen that cannot tell a real interaction from a synthesized one is driven.
- Consequence is what makes it matter. Redressing a screen with no real consequence gains nothing; the
targets are permissions, payments, credentials, and irreversible actions.
Worked example (a confirm and a kill)
Confirm. A payment confirmation screen approves the transfer on a tap and does not detect when it is
obscured. A benign test overlay draws a game-like interface over it so the user's tap on a decoy button
lands on the real approve control, confirming a test transfer the user did not intend, on a test device.
Confirmed tapjacking of a consequential confirmation, high, remediation = refuse or filter touches
received while the screen is obscured by another window, bind the confirmation to the displayed transaction
details, and require a genuine user interaction for consequential approvals.
Kill. The same screen detects that another window overlays it and refuses the touch, ignores touches
that passed through an overlay, binds the approval to the displayed transaction, and requires a genuine
interaction that a programmatic service cannot synthesize. An overlay hides nothing that still approves, and
a driven tap is rejected. Killed, kill_reason = "the screen refuses obscured and passed-through
touches, confirms only the displayed action, and rejects synthesized interaction; no overlay or interception
approves an unintended action."
Rationalizations to reject
- "The user still has to tap approve." -> An overlay can hide the approve button under a decoy so the user
taps it believing it is something else; the tap is real, the user's understanding is not.
- "Overlays require a special permission." -> Users grant overlay capability routinely, and some contexts
allow it without a prompt; assume an overlay can be present and defend the screen rather than the platform.
- "Our screen looks distinctive." -> An overlay can fake or hide the whole screen; appearance does not
protect a screen that accepts obscured touches.
- "Accessibility services are trusted." -> A malicious or abused accessibility-style service can drive the
interaction; a consequential approval should require a genuine user touch it can distinguish.
- "It is only a confirmation dialog." -> A confirmation that approves a permission, payment, or irreversible
action is exactly the consequential target; bind it to what was displayed.
Executing this in practice
You need every consequential screen, whether each detects and refuses obscured or passed-through touches,
whether its confirmation is bound to the displayed action, and whether it resists programmatic approval. For
each, decide whether an overlay or an intercepting service could make the user approve an unintended action.
Reading the screen's obscured-touch and confirmation handling settles most leads; placing a benign test
overlay or driving the screen programmatically on a test device settles the rest.
Related
auditing-clickjacking-and-ui-redressing - the web counterpart, where a framed page is redressed by an
overlay, sharing the obscured-interaction reasoning with this mobile case.
auditing-android-component-exposure - a screen reachable by another app is more easily brought forward for
redressing, the reachability that skill audits.
auditing-mobile-biometric-and-local-auth-bypass - a consequential approval gated by local auth relies on
the genuine-interaction guarantee this skill checks against overlays and interception.
auditing-android-intent-redirection-and-pendingintent - an intent that brings a sensitive screen forward
for overlay is delivered through the redirection that skill audits.
- FINDING-SCHEMA.md - source = the overlaying or intercepting app, sink = the
sensitive screen accepting the redirected interaction, evidence = a sensitive action approved while the
user's apparent interaction was with a benign test overlay on a test device.
1---2name: hunting-mobile-tapjacking-and-overlay-abuse3description: Hunt mobile interface redressing, where another app draws over or intercepts a sensitive screen so the user acts on the attacker's terms without knowing it, approving a permission, confirming a transaction, or entering a secret while an overlay hides or fakes what they are really touching, because the sensitive screen does not detect that it is obscured, does not filter touches passed through an overlay, or does not bind the confirmation to what the user actually saw. Use when a mobile app presents consent, confirmation, or credential-entry screens that another app could overlay or intercept. Covers tap hijacking through overlays, obscured-touch acceptance, accessibility-driven interaction, and confirmations not bound to the displayed action. The overlaying or intercepting app is the source, the sensitive screen accepting the redirected interaction is the sink, and the user approving what they did not intend is the bug.4license: MIT5---67# Hunting mobile tapjacking and overlay abuse: when a tap lands on a screen the user cannot see89A mobile user acts by touching what they see, and that trust breaks when another app can draw over the screen10or intercept the interaction. An overlay app puts its own window on top of a sensitive screen, a permission11grant, a payment confirmation, a credential prompt, and either hides what the user is really touching or fakes12a benign interface over it, so the tap the user believes is dismissing a game lands on the real approve13button underneath. Related abuses intercept rather than draw: an accessibility-style service drives the14interaction programmatically. The sensitive screen is complicit when it accepts a touch it cannot confirm the15user saw: it does not detect that it is obscured, does not filter touches that passed through an overlay, or16confirms an action without binding the confirmation to what was actually displayed. The bug is a consequential17approval taken while the screen cannot vouch for what the user saw or touched. You hunt these by finding every18sensitive screen and checking whether it defends against being overlaid or driven.1920## When to use2122- A mobile app presents consent, confirmation, or credential-entry screens another app could overlay.23- A sensitive action is approved by a tap that an overlay could hide, fake, or pass through.24- An accessibility-style service or intercepting app could drive the interaction programmatically.2526## Scope check2728Hunt overlay and tapjacking abuse only on apps and devices you own or are authorized to assess, on test29devices and accounts, using a benign test overlay you control against a test screen rather than deceiving a30real user. A confirmed case makes a user approve an unintended sensitive action, so keep every probe within31scope. If you can't name the authorization, stop.3233## The loop34351. **Establish whether the sensitive screen can vouch for what the user saw and touched first.** For each36 consequential screen, determine whether it detects when it is obscured and refuses or filters the touch,37 and binds its confirmation to the action actually displayed, or whether it accepts a tap without knowing38 whether an overlay hid or faked the interface. This is the false-positive killer: a screen that rejects39 obscured touches and confirms only the displayed action cannot be redressed by an overlay. Name the40 screen's defense before crafting an overlay.41422. **Enumerate the consequential screens.** List the screens where a single interaction has real43 consequence: granting a permission, confirming a payment or a transfer, entering a credential or a44 one-time value, or approving an irreversible action. These are the targets an overlay would redress.45463. **Check obscured-touch handling.** Determine whether each screen detects that another window is drawn over47 it and either refuses the touch or ignores touches that passed through an overlay, or whether it accepts48 the interaction regardless, so an overlay can hide or fake the interface while the real control receives49 the tap.50514. **Check the confirmation binding.** Determine whether the approval is bound to what was displayed, so a52 user confirming sees and confirms the actual action, or whether the confirmation is a generic tap that an53 overlay can steer to a different underlying action than the one the user believes they are approving.54555. **Check programmatic interception.** Determine whether an accessibility-style service or another mechanism56 could drive the interaction without a genuine user touch, approving the sensitive action programmatically,57 and whether the screen distinguishes a real user interaction from a synthesized one where it matters.58596. **Confirm and record.** Confirm by placing a benign test overlay over a test screen, or driving it60 programmatically, and showing a sensitive action is approved while the user's apparent interaction was with61 the overlay, on a test device. Kill the lead if the screen rejects obscured touches, binds confirmation to62 the displayed action, and resists programmatic approval, or if the action carries no consequence worth63 redressing. Record the screen, the overlay or interception, the approved action, and the redress observed,64 or set a `kill_reason`.6566## Where overlay abuse leaks6768- **The screen's ability to vouch is the finding.** A sensitive approval is safe only if the screen knows the69 user saw and touched the real control; the bug is accepting a tap it cannot vouch for. Name the missing70 defense.71- **Obscured touches redress the action.** A screen that accepts a touch while obscured lets an overlay hide72 the real control and fake a benign one, so the user taps approve believing they tapped something else.73- **Unbound confirmations approve the wrong thing.** A generic confirming tap not bound to the displayed74 action can be steered by an overlay to approve an action the user never saw.75- **Programmatic interaction skips the user.** An accessibility-style service can approve a sensitive action76 without a genuine touch, so a screen that cannot tell a real interaction from a synthesized one is driven.77- **Consequence is what makes it matter.** Redressing a screen with no real consequence gains nothing; the78 targets are permissions, payments, credentials, and irreversible actions.7980## Worked example (a confirm and a kill)8182> **Confirm.** A payment confirmation screen approves the transfer on a tap and does not detect when it is83> obscured. A benign test overlay draws a game-like interface over it so the user's tap on a decoy button84> lands on the real approve control, confirming a test transfer the user did not intend, on a test device.85> **Confirmed** tapjacking of a consequential confirmation, `high`, remediation = refuse or filter touches86> received while the screen is obscured by another window, bind the confirmation to the displayed transaction87> details, and require a genuine user interaction for consequential approvals.88>89> **Kill.** The same screen detects that another window overlays it and refuses the touch, ignores touches90> that passed through an overlay, binds the approval to the displayed transaction, and requires a genuine91> interaction that a programmatic service cannot synthesize. An overlay hides nothing that still approves, and92> a driven tap is rejected. **Killed**, `kill_reason` = "the screen refuses obscured and passed-through93> touches, confirms only the displayed action, and rejects synthesized interaction; no overlay or interception94> approves an unintended action."9596## Rationalizations to reject9798- *"The user still has to tap approve."* -> An overlay can hide the approve button under a decoy so the user99 taps it believing it is something else; the tap is real, the user's understanding is not.100- *"Overlays require a special permission."* -> Users grant overlay capability routinely, and some contexts101 allow it without a prompt; assume an overlay can be present and defend the screen rather than the platform.102- *"Our screen looks distinctive."* -> An overlay can fake or hide the whole screen; appearance does not103 protect a screen that accepts obscured touches.104- *"Accessibility services are trusted."* -> A malicious or abused accessibility-style service can drive the105 interaction; a consequential approval should require a genuine user touch it can distinguish.106- *"It is only a confirmation dialog."* -> A confirmation that approves a permission, payment, or irreversible107 action is exactly the consequential target; bind it to what was displayed.108109## Executing this in practice110111You need every consequential screen, whether each detects and refuses obscured or passed-through touches,112whether its confirmation is bound to the displayed action, and whether it resists programmatic approval. For113each, decide whether an overlay or an intercepting service could make the user approve an unintended action.114Reading the screen's obscured-touch and confirmation handling settles most leads; placing a benign test115overlay or driving the screen programmatically on a test device settles the rest.116117## Related118119- `auditing-clickjacking-and-ui-redressing` - the web counterpart, where a framed page is redressed by an120 overlay, sharing the obscured-interaction reasoning with this mobile case.121- `auditing-android-component-exposure` - a screen reachable by another app is more easily brought forward for122 redressing, the reachability that skill audits.123- `auditing-mobile-biometric-and-local-auth-bypass` - a consequential approval gated by local auth relies on124 the genuine-interaction guarantee this skill checks against overlays and interception.125- `auditing-android-intent-redirection-and-pendingintent` - an intent that brings a sensitive screen forward126 for overlay is delivered through the redirection that skill audits.127- [FINDING-SCHEMA.md](../../FINDING-SCHEMA.md) - source = the overlaying or intercepting app, sink = the128 sensitive screen accepting the redirected interaction, evidence = a sensitive action approved while the129 user's apparent interaction was with a benign test overlay on a test device.