Fraud & Threat Model
This page lists the threats AdPriva is built for, what it does about each one today, and where that protection stops.
What AdPriva does today
- Replay protection. Every view event carries a one-time nonce. The server refuses a nonce it has already seen, and the database refuses a second proof with the same signature.
- Sealing. The server signs each event with an HMAC. The signature is the proof id.
- Scoring. The ingest server scores every view proof from its user agent (L0) and the class of its IP address (L1). That score and verdict are public. AdPriva’s scoring service also checks behaviour (L2) and signed agent identity (L3), and keeps that result privately. See Proofs of Engagement.
- Anchoring. Batches of proofs are anchored on Horizen, so batch membership can be checked by anyone.
- Shadow mode. No event is blocked, dropped or left out of a batch because of its verdict. Verdicts describe traffic; they do not filter it yet.
Threats and responses
| Threat | What AdPriva does | Limit |
|---|---|---|
| Bots that announce themselves in their user agent (headless browsers, automation tools, scripts, crawlers) | L0 lowers the score. A headless or automation user agent lands in abusive_bot | A bot can send an ordinary browser user agent |
| Traffic from datacenter and cloud IP ranges | L1 lowers the score. On its own, this gives uncertain | VPNs and company networks can also look like datacenters. Residential proxies look clean |
| Headless browsers or scripts that hide their user agent | L2 checks the interaction pattern and the tag’s automation hints, such as navigator.webdriver | L2’s result is private and does not change the public verdict yet. The signals come from the browser, so a careful script can fake them |
| Crawlers and AI agents that sign their requests | L3 checks the Web Bot Auth signature. A valid one gives authorized_agent; a forged or expired one gives abusive_bot | Only covers agents that sign. The result is private, like L2’s |
| Replaying a captured event | Nonce check and unique signature | None known |
| Sending made-up events without the tag | Every event is scored like any other | The tag holds no secret, so the server cannot prove an event came from the real tag. Anyone can send an event that names any site. In shadow mode such events are recorded with their verdict, not blocked |
| Changing a record after the fact | The HMAC seal covers the event type, site, nonce and timestamp. The anchored root fixes which proofs are in each batch | The seal and the root do not cover a view proof’s score or verdict |
What the verdicts are for
The verdicts let a publisher, a buyer or an auditor see how much of the traffic looks automated, event by event. Automated traffic still gets a proof, marked abusive_bot, so the record shows what was flagged instead of hiding it.
Moving from shadow mode to enforcement, where flagged proofs would be left out of batches, is a separate decision. It is not enabled today.
{% @mermaid/diagram content="flowchart LR
A\[View event]
B\[Nonce check]
C\[HMAC seal: proof id]
D\[L0 and L1: public score and verdict]
E\[Scoring service: L2 and L3, private]
F\[Batch and anchor on Horizen]
G\[Explorer: public lookup]
A --> B
B --> C
C --> D
C --> E
D --> F
F --> G" %}