Companion Attacker
Some vulnerabilities are, by definition, cross-app: the whole premise is a
second co-resident app crossing a trust boundary. Those cannot be
demonstrated inside DVMA alone, so com.dvma.attacker exists as the “malicious
co-resident app” the docs reference. It has its own UID and signing key and
requests no dangerous permissions, that is the point: it shows what an
arbitrary installed app can harvest from a vulnerable DVMA.
The cleanest example, the cross-app OTP leak
- DVMA fires an implicit broadcast
com.dvma.action.OTP_ISSUEDwith no receiver permission (the vulnerable path), or gated behind a signature-level permission (the fix). - The attacker’s
OtpLeakReceiver(kept alive by a foregroundOtpHarvestService) receives it, logs under theDVMA-ATTACKERtag, and writes a pullable capture file. On the secure path Android drops delivery, because the attacker cannot hold DVMA’s signature-level permission.
The other cross-app primitives
The same shape covers the other cross-app modules: BroadcastForger (spoof
exported receivers), ComponentInvoker (start DVMA’s exported Activities by
name), ServiceBinderClient (bind the privileged Messenger service), and
HijackActivity (task-affinity reparenting). See
companion/dvma-attacker/README.md for the full trigger map and the
one-command demos (automation/scripts/demo.sh <otp|broadcast|components>).