Engineering

MAUI app security

Otukan protects .NET MAUI release builds for Android and iOS: managed assemblies, native libraries and bindings, across the AOT and trimming modes you ship.

  • .NET MAUI
  • Android
  • iOS
  • Managed and native together

    A MAUI app ships C# assemblies, a .NET runtime and native libraries side by side. Otukan protects each layer you ship instead of treating the package as one opaque file.

  • Fits your build mode

    Profiled AOT, full AOT, Native AOT, the interpreter and every trimming level ship different artefacts. Otukan plans protection around the exact release settings you use.

  • Ready for each .NET upgrade

    Otukan revalidates protection against new .NET and MAUI workload versions on Android and iOS before you move your release branch.

What Otukan adds to a MAUI app

Controls chosen for how .NET code is packaged and executed on mobile targets.

  • Assembly hardening

    Renames and protects types, methods and string literals in your managed assemblies, so decompiling the release reveals far less of your business logic.

  • Runtime and library integrity

    Checks that your assemblies, the bundled .NET runtime and native libraries are the ones you released, and applies your response when they are not.

  • Managed and native hooking

    Detects instrumentation that attaches to the .NET runtime or to native code in the process while the app runs.

  • Embedded configuration secrets

    Protects API keys and endpoints compiled into assemblies or bundled as raw resources, which are otherwise readable in the package.

  • Device and debugger signals

    Detects debuggers, emulators, rooted Android devices and jailbroken iPhones, each with its own platform signals, and applies the response you set per flow.

  • Readable crash reports

    Ships a name mapping for managed stack traces and keeps iOS dSYMs and Android native symbols valid, so protected crashes stay diagnosable.

How it works

  1. Describe your targets

    Share your .NET version, target frameworks, release properties and binding packages. No source code or binaries are needed.

  2. Map the build matrix

    We confirm what each Android and iOS configuration ships and choose protection for every layer.

  3. Publish as usual

    dotnet publish stays in your pipeline; protection fits your existing build and release process.

  4. Sign with your identities

    Your Android upload key and Apple certificates stay with your team for every protected release.

  5. Revalidate on upgrade

    Each .NET or workload upgrade is tested against your protected builds before you ship it.

Free for app publishers

Check your app's exposure

A passive review of your published app by an Otukan engineer. No files, no access to your systems. Findings go by email to the verified publisher.

You finish the request on the next page.

Otukan protects .NET MAUI apps on their two mobile targets, Android and iOS, in Release configuration. It covers the layers a MAUI package actually contains: your managed assemblies, the .NET runtime that ships with them, native libraries and binding packages, and bundled resources. Because Android and iOS execute .NET code differently, Otukan plans protection per target and per build mode, whether you ship profiled AOT, full AOT, Native AOT or the interpreter, with any trimming level. Mac Catalyst and Windows targets are outside this page. Your exact .NET and workload versions are confirmed against Otukan’s build matrix before integration.

Build matrix

A MAUI project compiles once per target framework, and each target produces a different artefact. The protection plan starts from what really ships.

Runtime and target platform

On Android, a MAUI app runs on the Mono runtime. Release builds use profiled AOT by default: start-up paths are compiled to native code and the remaining intermediate language is compiled just in time on the device. That intermediate language travels inside the package, which is why an unprotected Android release decompiles to readable C#.

On iOS, Apple does not allow just-in-time compilation, so .NET code is compiled ahead of time into the app’s executable. With the Mono runtime, assembly metadata still ships in the bundle. With Native AOT, the app becomes a single native binary. An optional interpreter mode keeps some code as intermediate language on iOS as well.

Linking configuration

Trimming removes unused code from your assemblies and from the framework. It changes which types and members exist in the release, so Otukan protects the trimmed output, not your project as written.

SettingWhat it changesHow Otukan handles it
Profiled or full AOT (Android)How much managed code ships as native code versus intermediate languageHardens assemblies and native output, and checks both for integrity
Mono AOT or Native AOT (iOS)Whether assembly metadata ships beside the executableProtects metadata where it ships and hardens the native executable
InterpreterIntermediate language kept for runtime interpretationTreats interpreted assemblies as readable code and hardens them
Trimming levelWhich types and members remainProtects the trimmed release and preserves names your reflection needs

When you describe your project, these are the properties we ask about: TrimMode, RunAOTCompilation, PublishAot, UseInterpreter and AndroidPackageFormat, together with your target framework monikers.

Integration

Protected components

Otukan hardens your own assemblies, including the intermediate language that XAML compilation produces, and protects string literals such as endpoints and feature flags. Integrity checks cover those assemblies, the bundled runtime libraries and the native libraries in the package. Raw resources and configuration files you bundle are included, and secrets placed there are protected. While the app runs, Otukan detects debuggers, emulators and instrumentation attached to the .NET runtime or native code, plus rooted Android devices and jailbroken iPhones, each with its own platform signals.

SDK interaction

Most MAUI apps rely on binding libraries: .NET wrappers around Java or Kotlin libraries on Android, and around frameworks on iOS. Payment, identity and analytics SDKs often arrive this way through NuGet. Otukan protects the binding code you own and tunes runtime checks so that third-party SDKs which inspect the process do not trip your policy. For SDK-level protection in more depth, see mobile SDK protection.

Signing does not move. Your Android upload key and your Apple certificates and provisioning profiles stay with your team, and dotnet publish remains the step your pipeline runs. How protection joins a pipeline is covered on mobile app security integration.

Validation

Supported versions

.NET ships a new major version each November, and MAUI workloads move with it, alongside new Android API levels and Xcode releases. Each of those can change the runtime, the trimmer or the packaging. Otukan revalidates protection against each new combination on physical Android and iOS devices before you move your release branch.

Upgrade checks

For every .NET or workload upgrade, keep a short, repeatable check:

  • build a baseline and a protected release from the same commit, per target
  • run install, update, sign-in and your most sensitive flow on physical devices
  • force a crash in each protected build and confirm the report is readable, using the Otukan name mapping for managed frames and dSYMs or native symbols for native frames
  • compare start-up time and package size with the previous protected release

Measurement guidance is on mobile app protection performance. Platform detail is on Android app security and iOS app security.

For how MAUI fits Otukan’s wider protection model, return to mobile app security. To see what your current MAUI store release reveals, request a free App Exposure Check.

Common questions

  • Are MAUI apps easy to decompile?

    On Android, a MAUI release normally ships intermediate language inside the package, because the Mono runtime compiles much of it at runtime. Standard .NET decompilers turn that back into readable C#. On iOS, code is compiled ahead of time, but assembly metadata still reveals names. Otukan hardens the assemblies and their strings, so analysis becomes slower and costlier on both platforms.

  • Does trimming protect our code?

    Trimming removes code the app does not use, which shrinks the package and incidentally removes some attack surface. It does not rename what remains, hide strings or check integrity. Otukan works with your chosen trimming level, and your trimmer warnings still matter: code the trimmer cannot analyse needs the same care in a protected build.

  • Do we need to change how we write C#?

    No. Otukan protects the release output of your existing project, so your C#, XAML and project structure stay as they are. Code that relies on reflection over type or member names, such as some serialisers or dependency injection containers, is identified during planning so that its names are preserved. Debug builds stay unprotected for day-to-day work and fast iteration.

Harden your MAUI release on both platforms

Tell us your .NET version, your Android and iOS release settings (AOT, trimming, interpreter), the binding libraries you depend on and how you collect crashes. We never ask for binaries, signing keys or production credentials.

Or request a technical demo