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.
Boot ROM
Immutable code in the chipset verifies the bootloader against a key fused at the factory.
Bootloader
Verifies the vbmeta structure and the boot, system and vendor images it describes.
Boot state set
The bootloader records green, yellow, orange or red and passes it to the trusted environment.
Kernel and system
dm-verity checks system blocks as they are read, so later changes are caught at run time.
Key attestation
The keystore signs a certificate that includes the boot state and lock status.
The chain gives you four boot states. Their meaning is defined by Android, not by each manufacturer.
| Boot state | What happened | Lock status | What it tells you |
|---|---|---|---|
| Green | Verified with the manufacturer’s key | Locked | Stock software, as shipped and updated |
| Yellow | Verified with a user-set key | Locked | A different operating system, signed and relocked by its owner |
| Orange | Not verified | Unlocked | Any software may be running; integrity cannot be judged from boot |
| Red | Verification failed | Locked | Corrupted or tampered images; the device normally refuses to boot |
That state is different from the other two signals your app may already collect.
| Signal | Question it answers | Where to read it | What it cannot tell you |
|---|---|---|---|
| Root artefacts | Is privileged access present on this device right now? | The app, on the device | Whether the system image itself was modified at boot |
| Boot state | Did the device start from verified, locked software? | Key attestation, verified on your server | Whether root was added later through a verified exploit |
| Attested device trust | Is this a genuine device and app talking to my backend? | A platform attestation verdict, checked server-side | Which 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.
- 2013
Android 4.4
Verified boot arrives with dm-verity checking the system partition as blocks are read.
- 2016
Android 7.0
Verified boot is strictly enforced, and hardware-backed key attestation lets apps obtain signed proof of device state.
- 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
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 state | Root artefacts | Confidence | Suggested response on a sensitive flow |
|---|---|---|---|
| Green, hardware-backed | None | High trust | Allow |
| Yellow, hardware-backed | None | Legitimate but non-stock | Allow and observe |
| Orange | None | Integrity unknown | Warn, or ask for step-up on high-value actions |
| Orange | Present | Elevated risk | Restrict sensitive features |
| Orange | Present, with hooking detected | High risk | Terminate the sensitive session |
| Software-level attestation only | Any | Weak evidence | Rely 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.
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.