Adversarial benchmark

Tamper detection coverage on the signed audit chain

Reproducible corpus of chain tamper attacks against a fresh audit chain fixture. Every attack rewrites part of the local chain state after the fact. The offline verifier must detect the mutation. The pass rate below is what the offline verifier caught on the most recent run.

Attacks caught
14
of 14 total
Coverage
100.0%
tamper detection
Benchmark version
0.2.0
latest run
Generated
2026-08-03
UTC

Attacks and outcomes

Each row is a specific tamper scenario against the chain. The Verifier column shows what the shipped offline verifier reported after the mutation. A verifier that returned reject on a tamper attack scores as caught.

Attack id Category Description Verifier
silent-row-edit chain-integrity Silent row edit
An attacker who has direct database access edits the row_hash of a chain row after the fact. The intent is to alter the content commitment for that event without leaving a trace. The offline verifier should catch the resulting break in the prev_hash linkage on the next row.
caught
silent-row-deletion chain-integrity Silent row deletion
An attacker with direct database access deletes a chain row after the fact. Row count and chain linkage no longer agree with the closed epoch that used to bound the deleted row. The offline verifier detects this either through the prev_hash break at the next row or through the epoch boundary reference to a missing seq.
caught
row-insertion chain-integrity Row insertion (forgery)
An attacker inserts a fabricated row into the log. The attacker may set the row hash and prev_hash to plausible looking sha256 shapes but has no way to reproduce the hash of a legitimate predecessor row that already exists at the target seq. The offline verifier detects the resulting prev_hash break as it walks forward.
caught
prev-hash-tamper chain-integrity Prev hash tamper
An attacker modifies the prev_hash field of a middle row. The chain linkage now claims the row followed a different predecessor. The offline verifier catches the mismatch when the walk reaches that row.
caught
merkle-root-tamper epoch Merkle root tamper
An attacker rewrites the merkle_root of a closed epoch. Even the shape check fails because the field no longer carries a valid sha256 identifier. A cryptographic envelope re verification would also fail because the envelope was signed over the original root.
caught
signature-strip epoch Signature envelope strip
An attacker removes the signature envelope from a closed epoch. The signed head no longer commits to the epoch content. The offline verifier catches the missing envelope field.
caught
signature-forgery-ed25519-only epoch Signature forgery (Ed25519 only, no PQ)
An attacker with a broken classical primitive replaces the hybrid signature envelope with an envelope that carries only the Ed25519 signature. A verifier that requires both classical AND post quantum components rejects the envelope. This is the specific reason Etch ships hybrid signing rather than classical only.
caught
epoch-boundary-shift epoch Epoch boundary shift
An attacker adjusts an epoch's first_entry_seq or last_entry_seq so a range of rows falls outside the signed epoch. The rows are still on the log but appear to have never been sealed. The structural verifier catches the boundary reference to a non existent seq.
caught
epoch-entry-count-tamper epoch Epoch entry_count tamper
An attacker preserves the epoch boundary fields but changes the declared entry_count to a smaller number. The structural verifier catches the mismatch.
caught
etch-chain-row-tamper etch-chain-integrity Etch chain row tamper
An attacker with direct database access rewrites the row_hash of an Etch parallel chain row. The Etch chain carries the same prev_hash walk invariant as the OSS chain, so the offline verifier catches the mismatch on the next row.
caught
etch-row-deletion etch-chain-integrity Etch chain row deletion
An attacker deletes an Etch chain row after the fact. The prev_hash of the next row no longer matches the surviving predecessor's row_hash. The offline verifier catches the break on the walk.
caught
kind-swap-to-postmortem governance Kind swap: benign row flipped to postmortem
An attacker rewrites the kind field of a benign chain row to postmortem, fabricating a retroactive corrective action that was never attested. The row_hash was computed over the original kind so a downstream cryptographic re verify would catch the mutation, and the field level check catches the mismatch directly.
caught
cross-chain-index-phantom cross-chain-federation Cross chain projection phantom row
An attacker inserts a row into the cross chain reference projection index that claims an etch_chain_seq for which no chain row exists. The projection would report a phantom cross chain reference to any reader that trusts the projection without cross checking against the chain. The verifier detects the missing chain row and rejects the projection state.
caught
cross-chain-id-shape-forgery cross-chain-federation Cross chain target_chain_id shape forgery
An attacker mutates a cross chain reference row's target_chain_id to a value that does not match the sha256 shape emitted by compute_chain_id. The verifier rejects the row because no derived chain identifier could produce that string.
caught

What this benchmark is not

The corpus targets tamper detection on chain state that has already been written and signed. It does not test API input validation, runtime authorization, network or transport tamper, or throughput under load. Runtime authorization in particular is outside Etch's product scope. Etch is an evidence layer, not a runtime enforcement layer. See the AARM conformance statement for the enforcement boundary.

How to add an attack

Pull requests are welcome at the benchmark repository. The methodology document there sets out the rules. In short, the mutation must happen after the chain is validly signed, the verifier check must match what the shipped verifier does, and the description must be readable by a compliance officer.