Skip to content

Image: assets.bishopfox.com · rights & removal

Executive Summary

The analysis examines the security implications of using .NET MAUI for cross-platform mobile development, focusing on how shared C# assemblies affect security across Android and iOS targets. The framework's architecture creates a single point of convergence for business logic, models, and other critical code across platforms. This centralization means that vulnerabilities or secrets present in the shared layer are exposed simultaneously in both native applications.
The risk stems from how platform-specific implementations interact with this shared logic. While native platforms offer strong sandboxing, the MAUI abstraction relies on a shared assembly, meaning flaws in cross-platform logic impact both environments equally. The text contrasts this with native development where codebases remain separated, but argues that MAUI collapses this separation, making reverse engineering of the shared assembly highly leveraged.
The methodology for assessing security involves static analysis of the extracted assemblies, dynamic traffic inspection, and instrumentation to monitor the runtime environment, showing a unified attack surface against both platforms simultaneously.

Facts Only

* Cross-platform frameworks compile a shared C# codebase into Intermediate Language (IL).
* On Android, the runtime is Mono; on iOS, it is typically compiled ahead of time (AOT).
* Business logic and other code reside in the same shared assembly on both platforms.
* Platform-specific behavior is resolved at compile time via multi-targeting against platform-specific implementation files.
* Static analysis tools can decompile .NET assemblies to reveal class names, method names, string constants, and control flow.
* Android reverse engineering involves decompiling DEX bytecode with tools like JADX.
* The extraction process for Android APKs requires fingerprinting manifest strings and analyzing specialized sections to locate payload assemblies.
* For Android, real compiled machine code (Mono AOT stub) is found in files like libaot-*.dll.so, which are not recognized by standard .NET decompilers.
* The iOS equivalent has no direct equivalent to the Android assembly store structure, with managed assemblies typically shipping as loose .dll files within the app bundle.
* An extraction utility named mauidll is presented for streamlining the process of locating and extracting C# assemblies from Android.

Full Take

The narrative presents a tension between the engineering convenience of "write once" development and the security principle of isolation. The core pattern is that consolidation increases the blast radius; a single error in shared logic affects both ecosystems, eliminating platform-specific isolation as a mitigation strategy. This suggests a systemic vulnerability rooted in abstraction: assuming the shared layer correctly delegates sensitive operations (like SecureStorage) to secure native contexts creates a dangerous dependency.
The implication for cognitive sovereignty is that security architects must shift focus from securing platform boundaries to hardening the shared semantic layer. The effectiveness of defense-in-depth strategies relies on layering obfuscation and runtime checks, as these only raise the manual effort required for an adversary, rather than preventing access itself. The analysis suggests that the most critical finding is the high fidelity of decompilation resulting from Mono AOT usage in release builds, implying that simply shipping code once does not inherently secure it against determined reverse engineering.
The real pattern here is the fragility introduced by monolithic dependency management. When a single component handles disparate security mechanisms (Keychain vs. Keystore) through an abstraction, the failure mode becomes singular and catastrophic across all targets. The system assumes equivalence where none exists, forcing developers to recognize that shared logic mandates unified scrutiny rather than isolated platform audits. How does this pattern of imposed unification affect trust in cross-platform abstractions moving forward?

From the original · Bishop Fox Blog

TL;DR This analysis demonstrates how to bypass .NET MAUI's platform-specific packaging to extract readable C# assemblies from both Android and iOS. By leveraging our published mauidll tool for Android payload extraction, researchers can leverage a single extraction pipeline to identify critical vulnerabilities in shared logic.
Read the full story at bishopfox.com

Sentinel — Human

Confidence

This analysis reads as the product of an experienced security researcher detailing a specific exploit methodology within the .NET MAUI architecture, characterized by deep, practical knowledge rather than generalized reporting.

Signals Detected
low severity: Sentence length variance is erratic, mixing highly technical sentences with more discursive ones. Not perfectly metronomic.
low severity: Demonstrates strong, focused argument structure centered on a specific technical critique, exhibiting an established expert voice.
low severity: Uses specific tooling examples (ILSpy, Frida, string commands) and constructs a detailed attack pipeline, suggesting direct experiential knowledge rather than mere summarization of sources.
low severity: The specialized technical details regarding ELF structures, Mono AOT stubs, `libassembly-store.so`, and the specific workflow for extracting payload data appear highly specific and consistent with deep reverse engineering practice.
Human Indicators
The text contains idiosyncratic emphasis ('we ask the same follow-up question'), personal framing of risk assessment, and a distinct narrative flow that prioritizes method over mere recitation of facts.
The piece successfully bridges high-level architectural concerns (write once) with low-level execution details (AOT vs. JIT, ELF files), a complexity often found in deeply engaged technical writers.
Unified Code, Unified Risks: Uncovering Vulnerabilities in .NET MAUI Applications | Huntaegis