<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: eidas-pro</title>
    <description>The latest articles on DEV Community by eidas-pro (@fldsakos).</description>
    <link>https://dev.to/fldsakos</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F937880%2Fef1dc51a-2ec8-4173-abc3-4af848add53c.jpeg</url>
      <title>DEV Community: eidas-pro</title>
      <link>https://dev.to/fldsakos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fldsakos"/>
    <language>en</language>
    <item>
      <title>EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened</title>
      <dc:creator>eidas-pro</dc:creator>
      <pubDate>Sat, 18 Apr 2026 19:06:10 +0000</pubDate>
      <link>https://dev.to/eidas-pro/eu-age-verification-app-hacked-in-2-minutes-what-actually-happened-2d3p</link>
      <guid>https://dev.to/eidas-pro/eu-age-verification-app-hacked-in-2-minutes-what-actually-happened-2d3p</guid>
      <description>&lt;p&gt;On April 15, 2026, the EU launched the age verification "mini-wallet" app. Within 24 hours, security researcher Paul Moore published a video claiming he bypassed it in 2 minutes. The story went viral across Reddit with tens of thousands of upvotes.&lt;/p&gt;

&lt;p&gt;The headlines write themselves, but the technical reality is more nuanced.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Flaws
&lt;/h2&gt;

&lt;p&gt;Paul Moore identified three design flaws in the wallet app's local device implementation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. PIN decoupled from the credential vault&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The PIN protecting the wallet is verified locally, separate from the cryptographic key store that holds the actual credentials. On a rooted device, the PIN can be brute-forced without triggering the key store's protections.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Rate limiting stored as plaintext&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lockout counters that prevent repeated PIN attempts are stored as plaintext values in local storage. With root access, these counters can be reset directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Biometric gate is a boolean flag&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The biometric authentication check resolves to a simple boolean value. On a rooted device, this flag can be toggled without actually completing biometric verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Remains Secure
&lt;/h2&gt;

&lt;p&gt;All three bypasses share a critical prerequisite: &lt;strong&gt;physical access to a rooted device&lt;/strong&gt;. None of them enable remote attacks.&lt;/p&gt;

&lt;p&gt;More importantly, the &lt;strong&gt;OpenID4VP protocol&lt;/strong&gt; that governs the actual verification transaction between wallet and verifier was not compromised. When a verifier checks someone's age, they validate cryptographic proofs signed by the PID (Person Identification Data) provider. These signatures cannot be forged through any of the three local bypasses.&lt;/p&gt;

&lt;p&gt;For developers building age-gated services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The signed attestations your backend validates are still trustworthy&lt;/li&gt;
&lt;li&gt;No changes needed to your verification integration&lt;/li&gt;
&lt;li&gt;The privacy model (verifiers receive yes/no, never the actual birthdate) is intact&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementation vs. Protocol
&lt;/h2&gt;

&lt;p&gt;This is a textbook case of the distinction between &lt;strong&gt;protocol soundness&lt;/strong&gt; and &lt;strong&gt;implementation quality&lt;/strong&gt;. The cryptographic architecture — based on OpenID4VP credential presentation — is well-designed. The local device protections that guard access to the wallet were implemented with shortcuts.&lt;/p&gt;

&lt;p&gt;The fixes are straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bind PIN verification to the hardware key store&lt;/li&gt;
&lt;li&gt;Move rate limiting into the secure enclave&lt;/li&gt;
&lt;li&gt;Replace the boolean biometric flag with a challenge-response tied to the key store&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these require protocol-level changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Structural Concern
&lt;/h2&gt;

&lt;p&gt;The bigger issue is platform lock-in. The wallet app only runs on iOS and Android, with a hard dependency on Google Play Services. There is no libre client, no desktop version, and no way for users of alternative mobile platforms to participate.&lt;/p&gt;

&lt;p&gt;For a system mandated by EU regulation, this exclusivity raises legitimate accessibility and sovereignty questions that outlast the fixable implementation bugs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Positive Signal
&lt;/h2&gt;

&lt;p&gt;Open-source security auditing worked exactly as designed. The code was auditable, a researcher found flaws on day one, and published them responsibly. This is the model functioning correctly.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full technical analysis with more detail on the protocol and platform lock-in concerns: &lt;a href="https://eidas-pro.com/blog/eu-age-verification-app-hack-explained" rel="noopener noreferrer"&gt;EU Age Verification App Hack Explained&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>eudi</category>
      <category>webdev</category>
      <category>privacy</category>
    </item>
  </channel>
</rss>
