Device security

Android bootloader integrity explained

How to evaluate Android bootloader integrity: verified boot states, what an unlocked bootloader proves, where to read it and how to respond in proportion.

Android bootloader integrity is the question of whether a device started from software its manufacturer signed, with the bootloader locked. A mobile security team should evaluate it as one signal among three: root artefacts, modified boot state and attested device trust. Read it from a hardware-backed attestation that your server verifies, not from properties the device reports about itself, because a rooted device can rewrite those. An unlocked bootloader is evidence, not a verdict: developers unlock on purpose. This article covers Android only. It explains the boot chain, the signal boundary, manufacturer differences and how to turn the signal into proportionate app behaviour.

Signal boundary: root artefacts, boot state and device trust

Every Android device boots in a chain. Each stage checks the signature of the next before handing over control. Android calls this verified boot, and its current form, Android Verified Boot (AVB), records the result so the operating system and the keystore can report it later.

  1. Boot ROM

    Immutable code in the chipset verifies the bootloader against a key fused at the factory.

  2. Bootloader

    Verifies the vbmeta structure and the boot, system and vendor images it describes.

  3. Boot state set

    The bootloader records green, yellow, orange or red and passes it to the trusted environment.

  4. Kernel and system

    dm-verity checks system blocks as they are read, so later changes are caught at run time.

  5. Key attestation

    The keystore signs a certificate that includes the boot state and lock status.

The verified boot chain on a locked device. Each stage verifies the next; the result is recorded for key attestation.

The chain gives you four boot states. Their meaning is defined by Android, not by each manufacturer.

Boot stateWhat happenedLock statusWhat it tells you
GreenVerified with the manufacturer’s keyLockedStock software, as shipped and updated
YellowVerified with a user-set keyLockedA different operating system, signed and relocked by its owner
OrangeNot verifiedUnlockedAny software may be running; integrity cannot be judged from boot
RedVerification failedLockedCorrupted or tampered images; the device normally refuses to boot

That state is different from the other two signals your app may already collect.

SignalQuestion it answersWhere to read itWhat it cannot tell you
Root artefactsIs privileged access present on this device right now?The app, on the deviceWhether the system image itself was modified at boot
Boot stateDid the device start from verified, locked software?Key attestation, verified on your serverWhether root was added later through a verified exploit
Attested device trustIs this a genuine device and app talking to my backend?A platform attestation verdict, checked server-sideWhich specific tool or technique is in use

You can see the raw values on any device with developer tools. They are useful for testing and worthless as evidence, because root access can change them.

# Local properties: fine for a test bench, spoofable on a rooted device
adb shell getprop ro.boot.verifiedbootstate   # green | yellow | orange
adb shell getprop ro.boot.vbmeta.device_state # locked | unlocked
adb shell getprop ro.boot.flash.locked        # 1 = locked, 0 = unlocked

The trustworthy copy lives in the key attestation certificate. The Android keystore writes a RootOfTrust structure into it, signed by a key that never leaves the trusted environment.

RootOfTrust ::= SEQUENCE {
    verifiedBootKey    OCTET_STRING,
    deviceLocked       BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash   OCTET_STRING,
}
VerifiedBootState ::= ENUMERATED {
    Verified (0), SelfSigned (1), Unverified (2), Failed (3),
}

Compatibility: manufacturers, versions and development devices

Verified boot has evolved across Android releases, which is why older devices and newer ones report different levels of detail.

How verified boot reached its current form
  1. 2013

    Android 4.4

    Verified boot arrives with dm-verity checking the system partition as blocks are read.

  2. 2016

    Android 7.0

    Verified boot is strictly enforced, and hardware-backed key attestation lets apps obtain signed proof of device state.

  3. 2017

    Android 8.0

    Android Verified Boot 2.0 introduces the vbmeta structure and rollback protection against older, vulnerable images.

