Keybox Repository

Why keyboxes get revoked, and how to check yours

By evoker6 min read

If you have used a keybox for more than a few weeks you have seen the pattern: STRONG on Monday, DEVICE on Thursday, nothing changed on your side. The key was revoked. This article explains what that means mechanically, why it happens so quickly for public keys, and how to check any keybox in under a minute.

What "revoked" means

Google publishes a machine-readable list of attestation certificates it no longer trusts at android.googleapis.com/attestation/status. It is plain JSON: an entries object keyed by certificate serial number, each with a status (REVOKED or SUSPENDED) and a reason such as KEY_COMPROMISE, CA_COMPROMISE, SUPERSEDED or SOFTWARE_FLAW.

{
  "entries": {
    "6681152659205225093": { "status": "REVOKED", "reason": "KEY_COMPROMISE" },
    "8350192447815228107": { "status": "REVOKED", "reason": "SOFTWARE_FLAW" }
  }
}

Any verifier that follows Google's guidance, and Play Integrity certainly does, downloads this list and rejects a chain if any certificate in it appears there. The chain still verifies cryptographically; the signatures are fine and the dates are fine. Trust was simply withdrawn. For a rooted device this shows up as the verdict dropping from STRONG to DEVICE or BASIC, depending on what else the setup spoofs.

Revocation is per certificate, not per file. A keybox usually contains an ECDSA chain and an RSA chain; if the intermediate they share is revoked, both are gone at once. If only a leaf is listed, a different keybox from the same batch may survive a bit longer.

Why leaked keyboxes die so fast

A factory attestation key is meant to live inside one device, or at worst one production batch. The moment it is posted to a Telegram channel that assumption collapses, and several things start working against it:

The practical result is a lifetime measured in days to a few weeks for anything public, which is why the repository keeps an archive: you can see how long previous keys lasted, and you always have the newest one at the top.

How to check a keybox

On the device: Key Attestation

Install vvb2060's Key Attestation, add its package name (io.github.vvb2060.keyattestation) to TrickyStore's target.txt, and open it. The app requests an attested key, shows the chain, and reports whether the certificates are trusted and whether any are on the status list. A revoked keybox shows a clear "revoked" line. This is the most direct test because it inspects exactly what Play Integrity would see.

On the device: Play Integrity checker

Apps such as Play Integrity API Checker call the real Play Integrity API. If a keybox you believe is valid only yields MEETS_DEVICE_INTEGRITY, the keybox is revoked or was never read; see the troubleshooting section of the setup guide. Do not run this every hour; see the next section.

Anywhere: compare serial numbers

Every certificate in the XML has a serial number. Extract them and look them up in Google's list. On a computer:

# serials of every cert in keybox.xml
grep -A200 "BEGIN CERTIFICATE" keybox.xml | \
  awk '/BEGIN CERTIFICATE/{c=""} {c=c"\n"$0} /END CERTIFICATE/{print c | "openssl x509 -noout -serial"}'

# is any of them revoked?
curl -s https://android.googleapis.com/attestation/status | grep -i "<serial>"

The repository page does exactly this in the browser for every archived keybox, on every page load, so the "Revoked" label there is never more than one refresh old.

Revoked is not expired

Two different things get called "invalid":

TermMeaningWhere it comes from
ExpiredThe certificate's notAfter date has passed. Rare for keyboxes; attestation chains are typically valid for decades.Inside the certificate
RevokedGoogle withdrew trust. Dates and signatures are irrelevant.The online status list

A keybox showing "valid until 2045" in a certificate viewer tells you nothing about whether it works today. Only the status list does.

Making a keybox last longer

You cannot prevent revocation of a key that is already public, but you can avoid accelerating it, and you can avoid being the reason a private key becomes public:

When yours is revoked

Download the newest keybox marked Strong from the repository, replace /data/adb/tricky_store/keybox.xml, and you are done; TrickyStore picks up the new file without a reboot. If you would rather not do this by hand each time, the AlwaysStrong module fetches the current keybox from this repository with one tap of its action button.

Sources and further reading

  1. Google, Attestation certificate status list (JSON)
  2. Android Developers, Key attestation, section on checking certificate revocation status
  3. Android Developers, Play Integrity API verdicts
  4. vvb2060, Key Attestation
  5. XDA, Tricky Store – Bootloader & Keybox Spoofing discussion thread