Engineering

React Native app security

Otukan protects both halves of a React Native app: the JavaScript or Hermes bundle and the native modules and SDKs, including over-the-air updates.

  • React Native
  • Android
  • iOS
  • Business logic hardened

    Most of your business logic ships as a JavaScript or Hermes bundle. Otukan hardens it and checks its integrity when it loads.

  • Native modules guarded

    Anything JavaScript can call, a hooked process could call too. Otukan detects hooking of the JavaScript engine and your native modules at runtime.

  • Ready for live updates

    Over-the-air updates replace the bundle without a store release. Otukan protects updated bundles and tells legitimate updates from modified ones.

What Otukan adds to your React Native app

One protection profile for the JavaScript layer and the native layer, on Android and iOS.

  • Bundle protection

    Hardens minified JavaScript and Hermes bytecode, so the logic, names and strings in your bundle are far harder to read and reuse.

  • Integrity at load

    Checks the bundle, native code and signing certificate, and responds when a modified bundle or repackaged app starts.

  • Runtime self-protection

    Detects hooking of the JavaScript engine and native modules, debuggers, emulators and rooted or jailbroken devices.

  • App attestation

    Gives your backend evidence that requests come from your genuine app, not from a script replaying its calls.

How it works

  1. Share your app profile

    Tell us your React Native version, engine, architecture, key native modules and update process.

  2. Set your policy

    Choose the controls and the response for each sensitive flow, separately for Android and iOS.

  3. Protect store and live builds

    Protection fits your existing build and release pipeline, for store builds and over-the-air bundles alike.

  4. Sign and ship

    You sign store builds and update bundles with your own keys; Otukan never needs them.

  5. Act on signals

    Tampering and hooking signals reach your backend, so risky sessions are handled server-side.

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 both runtimes inside a React Native app: the JavaScript layer, shipped as minified JavaScript or Hermes bytecode, and the native layer of modules, SDKs and platform code on Android and iOS. It hardens the bundle where most of your business logic lives, checks its integrity when it loads, and detects hooking of the JavaScript engine and your native modules while the app runs. Otukan also works with your over-the-air update process, so legitimately updated bundles are protected and accepted while modified ones are flagged. Android and iOS builds are protected and validated separately, and your policy can respond differently on each.

Runtime coverage

JavaScript bundles and engines

Metro packages your JavaScript into a single bundle at build time. What ships depends on the engine, and Otukan protects both:

EngineWhat shipsHow Otukan protects it
Hermes (the default engine since React Native 0.70)Hermes bytecode, compiled at build timeHardens the bytecode bundle and checks its integrity at load
JavaScriptCoreMinified JavaScript, parsed on the deviceHardens the bundle’s names and strings and checks its integrity at load

On Android the bundle is normally index.android.bundle in the assets folder. On iOS it is normally main.jsbundle in the app bundle. Both are ordinary files inside the signed package, which is why Otukan protects the bundle itself, not only the native shell around it.

Native modules

Native modules are written in Kotlin or Java on Android, in Swift or Objective-C on iOS, or in C++ on both, and expose functions to JavaScript. With the new architecture, the default since React Native 0.76, JavaScript calls them directly through the JavaScript Interface (JSI) as Turbo Native Modules. With the old architecture, calls pass asynchronously over the bridge as serialised messages. Otukan covers both architectures.

ComponentHow Otukan handles it
JavaScript or Hermes bundleHardened, and integrity-checked when it loads
JavaScript engineHermes and JavaScriptCore, each validated on physical devices
ArchitectureOld and new architectures both covered
Your native modulesHooking of their functions detected at runtime
Native build outputDEX and native libraries on Android, frameworks on iOS, protected per platform

Dependencies

Bridge and interface behaviour

Every native module is an entry point. If an attacker modifies the bundle or hooks the JavaScript engine, they can try to call native functions with arguments your app would never send. Otukan detects the modified bundle and the hook, and applies your response before the sensitive flow continues. Sensitive operations, such as signing a payment request or reading a stored token, should still check their own inputs in native code, so each layer supports the other.

Third-party SDKs

npm packages often bring native code with them, linked by autolinking through Gradle and CocoaPods. Analytics, crash reporting, payments and identity SDKs run in the same process as your app, and some inspect or hook the app themselves. Otukan tunes its runtime checks so that these SDKs do not trip your policy. Share your SDK list up front, and the protected-build test plan covers each one on both platforms.

Expo apps follow the same path. Prebuild generates native Android and iOS projects, and Otukan protects those projects like any other React Native app.

Update lifecycle

Over-the-air updates

A hosted update service or a self-hosted update server can replace the JavaScript bundle and assets without a store release. Native code cannot change this way. Apple and Google both limit what an interpreted-code update may change, so check the current App Store Review Guidelines and Google Play policies for your use.

Otukan handles over-the-air updates in three ways:

  1. Update bundles go through the same protection step as the bundle in your store build.
  2. Integrity checks accept a legitimately updated bundle and flag a modified one.
  3. Otukan’s checks work alongside your update channel’s own bundle signing, which we recommend you enable, so the app rejects bundles you did not sign.

Testing

Otukan works with your team on a test plan covering the store build and at least one over-the-air update on physical Android and iOS devices:

  • a clean install, a store update and an over-the-air update from the previous release
  • sign-in and your most sensitive flow after each kind of update
  • the same journeys with your third-party SDKs active
  • start-up time and bundle size against the unprotected baseline

Measurement guidance is on mobile app protection performance. Platform detail is on Android app security and iOS app security. How protection fits a pipeline is covered on mobile app security integration.

Hybrid apps that run in a WebView are covered on Ionic and Cordova app security, from the web bundle to the native shell. For how React Native fits the wider protection model, return to mobile app security. If your app is already published, a free App Exposure Check reviews the public store release.

Common questions

  • Does Hermes protect our JavaScript?

    Hermes is a performance choice, not a protection layer. It compiles JavaScript to bytecode at build time so apps start faster and use less memory, and public tools can disassemble and decompile that bytecode. Otukan adds hardening, integrity checks and runtime detection on top of Hermes, so you keep its performance benefits and gain protection.

  • Where is the JavaScript in a React Native app?

    On Android the bundle is usually packaged as index.android.bundle in the app's assets. On iOS it is usually main.jsbundle inside the app bundle. Either can be minified JavaScript or Hermes bytecode, depending on the engine. Over-the-air update tools store newer bundles in the app's own storage, and Otukan checks the integrity of the bundle the app actually loads.

  • Should secrets live in the JavaScript bundle?

    No. Anything in the bundle, including API keys and feature flags, can be extracted by someone with a copy of the app. Keep secrets on your server, use short-lived tokens, and protect anything sensitive on the device with the Keychain on iOS, or with keys held in the Android Keystore on Android. Otukan's attestation then lets your server check that requests come from your genuine app.

Protect both layers of your React Native app

Tell us your React Native version, JavaScript engine, architecture, key native modules and whether you ship over-the-air updates. We never ask for binaries, signing keys or production credentials.

Or request a technical demo