Custody receipt
- Receipt
- Loading the latest case…
Bayora walls off the attacking team, the defending team and the model, catches leaks with canaries that name the leaker, and seals every event in a log that witnesses co-sign. The run ends in a receipt anyone can check.
bayora verify results_final/demo/receipt.json results_final/demo/log.jsonl --trust results_final/demo/keys.jsonHashing the log in this browser…
A replay of a real Bayora run. Every frame below is that run's own data, not an illustration.
An AI lab must show regulators its model was red-teamed (EU AI Act, Art. 55), but attackers, defenders and the model share one machine. If the defenders glimpse the attacks, or one tenant reads another's prompt from a shared cache (NDSS 2025), the finding is void, and nobody outside could tell.
Before anything runs, each team publishes a fingerprint (a hash) of its attacks and its rules. Neither can change them later without breaking the match.
Each team gets its own container and network, and the broker is the only way through. When the red team tries to reach blue, the model directly or the internet, the kernel refuses before a packet leaves, and the attempt goes into the log.
Every secret is tagged with canaries: unique tokens only Bayora can mint. During the run Bayora leaks fake ones on purpose, in nine disguises, to measure what it catches. When one surfaces, the alert says whose secret it is and where it escaped. Pieces shorter than 10 characters still slip past, and the console lists them as residual risk.
Before the evaluation, Bayora attacks the real model itself: tenant B times its own prompts to guess which of 8 secrets tenant A's prompt holds. Bayora gives each tenant its own cache slot and a per-tenant salt, then checks that the attack stops working.
Every event is chained into a log that two witness processes co-sign. The run ends in a receipt anyone can check without trusting the operator. Try it: verify, then tamper with one event.
Read from the run behind this page. Bayora never claims zero leakage; what it cannot see is listed as residual risk in the console.
| Measure | Result | Round 1 | How it was measured |
|---|
Loading run…
Don't take our word for it. These commands check the run behind this page on your own machine.
Python 3.10 or newer, in a fresh virtual environment. Run the next steps in the same terminal. No Docker needed.
git clone https://github.com/bhaveshlakhmani25-ui/Bayora_HIH2026 && cd Bayora_HIH2026 && python3 -m venv .venv && . .venv/bin/activate && pip install -e .Checks the signatures, the witness quorum, every published checkpoint and the teams' reveal, without contacting us.
bayora verify results_final/demo/receipt.json results_final/demo/log.jsonl --trust results_final/demo/keys.json --checkpoints results_final/demo/checkpoints --reveal results_final/demo/reveal.jsonChange one event in your copy of the log, run step 2 again, and it fails and says why. The original is kept as log.jsonl.bak.
sed -i.bak 's/BLOCKED/CONNECTED/' results_final/demo/log.jsonlThe 180 planted leaks and 10,000 noise lines, in a few seconds on a laptop.
bayora drillSteps 2 and 3 use the demo run shipped in the repository. A full run of your own needs Docker on Linux, or Colima on a Mac: bayora run. See the README.
Each team runs in its own sealed container and network. The broker is the only way through. An eBPF policy in the kernel denies every other connection before a packet leaves, from before the first container starts, and logs the attempt.
Every secret is tagged with canaries: unique tokens only Bayora can mint. Bayora leaks fake ones on purpose through every monitored channel, in many disguises, and counts how many each scanner catches. A canary that turns up without being planted is raised as a possible real leak.
On a shared model server, tenant B times its own prompts to guess which of eight secrets tenant A's prompt contains. Bayora runs this attack against a real model before the evaluation. It passes only if the salted attacker does no better than guessing and the server reused no cache across tenants.
No cache audit in this run.
Every event is appended to a tamper-evident Merkle log: change one event and every later fingerprint changes. Checkpoints are signed by the operator and co-signed by witness processes, which refuse to sign two different histories. In this build both witnesses run on the operator's machine.
Verify the receipt, then tamper with any one event and verify again. The edit goes to a temporary copy; the real log never changes.
A clean scan is not proof of zero leakage. These limits are measured or stated, not hidden.