Mobile fraud has a trust problem that the web never fully shares: you often cannot tell whether the request hitting your API came from your real app, a modified build of it, a script replaying its traffic, or an emulator pretending to be a phone. On the web you at least expect a browser. On mobile, the client is a binary an attacker can decompile, patch, repackage, and run wherever they like. Apple App Attest exists to close that gap by letting your server verify that a request genuinely came from your unmodified app on authentic Apple hardware.
App Attest is part of the DeviceCheck framework and uses the device’s Secure Enclave to generate a hardware-backed key that never leaves the chip. Your app uses that key to produce cryptographic proof, and Apple’s servers vouch for its authenticity. For a fraud team, this is one of the few mobile signals rooted in hardware rather than in software an attacker fully controls, which makes it a valuable anchor in a mobile device fingerprinting strategy.
What App Attest actually proves
It is important to be precise about the claim, because App Attest is often over- and under-sold. What it establishes is narrow but strong.
- The request came from a build of your app signed with your team identifier, not a repackaged clone.
- That app is running on genuine Apple hardware, not a simulator or a non-Apple environment.
- The key backing the proof lives in the Secure Enclave and cannot be extracted or cloned to another device.
What it does not establish is equally important. It says nothing about which user is authenticated, it does not by itself detect every jailbreak, and it cannot prove the surrounding device is pristine. It answers one question well: is this my genuine app on real Apple silicon. Treat it as an app-and-hardware integrity signal, not an identity or a complete anti-tamper solution.
The attestation and assertion flow
App Attest works in two phases. The first, attestation, happens once per install to establish a trusted key. The second, assertion, happens repeatedly to prove each subsequent request came from that same trusted app instance.
The attestation phase runs like this:
- Your app calls
generateKey(), and the Secure Enclave creates a new key pair, returning a key identifier. - Your server issues a one-time challenge (a random nonce) to prevent replay.
- The app calls
attestKey()with that challenge, producing an attestation object signed by Apple’s App Attest CA. - Your server verifies the attestation certificate chain up to Apple’s root, checks that it matches your app ID and the challenge, and stores the public key against this install.
// Server-side attestation verification (pseudocode)
verify(attestation):
chain = parse_cbor(attestation).x5c
assert certificate_chain_valid(chain, APPLE_ROOT_CA)
assert rp_id_hash == sha256(TEAM_ID + "." + BUNDLE_ID)
assert nonce_in(attestation) == challenge_we_issued
store(key_id -> public_key, counter = 0)
After that, every meaningful request carries an assertion:
- Your server sends a fresh challenge with the request.
- The app calls
generateAssertion()over the request payload plus the challenge. - Your server verifies the signature with the stored public key and checks that the signature counter increased, which defeats replay.
The counter is the quietly important part. Because it must strictly increase, a captured assertion cannot be replayed, and a cloned key on a second device would produce counter collisions you can detect.
Where App Attest fits, and where it stops
App Attest is a powerful primitive, but it defends one flank. A realistic mobile fraud program surrounds it with signals that cover what it cannot.
| App Attest covers | App Attest does not cover |
|---|---|
| Genuine, unmodified app binary | Which user is behind the request |
| Real Apple hardware | Full jailbreak and runtime tampering |
| Replay resistance via counters | Behavioral or account-level fraud |
| Per-install hardware key | Android devices |
- Pair it with jailbreak detection. A jailbroken device can still run your genuine app and produce valid attestations, so you want independent tamper signals alongside it.
- Pair it with runtime-hooking detection. Tools like Frida, covered in Frida hooking detection, attack the app in memory without changing the binary that was attested.
- Use Play Integrity as the Android counterpart, since App Attest is Apple-only and your risk model needs both platforms.
- Feed the attestation result into a broader suspect score rather than treating it as a binary gate, so a failed attestation raises risk without single-handedly locking out a legitimate user hitting an edge case.
The mental model is that App Attest raises the floor. It makes cheap attacks (repackaged apps, emulator farms, naive replay) expensive, which pushes attackers toward harder methods that your other layers are positioned to catch.
Practical integration notes
A few realities shape how you deploy it in production.
- Rate limits apply. Apple throttles attestation, so attest once per install and rely on assertions for ongoing requests rather than re-attesting constantly.
- Handle key loss gracefully. App reinstalls, device restores, and OS edge cases can invalidate a key, so build a re-attestation path that does not lock out honest users.
- Always verify server-side. The entire security model collapses if you trust a client-reported result, the same principle as any server-side verification.
- Keep challenges single-use and short-lived to preserve replay resistance.
Frequently asked questions
What does App Attest actually prove?
It proves that a request originated from a genuine, unmodified build of your app running on real Apple hardware, backed by a hardware key the Secure Enclave protects. It does not prove which user is behind the request or that the device is free of all tampering.
Is App Attest the same as DeviceCheck?
No. DeviceCheck gives you two bits of per-device state and a device identity, while App Attest cryptographically attests app and hardware integrity. They are complementary, and Apple exposes both through the DeviceCheck framework.
Can App Attest be bypassed on a jailbroken device?
The attestation itself is anchored in the Secure Enclave and is very hard to forge, but a jailbroken device can attack the surrounding app logic. That is why App Attest should be one layer alongside jailbreak and behavioral detection, not the sole control.
App Attest gives mobile teams something the web has always had to approximate: a hardware-rooted answer to whether a request came from the real app on a real device. It will not identify your users or catch every tampered runtime, but it makes whole categories of cheap mobile fraud uneconomical, and it anchors a layered defense that jailbreak, hooking, and behavioral signals complete. See how the pieces combine across platforms in our emulator detection guide, and browse the mobile SDKs to add hardware attestation to your app.
Run it yourself
Prynt is open-source, self-hostable device intelligence — visitor IDs, bot & fraud Smart Signals, and behavioral biometrics you own end to end.