Project Zero details how a Dolby Unified Decoder vulnerability (CVE-2025-54957) enabled a 0-click exploit chain against Pixel 9 devices, bypassing Android security through precise memory manipulation and creative workarounds for ASLR/SELinux limitations.
The integration of AI-powered features like automatic audio transcription in messaging apps has expanded the attack surface of mobile devices. By processing media attachments before user interaction, audio decoders like Dolby's Unified Decoder (UDC) now reside squarely in 0-click attack territory. Our analysis of CVE-2025-54957 reveals how subtle specification ambiguities in Dolby's EMDF container handling created a potent exploitation vector:
The Vulnerability Mechanics
At the core lies a dual-primitive flaw in Dolby's DD+ decoding:
- Buffer Overrun: The
variable_bits()function allows unboundedemdf_payload_sizevalues. During allocation, an integer overflow in alignment calculation (total_size += (8 - total_size) % total_size) enables heap corruption with partially controlled data. - Controlled Leak: When
emdf_container_lengthexceedsskipl, uninitialized memory beyond the skip buffer can be read. While normally harmless, combined with the overflow, it becomes a powerful tool.
Exploitation Challenges
Android's defenses posed significant hurdles:
- ASLR: Required guessing 4-bit heap alignment (1/16 success) and library load addresses (another 1/16), reducing reliability to ~0.4%. The exploit compensated through repeated transmission attempts.
- SELinux Restrictions: Blocked traditional routes like
dlopen()or executable memory. The solution: writing shellcode via/proc/self/memusingpwrite. - scudo Allocator: Secondary heap header manipulation enabled shifting allocations to create writable gaps before guard pages.
Novel Exploit Primitives
The chain developed three key capabilities:
- WRITE DYNAMIC: Chained syncframes overwrote the skip pointer to progressively fill the dynamic buffer beyond its 3066-byte limit.
- WRITE STATIC: Corruption of
heap_lenandpayload_extraallowed arbitrary writes within the static buffer via misaligned EMDF payload allocations. - Pointer Surgery: Partial pointer overwrites redirected function calls (e.g., memcpy → increment gadget) to gradually morph
fopenintopwrite.
Execution Flow
- Memory Setup: Shellcode staged via WRITE DYNAMIC before enabling WRITE STATIC.
- Function Hijacking: DLB_CLqmf_analysisL's function pointers redirected to:
- Copy GOT entries into writable memory
- Increment a function pointer toward
pwrite246 times
- Final Payload:
pwriteinjected shellcode over__stack_chk_failin libc, executed via GOT redirection.
Mitigation Insights
While Android's defenses increased exploit complexity, key weaknesses emerged:
- Low-bit ASLR randomization proved more disruptive than high-bit entropy
- Missing seccomp policies on Pixels allowed
pwritesyscalls -fbounds-safetycompilation (used in iOS/macOS UDC) would have blocked the vulnerability- Scudo's secondary heap lacked checksum protections
This exploit demonstrates how specification ambiguities in media formats become critical vulnerabilities when processed in 0-click contexts. Part 2 will detail the kernel escalation via CVE-2025-36934.
Vulnerabilities fixed January 5, 2026. Tested on Google Pixel 9 running Android 15.
Comments
Please log in or register to join the discussion