How to Audit the Third-Party SDKs Hiding in Your App
5 Jun 2026 · 8 min read · Erik van Kammen
Open up a typical mobile app and count how much of it you actually wrote. For most teams it is a minority. The rest is third-party SDKs: analytics, crash reporting, ads, attribution, authentication, payments, maps, push notifications. Each one is convenient, and each one is code running inside your app with your permissions, your network access and your users' trust. That is the uncomfortable truth behind almost every modern app-compliance and security problem. The risk you cannot see is usually in the code you did not write. This post is about how to find it: how to build an inventory of your SDKs, what categories of risk to look for, and how to make the whole thing a repeatable check instead of a once-a-year panic.
When you add an SDK, you inherit everything it does. It can read data your app has access to, make network calls to servers you have never heard of, collect identifiers, and pull in its own dependencies that you never explicitly chose. From the operating system's point of view, and from a regulator's, that SDK's behavior is your app's behavior. If an analytics SDK quietly ships device identifiers to a server in another country, that is your data-collection practice, your privacy-manifest entry, your Data Safety declaration, and your liability.
The reason this is a blind spot is that SDKs are designed to be invisible. You integrate one in an afternoon and never think about it again. It updates, it adds a dependency, it changes what it collects, and none of that shows up in your own code review. The gap between what you think your app does and what it actually does is almost always SDK-shaped.
It helps to break the problem into categories, because each one needs a different kind of check.
Data leakage and privacy risk. The most common issue. An SDK collects more than you realized, shares it with third parties, or sends it somewhere that creates a legal problem. This is what drives privacy-manifest mismatches on iOS and Data Safety mismatches on Android. It is rarely malicious, just under-disclosed.
Known vulnerabilities. SDKs are software, and software has CVEs. A networking library with a known remote-code-execution flaw, an image parser with a memory-corruption bug, an outdated crypto library: any of these can sit inside your app for months because nobody is watching the versions you ship against the vulnerability feeds.
Malicious or tampered code. Rarer, but the most serious. A compromised dependency, a typosquatted package, or an SDK that has been quietly altered to exfiltrate data or inject behavior. Supply-chain attacks specifically target the trust you place in third-party code.
Compliance and licensing gaps. An SDK with no privacy manifest, an incompatible open-source license, or a component that pulls you into scope of a regulation like the Cyber Resilience Act without you realizing. These do not break your app, they break your compliance posture.
You cannot audit what you have not listed, and most teams have never actually written down everything they ship. So the first task is a complete inventory. For every third-party SDK in your app, record the name, the exact version, what it is for, what data it touches, whether it ships its own privacy manifest, and what its own dependencies are.
The transitive dependencies are the part people skip and the part that matters most. The SDK you chose is visible, but the three libraries it pulls in are not, and a vulnerability or a data-collecting component three levels down is still inside your binary. A real inventory follows the whole tree, not just the top layer.
Once you have versions, you can match them against vulnerability data. This is the single highest-value automated check you can run, because it is purely mechanical and the data changes constantly. A component that was clean when you shipped can have a critical CVE published against it next week, and the only way you find out is by continuously matching your inventory against the feeds.
Doing this once is nearly useless. The value is in doing it on every build and on an ongoing schedule, so a newly disclosed vulnerability in something you already ship turns into an alert rather than a breach.
Version matching tells you about known problems. To catch the unknown ones, the under-disclosed data collection and the tampered code, you have to look at behavior. There are two complementary ways in.
Static inspection. Scan the SDK's binary and resources for signatures of known-bad patterns, suspicious code, or indicators that something has been modified. This is exactly the kind of work pattern-matching engines like YARA are built for: defining rules that flag malware families, tampering, or risky behaviors inside a binary, and running them across everything you ship.
Dynamic observation. Run the app through a network proxy and watch what each SDK actually sends and where. Domains you do not recognize, identifiers you did not expect to leave the device, and traffic that contradicts your privacy declarations all show up here in a way that no amount of reading documentation will.
Now connect the behavior back to what you have told the world. Does an SDK's data collection match your iOS privacy manifest? Does it match your Google Play Data Safety form? Does it match your privacy policy? Every gap is a compliance risk, and SDK behavior is the most common reason these declarations are wrong. This is where an SDK audit stops being a security exercise and becomes a regulatory one, tying directly into the obligations we cover for the iOS privacy manifest, Google Play Data Safety, and the Cyber Resilience Act.
The hard part of SDK auditing is not doing it once. It is that the answer changes every time you update a dependency, and dependencies update constantly. An inventory is out of date the week after you write it. A vulnerability scan is a snapshot of a feed that moves daily. A behavior check is invalidated by the next SDK release. A manual audit, however thorough, is a photograph of a moving target.
That is why this belongs in automation. AppCompliance is built around exactly this loop: it scans your app binary, builds and maintains the SDK and dependency inventory, matches every component against known vulnerability data, runs pattern-based checks for malware and tampering across what you ship, and reconciles the data behavior against your privacy manifest and store declarations. Run on every build, it turns the moving target into a continuous gate, so a new CVE, a tampered dependency, or an under-disclosed SDK becomes an alert before release instead of an incident after it.
The takeaway is simple. The code you wrote is the code you understand. The code you did not write is where the risk lives, and the only way to manage it is to inventory it, watch it, and check it continuously.
Because an SDK runs inside your app with your permissions and network access, its behavior counts as your app's behavior. Whatever data it collects or shares becomes your privacy-manifest entry, your Data Safety declaration and your legal responsibility, even though you did not write the code.
For each SDK: its name, exact version, purpose, the data it accesses, whether it ships its own privacy manifest, and its transitive dependencies. The dependencies pulled in by your SDKs matter as much as the SDKs themselves.
Match the exact versions in your inventory against vulnerability data, and do it continuously rather than once. A component that is clean today can have a critical CVE disclosed against it tomorrow, so ongoing matching is what actually protects you.
Combine static inspection, using pattern-matching engines like YARA to scan binaries for signatures of malware or tampering, with dynamic observation, running the app through a network proxy to see what each SDK actually sends and where.
Your iOS privacy manifest, your Google Play Data Safety form and your privacy policy all have to reflect what your app really does, SDKs included. Mismatches between SDK behavior and these declarations are one of the most common compliance failures.
On every build, and continuously against vulnerability feeds. Because dependencies and vulnerability data both change constantly, a one-time audit goes stale almost immediately.
Everything technical in this post is checkable from the build itself, and that is exactly what AppCompliance does: upload an iOS or Android build, and minutes later you have every issue that would get it rejected, with the exact fix next to it.
One email when we open the doors. No spam, just the launch.