← trenyx.io / audits

verify-002 · agent authorization / Go

Seams, not holes — in an AI-agent security guard.

A pre-registered, hash-anchored verification pass on kontext-security/kontext, a Go policy guard that sits between AI agents (Claude Code, Codex) and the tools they call, evaluating Cedar policy before consequential actions run. 121 of 279 commits are Co-Authored-By: Claude. Free and unsolicited.

Pinned commit 59ec3b4 · hash anchored before reading · disclosed 2026-08-26

This is a careful codebase. I hashed the attack plan and posted the hash publicly before reading any implementation, ran the suite as shipped, then injected eleven planted defects.

result
baseline suite (as shipped)37 packages · 0 failures
planted defects caught by its tests7 / 11
confirmed items disclosed1 defect · 1 low · 1 design concern

Seven of eleven — a suite that genuinely tests its decision core (verify-001, by comparison, caught 5/11). The method found seams, not holes. The one that drew a maintainer response: the guard evaluates Cedar policy against the raw tool_input, with no canonicalization step before the match — so an exact-string forbid (say, on rm -rf /) can be slipped by whitespace or quoting variants. I demonstrated it against a synthetic exact-match policy to isolate the mechanism; the real-world exposure of any given deployment depends on how its own policies match (tool name + args vs. the raw command string). Alongside it: a CLI --mode remote outage path that fails open, a hardening gap an independent refuter downgraded to low, and a design concern.

All of it was disclosed — public issue kontext-security/kontext#477, with enforcement-relevant items via their private advisory channel per their SECURITY.md. The maintainers reproduced the raw-input behavior at the pinned commit and opened the fix for discussion (canonicalize before matching; treat an input that can't be normalized as unknown → deny). It is Trenyx's first maintainer confirmation of a reported finding — and you can read the exchange yourself on the issue.

Why "hash-anchored" matters here. The attack plan's SHA-256 was posted to a public timestamp before a line of kontext was read — so the findings provably weren't reverse-engineered from whatever the audit happened to turn up. The engagement repo hands you the hash and the command to check it.

Open the engagement repo →   Read the disclosure

The repo carries the hash-anchored attack plan, the baseline, the blind tests, and the full planted-defect matrix; the detailed findings publish there after the disclosure window. Denominators are ours and published — these numbers describe this attack, not a universal score.

This is what an engagement looks like

Want your codebase put through the same discipline?

Every engagement ships the pre-registration, the baseline, the planted-defect matrix, and the findings — disclosed to you first, privately, with the same receipts you see here.

How to work with me →