跪拜 Guibai
← All articles
Android · Flutter · Frontend

Flutter's Emergency 3.47.8 Release Blocks a Certificate Authority Whose Private Key Was the Number 4

By 恋猫de小郭 ·
Read original on juejin.cn ↗ Google Translate ↗ Alt translation

Flutter apps using dart:io on Android, Windows, or Linux can trust a forged certificate from the compromised eMudhra chain even after OS vendors blacklist it, because the runtime checks its own BoringSSL copy. Upgrading to 3.47.8 is the only way to close that gap on those platforms.

Summary

eMudhra, a company whose business is digital trust, let eight intermediate CA private keys ride on the global trust chain for eighteen months. The keys were single-digit integers; one was literally 4. A P-384 private key should be a random integer near 2^384, so anyone who noticed could impersonate the CA and forge valid TLS certificates for arbitrary domains. The exposure ended only after the weak keys were discovered and browsers and OS vendors pushed emergency blacklists.

Those blacklists do not reach every Flutter app. dart:io on Android, Windows, and Linux validates TLS chains with the bundled BoringSSL engine, which does not read the operating system's intermediate CA blacklist. Flutter 3.47.8 and Dart 3.13.7 update BoringSSL so the compromised eMudhra intermediate certificates are blocked during TLS verification itself. On Android 14+, dart:io now loads system roots from the updatable Conscrypt APEX module, so future root store revocations delivered through Google Play system updates apply automatically. Apps that ignore certificate verification entirely won't get any protection from this fix.

Takeaways
— Flutter 3.47.8 and Dart 3.13.7 are emergency security releases.
— eMudhra's eight intermediate CA private keys were single-digit integers on P-384 curves; one of them was 4.
— A valid P-384 private key should be a random integer near 384 bits, giving roughly 2^384 possibilities.
— With the compromised intermediate CA, attackers can forge valid TLS/HTTPS certificates for any domain.
— Chrome and Android emergency blacklists cover the eMudhra intermediate certificates.
— dart:io on Android, Windows, and Linux uses BoringSSL and does not consult the OS intermediate CA blacklist.
— The Flutter update changes BoringSSL so the eMudhra intermediate certificates are blocked during TLS verification.
— On Android 14+, dart:io reads system roots from the updatable Conscrypt APEX module, making future Play-delivered root revocations apply automatically.
— Apps that disable certificate verification receive no protection from this fix.
Conclusions

eMudhra's weak keys were a release-process failure, not a bypass of strong cryptography: eight intermediate CA private keys were single-digit integers, and they stayed trusted for eighteen months. A CA that doesn't validate key strength at issuance can poison the whole trust chain.

dart:io's bundled BoringSSL means OS-level blacklists don't cover Flutter apps on Android, Windows, or Linux. Closing a known compromised CA required a coordinated runtime release, not just an OS update.

Concepts & terms
Intermediate CA
A certificate authority whose own certificate is signed by a root CA and which issues end-entity certificates. If an intermediate CA is compromised, an attacker can mint valid certificates without touching the root.
BoringSSL
Google's fork of OpenSSL used by Chromium and Flutter's dart:io. It validates TLS certificate chains inside the runtime, so OS-level certificate blacklists are not consulted.
Conscrypt APEX
An Android module that supplies TLS and root certificate handling. On Android 14+ it can be updated via Google Play system updates, allowing root store revocations to reach apps without a full OS update.
P-384
An elliptic curve with 384-bit keys used in cryptography. A valid private key should be a near-384-bit random integer, so a single-digit key is catastrophically weak.
From the discussion
Featured comments
木易95

That gave me a fright. I looked it up, and this is mainly used in India itself.

See top comments, translated →
Source: juejin.cn ↗ Google Translate ↗ Backup ↗