My bank's Android application allows users to perform financial transactions without the use of the physical token generator (which requires an ATM card to be inserted and a valid PIN to be provided) one would normally require when using the bank's web interface. However, this is only supported when using the app on a phone that comes with a hardware Secure Element in which it can store cryptographic keys and such.
Initially, this seemed like a good decision to me, since devices without a Secure Element would have to store keys in memory or on persistent storage, and are therefore vulnerable to attacks by malware installed on the same device.
However, when thinking this through I got the impression that using the Secure Element actually would leave one just as vulnerable to these attacks than when solely protecting keys through software; compare these two approaches:
- The system relies on the operating system to restrict access to the keys: other apps can't access them while in userland, but when an attacker manages to gain root access to the device they can steal the keys and sign or encrypt whatever they want, pretending to be the banking app. This allows them to forge transactions.
- The system stores keys on the SE and relies on the operating system to restrict access to this hardware: other apps can't access them while in userland, but when an attacker manages to gain root access they can instruct it to sign and encrypt whatever they want, pretending to be the banking app. This allows them to forge transactions.
Because of this, the use of the hardware chip for this purpose seems rather pointless to me. The same holds for similar applications relying on it to store sensitive material.
Am I missing something here? Is there a situation where the secure element does offer a clear security benefit to this banking app, making it reasonable to mandate it?