Product wants the whole liveness check on-device for latency and offline use — what do you require stays server-side?
answer
- shipped means known, not hidden
- a client report is a claim
- ask what a bypass actually gets them
- hint versus credential
- the assurance budget moves, it does not vanish
basics
~20 sWhatever authorizes a consequential action. Ship the model if latency demands it, but the decision it feeds must be made server-side on evidence the client cannot mint, with the device result treated as a hint rather than a credential.
solid answer
~50 sI would agree the model can ship and refuse to ship the decision. The rule I would put in writing is that anything in the bundle is fully known to an adversary and anything the client reports is a claim, so the authorization has to be computed where we still control it, from a stored reference and an unforgeable binding to the device and app. That gives product most of what they want: the expensive computation stays local, so the latency and offline story survives for everything that is only a user-experience outcome — a prompt, a prefilter, a retry hint. What does not survive is a fully offline *authorization*, and that is the tradeoff to name explicitly rather than engineer around. I would also make the team update the risk register to the white-box figure, and budget the assurance work that used to live in endpoint controls into server-side checks instead.
go deeper
Know the simple rule: whatever ships in the app is public, and whatever the app says about itself cannot be trusted by the server.
Be able to sort a proposed design into what may ship and what must stay behind, and explain why an unforgeable binding is what makes the server half a real check.
Show you would test the design against a hostile client, insist on attestation before a client-produced value drives a consequential action, and re-quote the robustness figures under white-box access.
Own the tradeoff in front of the business: state what fully offline authorization would cost, decide by what a bypass actually gains an adversary, and fund the assurance work that moves from endpoint controls to server-side checks.
## The decision in front of you Product has a legitimate case. Round trips cost hundreds of milliseconds on a bad connection, the check should work in a lift or on a plane, and keeping camera frames on the device is genuinely better for the user. They are asking to move everything — capture, model, comparison, verdict — into the app. The security position is not "no". It is a line drawn in a specific place, and being able to draw it — and to say what it costs — is the whole of the judgment here. ## The rule worth writing down Two sentences, applied to every component on the diagram: 1. **Anything we ship is fully known to the adversary.** Not "hard to extract" — known. Obfuscation and unusual formats buy a one-time delay, and the file is copied freely afterwards. 2. **Anything the client reports is a claim, not evidence.** A verdict, a score, a representation: all are numbers chosen by whoever controls the device. Everything follows from those. The model may ship, because it is a function and not a secret you can keep once it runs on a user's hardware. The *authorization* may not, because it is exactly the thing an adversary would otherwise be free to assert. ## What that concretely allows and forbids **Allowed on-device:** the encoder and any expensive computation; a prefilter that decides whether to bother the server; user-experience outcomes such as "move into the frame", "try again in better light", or an instant optimistic screen that is confirmed later. **Kept server-side:** the stored reference the comparison is made against; the accept threshold; the step-up policy; and the entitlement decision, taken together with everything the model does not see — the account's history, the device, the amount at stake. **Required to make the server half real:** a binding the client cannot forge — hardware-backed attestation of the device and app build, plus a fresh server-issued challenge — so the server is checking something rather than believing a report. ## Naming the cost honestly The honest answer to "can it work fully offline" is *not for anything that moves money*. That is a product limitation, and pretending otherwise by adding client-side integrity tricks is the failure mode: each trick is defeated once and then never again, and the team ends up with a decision they believe is protected and cannot say by what. The compromise that usually holds: local for the experience, server for the authorization, with the local result carried up and re-checked rather than trusted. Offline degrades to a lower-consequence tier — view balances, queue an action, prepare a submission — rather than to full capability. ## The controls that quietly vanish, and who pays for that This choice retires an entire class of assurance the organisation may not realise it was relying on. The vocabulary of *pricing an adversary through your endpoint* — making them pay per call, capping them per identity, returning less, watching how their traffic looks — presupposes they must come through you. After the bundle ships, none of it applies to the model. The assurance work does not disappear; it moves, and someone has to fund it: server-side checks, attestation plumbing, a client-version retirement process, and a red-team engagement scoped white-box rather than black-box. The second cost is on paper. Every robustness figure this system carries has to be re-quoted under white-box access, and that number will be worse, sometimes much worse. A lead's job is to make sure the register says so before an incident does, because the alternative is discovering during a response that the documented threat model described a deployment you stopped having when the model started shipping. ## The counter-argument, taken seriously There is a case for shipping the whole thing: for a low-consequence decision, the offline and privacy benefits can outweigh an adversary's ability to defeat it, and adding a round trip to satisfy a threat nobody is funding is its own kind of waste. The test I would apply is *what does a bypass get them*. If the answer is a slightly better recommendation or a skipped prompt, ship it all and stop spending. If the answer is a payment, an account recovery, or access to somebody else's data, the decision stays with us and the latency is a cost of doing that business. ## The sentence to leave the meeting with The model can go in the bundle; the decision cannot. What ships becomes the adversary's, what the client says is a claim, and the only control we keep is the one we compute ourselves from something they cannot mint — so the question is never how well we hide the file, but which decisions we are willing to let a hostile client make.
- Product says a round trip breaks the experience. What do you offer instead of a flat refusal?Keep the expensive computation local so the interaction feels instant, and let the app show an optimistic result while the server confirms. Let offline degrade to a lower-consequence tier — inspect, prepare, queue — rather than to full capability. The round trip is then on the authorization only, which is a far smaller and rarer path than the whole check.
- When would you accept shipping the decision itself?When a bypass is cheap for us and for the user: a ranking hint, a prefilter, an accessibility prompt, a local convenience with no security consequence. The test is what an adversary gains by simply asserting the favourable answer. If that gain is nothing anyone would pay for, spending on server-side verification is waste, and I would say so as clearly as I refuse the payment case.
- What do you tell an executive who asks whether on-device is 'more secure'?That it improves one property and worsens another. User data stays on the phone, which is a real privacy gain. The model becomes public and every control that priced an adversary through our endpoint stops applying, which is a real integrity loss. Which one dominates depends on what the model's output is allowed to authorize, and that is the question to decide first.
saying these in an interview costs you the question
- Approves shipping the authorization along with the model
- Proposes client-side integrity checks as the answer to a hostile client
- Calls on-device deployment more secure without splitting the properties
- Leaves the risk register quoting a black-box figure after the decision
- Refuses the whole design instead of drawing a line and naming the cost