Beyond the platform version, manufacturers make choices that change what you will see in the field:

  • Unlock policy. Some devices allow unlocking from developer options, some require a token from the manufacturer, and some carrier or enterprise models never allow it.
  • Relocking. A few devices let owners relock the bootloader with their own key. That produces the yellow state, which is legitimate and should not be read as orange.
  • Attestation strength. Attestation certificates carry a security level: software, trusted environment or a dedicated secure element (StrongBox). A software-level attestation says little about boot integrity.
  • Unlock wipes data. Unlocking normally triggers a factory reset, so an unlocked device is rarely a user’s own device that was quietly tampered with overnight.

Legitimate unlocked or relocked devices

  • Your own developers and QA benches
  • Security researchers and penetration testers
  • Owners running an alternative Android build they relocked with their own key
  • Refurbished devices sold unlocked

Unlocked devices worth a closer look

  • An orange state combined with root artefacts or hooking
  • A sudden change from green to orange on an account with history
  • Many accounts sharing one unlocked device
  • Unlocked state during payee creation or a large transfer
The same boot state means different things in different contexts. Combine it with other signals before you act.

Build your test matrix before you write the policy. At minimum, cover one locked device per major manufacturer in your user base, one device relocked with a custom key, one unlocked device with stock software, one unlocked and rooted device with hiding tools active, and one older device whose attestation is software-level only. Record what each reports, locally and in the attestation, and keep the results dated.

Decision: connect signal confidence to proportionate behaviour

The strongest decisions use the attested value on your server and combine it with the other two signals. The table shows one way to structure a policy. The thresholds are yours to set per user flow.

Attested boot stateRoot artefactsConfidenceSuggested response on a sensitive flow
Green, hardware-backedNoneHigh trustAllow
Yellow, hardware-backedNoneLegitimate but non-stockAllow and observe
OrangeNoneIntegrity unknownWarn, or ask for step-up on high-value actions
OrangePresentElevated riskRestrict sensitive features
OrangePresent, with hooking detectedHigh riskTerminate the sensitive session
Software-level attestation onlyAnyWeak evidenceRely on root and runtime signals; avoid hard blocks on boot state alone

Otukan reads boot state, root artefacts and attested device trust as separate signals on Android, so your team sees which one fired rather than a single opaque score. The signals travel to your backend with login, payee creation and payment requests, where your risk engine combines them with account history. You set the response per flow: observe, warn, restrict or terminate. Development and test devices can be marked so their unlocked state does not interrupt your own teams. For the wider picture of Android signals, see Android root detection and Android app security.

Boot state tells you what the device started with. Root and runtime signals tell you what is happening now. You need both to decide well.

Otukan application security engineering

Before you set a boot-state policy

  • Confirm that boot state is read from a key attestation verified on your server, not from system properties.
  • Check the attestation security level and treat software-level results as weak evidence.
  • Test green, yellow and orange devices from the manufacturers your users own.
  • Allow-list your development and QA devices by identity, not by relaxing the rule.
  • Start in observe mode and measure how often each state appears before restricting anything.
  • Decide the response for each sensitive flow: login, payee creation and payment.

Common questions

  • Does an unlocked bootloader mean the device is rooted?

    No. Unlocking only allows unsigned or differently signed software to boot. Developers, testers and refurbished devices are often unlocked on purpose. Check each signal on its own and combine them in the risk decision.

  • Can a rooted device hide its bootloader state?

    It can change what it reports locally. Root access can rewrite the system properties a device reports. Read boot state from a key attestation certificate chain produced by the hardware-backed keystore and verified on your server, and treat a software-level attestation as weak evidence.

  • Is boot state the same on every Android manufacturer?

    The verified boot states are defined by Android, but manufacturers differ in whether they allow unlocking, whether they support relocking with a custom key and whether older models provide hardware-backed attestation at all. Test on the devices your users actually own before you set a policy.

Keep reading

Read boot state with confidence

Tell us your Android app framework, the flows you want to protect and whether you already use a hardware-backed attestation verdict. We do not ask for binaries, signing keys or production data.

Or request a technical demo