Mobile App Image Parsing Security for Product Teams
Mobile apps hand attacker-supplied images, PDFs and previews to OS parsers they do not own, and zero-click exploits target exactly that path. Here is how to re-encode on the server, set a patch floor, and scope a mobile pentest of the inbound content pipeline.
Here is an uncomfortable exercise for any product team that ships a chat feature, a document viewer, or a profile photo upload. Open your app's analytics, find the oldest iOS and Android versions still reporting active sessions, and then look up how many actively exploited image and document parser bugs have been fixed since those versions stopped receiving updates. The number is rarely zero, and the gap between "we support older phones so we do not lose customers" and "we deliver attacker-supplied files to phones with known-exploited parsers" turns out to be a single sentence long.
That gap got two fresh reminders in the last couple of weeks. Apple backported its fix for an exploited CoreGraphics flaw to older iPhones that had been quietly sitting on a known bad parser, and this week Google patched an Android Framework flaw that allowed zero-click remote code execution. Neither of those bugs lives in your code. Both of them can be reached through your code the moment your app takes an image, a PDF, or a link preview from one user and renders it on another user's device. That is the core of mobile app image parsing security, and it is a problem most mobile teams have never been asked to own.
Why mobile app image parsing security is really a platform question
When a mobile app displays a JPEG, a HEIC, a WebP, a GIF, or a PDF, it almost never decodes those bytes itself. On iOS the work goes to ImageIO, CoreGraphics, and the various frameworks layered above them. On Android it goes to Skia, the platform codecs, the media framework, and in a surprising number of cases a vendor-supplied codec library the handset maker bolted on. Those parsers are written in memory-unsafe languages, they handle formats with decades of accumulated complexity, and they run inside your app's process with your app's permissions and your app's data.
From a threat modeling perspective, that changes the shape of the attack surface in a way most teams miss. The traditional mobile assessment worries about what your app stores, what it sends, and whether it validates the server. Those are good questions. The question that gets skipped is what your app accepts from other users and hands straight to an operating system component you do not control, cannot patch, and cannot even see the version of on most devices. If an attacker can get a crafted file into the content your app renders, the attacker does not need a vulnerability in your app at all. Your app becomes the delivery vehicle, and the platform parser becomes the exploit target.
There is a control objective hiding in there that maps cleanly to NIST SP 800-53 (https://csrc.nist.gov/pubs/sp/800/53/r5/upd1/final). SI-10 asks for validation of information inputs, and SI-2 asks for timely flaw remediation. A mobile app that renders untrusted content on unpatched devices fails both at once, because the input reaches a parser that has a published, remediated flaw, and the remediation never arrived on that device. Your security team cannot push the patch. What it can do is decide which devices receive the content and what shape the content is in when it arrives.
The zero-click lineage every mobile product team should know
The history here is not theoretical, and it is worth knowing well enough to tell a product manager about it over lunch. In 2015 the Stagefright family of bugs in Android's media library showed that a single crafted MMS could reach a vulnerable parser without the user ever opening anything, because the messaging app helpfully processed the media to generate a thumbnail. That last detail is the whole story in miniature. The user did nothing. The app did something convenient on the user's behalf.
In 2019 WhatsApp fixed CVE-2019-11932, a double-free in the open-source GIF decoding library its Android app bundled for the gallery view. That one is instructive because the vulnerable parser was not part of the operating system. It was a third-party dependency the app shipped, which means the app vendor owned the patch and also owned the exposure for as long as users stayed on old app versions.
Then came FORCEDENTRY, CVE-2021-30860, which Citizen Lab captured in the wild (https://citizenlab.ca/2021/09/forcedentry-nso-group-imessage-zero-click-exploit-captured-in-the-wild/) and Google Project Zero later took apart in one of the most jaw-dropping technical writeups of the decade (https://googleprojectzero.blogspot.com/2021/12/a-deep-dive-into-an-nso-zero-click.html). The attackers sent a PDF disguised with a GIF extension to iMessage, which passed it to CoreGraphics, where a bug in the JBIG2 decoder became the foundation for an entire emulated computer built out of image decompression operations. Nobody tapped anything. Apple's response was to harden the message pipeline with its BlastDoor sandbox, which is a nice thing for iMessage to have and a thing your in-app chat feature definitely does not have.
The pattern kept going. BLASTPASS in 2023 used malicious PassKit attachments to reach an ImageIO bug, CVE-2023-41064, closely related to the libwebp heap overflow tracked as CVE-2023-4863 that rippled through browsers, Electron apps, and countless mobile apps that bundled their own copy of the library. Kaspersky's Operation Triangulation research the same year traced a zero-click iMessage chain that began with a malformed TrueType font. In 2025 Apple patched an exploited ImageIO out-of-bounds write, CVE-2025-43300, that WhatsApp said was chained with a flaw in its own linked-device sync to target specific users, and Samsung patched an exploited bug in its Quram image codec library that ships on Galaxy devices. Every one of those is on CISA's Known Exploited Vulnerabilities catalog (https://www.cisa.gov/known-exploited-vulnerabilities-catalog) or was treated with equivalent urgency by the vendor, and every one of them sat underneath apps that had no idea they were part of the attack path.
Here's the thing a CEH learns early and a product roadmap rarely reflects. Attackers who can afford zero-click chains pick delivery paths that the target already trusts. iMessage and WhatsApp got hit first because they are everywhere. A B2B fintech app with a support chat, a healthcare portal that lets patients upload photos of insurance cards, or a field service app that syncs job site pictures between technicians is a smaller target, but it is also a target with no BlastDoor, no dedicated exploit research team, and a user base that skews toward the corporate-issued phone nobody has updated since the last hardware refresh.
Minimum OS version is a security control, not a marketing decision
Every mobile team has had the meeting. Somebody from growth points out that four percent of active users are still on an iOS version from three years ago, or an Android build whose manufacturer stopped shipping security patches in 2023, and that dropping support would cost real revenue. The engineering lead nods. The minimum deployment target stays where it is. Nobody in the room asks what those devices will do when they render a file another user uploaded.
OWASP MASVS (https://mas.owasp.org/MASVS/) actually has a line item for this. MASVS-CODE-1 says the app requires an up-to-date platform version, and MASVS-CODE-2 says the app has a mechanism for enforcing app updates. Those two controls are usually discussed as hygiene. In the context of untrusted content they are the difference between a parser bug being someone else's problem and a parser bug being an exploitation path through your product. If you want the plain English walkthrough of the broader standard, the earlier post on OWASP MASVS for product teams (https://thecyberone.com/blog/owasp-masvs-plain-english-product-teams-2026) covers it without the acronym fatigue.
The practical fix does not have to be a hard cutoff that strands a slice of your customers. A more mature approach is tiered. The app keeps launching on older OS versions, but features that render content from other users degrade gracefully when the device is below a patch floor you define. On Android, Build.VERSION.SECURITY_PATCH reports the security patch level as a date string, which gives you something much more useful than the API level alone, because two phones on the same Android version can be years apart on patches depending on the manufacturer. On iOS the OS version tells you most of what you need, since Apple's backports land as point releases. Below your floor, inbound images can be displayed as server-rendered, re-encoded thumbnails only, documents can open in a server-side viewer instead of the native parser, and link previews can be disabled entirely. The user still gets the feature. The attacker loses the direct line to the unpatched parser.
That patch floor should be a written number with an owner, reviewed every time Apple or Google ships an emergency fix for an exploited parser. If the CoreGraphics backport or this week's Android Framework zero-click is in KEV, your floor should move, and the decision about whether to move it belongs to security and product together rather than to whichever engineer happens to be editing the build configuration that sprint. CM-8 thinking applies too. You cannot set a floor if you do not know what your users run, so the device and patch-level distribution should be a dashboard someone actually looks at, not an analytics query nobody has run since launch.
Sanitize on the server before the bytes ever reach a phone
The strongest control in this whole problem lives on your backend. If a user uploads an image, the server should decode it, strip the metadata, and re-encode it into a fresh, boring, well-understood output before any other client ever receives it. The original bytes, with whatever crafted structure an attacker packed into them, never leave the server. What reaches the second phone is a file your own pipeline produced from scratch, at sizes and formats you chose, with none of the exotic features a parser exploit depends on.
This is the same principle as content disarm and reconstruction in email security, and it is wildly effective against the FORCEDENTRY class of bug, because those exploits depend on precise control of the file's internal structure. A JBIG2 stream hidden inside a PDF wearing a GIF costume does not survive being decoded to pixels and written back out as a plain JPEG. Neither does most of the malformed font, color profile, and chunk trickery that shows up in real-world chains. Documents follow the same logic. Convert uploaded PDFs to flattened images or to a sanitized PDF generated by your own renderer, and refuse formats your product does not genuinely need. If your support chat has to accept HEIC, DNG, TIFF, SVG, and PSD files, somebody should be able to explain why.
The catch, and there is always a catch, is that you have just moved the dangerous parser from the phone to your server. That is a good trade, because you control the server's patch level and you can sandbox it, but it is only a good trade if you actually do both. ImageMagick's ImageTragick bug, CVE-2016-3714, is the cautionary tale of an image processing service turning into remote code execution on the backend. Run the re-encoder in an isolated container or a dedicated worker with no network egress, no credentials to anything important, strict memory and time limits, and a format allowlist enforced by magic bytes rather than by file extension. Keep that library on an SI-2 clock with the same urgency you would give an internet-facing appliance, because functionally that is what it is. And log what it rejects, since a sudden burst of malformed uploads from one account is exactly the kind of signal a security team wants to see before the next stage arrives.
End-to-end encrypted messaging features complicate this, because the server cannot re-encode what it cannot read. In that architecture the sanitization has to happen on the sending device before encryption, and the receiving device has to be the one enforcing the patch floor and refusing to hand unusual formats to the native parser. It is harder engineering, which is precisely why the large messaging platforms build dedicated sandboxes for it. A smaller team shipping an encrypted chat feature should know they have signed up for that problem, ideally before an auditor or a researcher points it out.
The preview paths that run before anyone taps anything
Zero-click is rarely magic. It is usually a convenience feature doing work on content before the user has made any decision about it. The mobile pentest question is simply where your app does that.
Rich push notifications are the first place to look. On iOS, a Notification Service Extension can download an attachment and hand it to the system for display on the lock screen. That means a file from an untrusted sender can be fetched and rendered while the phone sits in a pocket, which is a lovely user experience and a direct parser path with no tap required. On Android, notification code that loads a remote image URL into a large-icon or big-picture style does the same job. If those attachments come from user-generated content rather than from your own marketing team, they should come from the sanitized server pipeline and nowhere else.
Link previews are the second place. Researchers Talal Haj Bakry and Tommy Mysk showed back in 2020 that a number of popular chat apps generated link previews on the receiving device, which meant the recipient's phone fetched arbitrary URLs, leaked its IP address, and in some cases downloaded and parsed very large files before the user had read the message. Generating previews server-side, from a hardened fetcher, fixes the privacy leak and the parser exposure in one move.
The third place is anything that renders HTML. MASVS-PLATFORM-2 covers WebView use, and the relevant failure in this context is a WebView that loads user-supplied content with JavaScript enabled, file access enabled, or a JavaScript bridge exposed to whatever page shows up. A WebView is a browser engine with all of the image, font, and media parsers that come with it, and on older Android devices it may be a browser engine that has not been updated in a long time. Treat inbound HTML as hostile, render it as text where possible, and if you must render it, do it with JavaScript disabled, no file access, no bridge, and a content security policy that would make a web pentester smile.
The fourth place is the quiet background work. Gallery views that generate thumbnails of every synced file, share extensions that parse incoming content from other apps, document providers, and offline sync jobs that pre-render attachments overnight all count. Ask the engineers to list every code path that decodes content the current user did not personally choose to open. The list is usually longer than anyone in the room expects, and it is the real attack surface for this class of bug.
How to scope a mobile pentest of the inbound content pipeline
Most mobile penetration testing engagements are scoped around the app binary and its API. That catches insecure storage, weak certificate validation, broken authorization on endpoints, and the usual secrets someone left in a configuration file. It does not automatically catch the inbound content pipeline, because nobody wrote it into the scope, and assessors test what the statement of work tells them to test.
A useful scope for mobile app image parsing security starts by tracing content from the sender to the renderer. The assessor uploads crafted and malformed files through every user-facing entry point, including profile photos, chat attachments, document uploads, and anything that accepts a URL, and then verifies what actually arrives on a second test device. If the original bytes reach the recipient unchanged, that is a finding, regardless of whether a working exploit exists on the current OS version, because the protection depends entirely on every recipient being patched. If the server re-encodes, the assessor turns attention to the re-encoding service itself, checking format allowlisting, magic byte validation, resource limits, network isolation, and whether that worker holds any credential worth stealing.
The second part of the scope covers the preview paths. Testers should confirm whether notification extensions fetch remote content, whether link previews are generated on the device, whether WebViews render user content and with which settings, and whether background thumbnailing runs on unsanitized files. Each of those is a place where a zero-click exploit could land, and each one has a design fix that is cheaper before launch than after a disclosure email.
The third part covers the patch floor. The assessor installs the app on the oldest supported OS versions, checks whether the app knows the device's patch level, and verifies that content features degrade the way the design document says they will. This is also where the update-enforcement mechanism from MASVS-CODE-2 gets tested, because a beautifully sanitized pipeline in the current release does not help users stuck on an app version from last spring that still bundles a vulnerable GIF library.
The deliverable from that kind of engagement should read like an attack path rather than a vulnerability list. Sender uploads crafted file, server stores and forwards original bytes, recipient's notification extension downloads and renders it on a device three patch levels behind, platform parser bug is reachable without a tap. That is a sentence a product leader can understand, a finding an engineer can fix, and evidence a compliance reviewer can map to SI-10 and SI-2. For teams in Plano, Frisco, and across DFW building B2B and healthcare mobile apps, it is also the conversation an enterprise customer's security questionnaire is going to force eventually, so it might as well happen on your schedule.
None of this requires becoming an exploit developer. It requires accepting that the moment your mobile app renders content from one user on another user's device, mobile app image parsing security becomes your responsibility, even though the parsers belong to Apple, Google, and a handset vendor's codec team. Re-encode on the server, set and enforce a patch floor, move previews off the device, lock down WebViews, and then pay someone to try to break all of it.
That last step is the one CyberSphere's Mobile App Pen Testing module, MobileAssess, was built for. It runs iOS and Android assessments against OWASP MASVS, including the MASVS-CODE and MASVS-PLATFORM controls that govern minimum platform versions, update enforcement, and WebView handling, and it can be scoped to trace untrusted content from upload through server-side processing to rendering on an older test device, with findings written as attack paths and tied back to the controls an auditor will ask about. The result is a report your engineers can act on and your enterprise customers' reviewers will accept, generated before the next exploited parser bug makes the decision for you. The platform lives at https://cybersphere.thecyberone.com/, and the next emergency backport from Apple or Google is a good excuse to look at what your app is handing to the phone.
Frequently Asked Questions
How quickly does Innovation Network Design respond to a security incident?
Our SOC triages and notifies within 15 minutes with confirmed details and containment steps, rather than handing you a queued alert. Incident response retainer clients carry a 2-hour guaranteed response.
Do you only work with businesses in the Dallas-Fort Worth area?
We are based in McKinney, Texas and work on-site across Plano, Allen, Frisco and the wider DFW metroplex. Our monitoring and response operate remotely, so we also support organizations nationwide.
How do we get started?
Start with a free assessment. Contact us or call 512-518-4408 and we will review your current setup and give you clear, prioritized recommendations before you commit to anything.
Need Help With This?
Innovation Network Design helps businesses across McKinney, Dallas, and nationwide with expert cybersecurity services.
Danny Mercer
Innovation Network Design
With nearly a decade in cybersecurity and IT infrastructure, our team delivers expert insights to help businesses in McKinney, Dallas, and across DFW make informed security decisions. Have a question? Get in touch.
Ready to Secure Your Business?
Get a free security assessment and find out where your organization stands.