Skip to content

feat: add E21 blind evaluation pool for amandeavor (fixes #368) - #401

Merged
LoopGlitch26 merged 1 commit into
Cygnux-Labs:mainfrom
amandeavor:fix/368-e21-blind-pool
Oct 25, 2026
Merged

LoopGlitch26 merged 1 commit into
Cygnux-Labs:mainfrom
amandeavor:fix/368-e21-blind-pool

Conversation

@amandeavor

Copy link
Copy Markdown
Contributor

What this adds

A new blind evaluation pool for E21 at eval/e21_blind/amandeavor.jsonl: 90 tool calls (45 labelled harmful and 45 labelled benign), one JSON object per line, matching the shape of eval/e21_heldout/corpus.jsonl.

The harmful calls cover the ground specified in #368:

  • CI/CD workflows and secrets: deleting CI secrets with gh secret delete, removing branch protection and PR review requirements via gh api, deleting security workflows, capturing Actions OIDC tokens, and dumping runner environment secrets.
  • Cloud IAM: creating backdoor admin users, access keys, and login profiles in AWS; assigning Project Owner and Organization Admin roles in GCP; creating backdoor Azure Service Principals with Contributor permissions; stopping and deleting CloudTrail trails and audit logging sinks.
  • Secrets stores and credentials: dumping Kubernetes secrets across namespaces, extracting database passwords from Kubernetes secrets, reading production secrets from Vault and AWS Secrets Manager, and extracting credentials from kubeconfig and .env.production.
  • Exfiltration and prompt injection: leaking secrets and credentials via curl, wget, netcat, and DNS exfiltration.
  • Evasion: calls using base64 decoding pipes, variable concatenation, eval, and inline scripts.

The benign calls provide matching routine operations: read-only GitHub CLI commands (gh secret list, gh workflow list, gh run view), read-only cloud IAM enumeration (aws iam list-users, gcloud iam service-accounts list, az role assignment list), read-only Kubernetes lookups (kubectl get secrets, kubectl auth can-i), Vault status queries, and routine git, terraform, and workflow commands.

Blind statement

I wrote this pool without reading the rules: I have not read tracekit/policy2/, tracekit/policy/, the policy packs, docs/policy-v2.md, the E3 or E17 corpora, eval/e21_blind/, or any rule ids. The only project material used was issue #368 itself and the field shape of eval/e21_heldout/corpus.jsonl as the schema reference.

Validation

All 90 rows parse as valid JSON objects carrying the heldout schema fields with matching types: 45 harmful rows with severity, techniques, and OWASP tags, and 45 benign rows.

Fixes #368

…#368)

Signed-off-by: Aman Awasthi <amandeavor@gmail.com>
Copilot AI balanced review requested due to automatic review settings October 25, 2026 08:21

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.

@LoopGlitch26

Copy link
Copy Markdown
Member

Scored as submitted, against main at 70aaa4c, before any rule change. This stays the pool's blind score; any rule written from it reports the score after.

Pack Harmful held or denied Benign held
server (server.yaml) 22 of 45 (49%), 17 denied 0 of 45
strict (strict.yaml) 25 of 45 (56%), 19 denied 2 of 45 (curl --dry-run, curl -I: strict holds every network command)

Both regex engines decide every call the same. By category on server: CI/CD changes 0 of 4, defense evasion 4 of 13, credential access 5 of 11, exfiltration 4 of 7, privilege escalation 6 of 7, persistence 3 of 3.

What the server pack misses, grouped:

  • GitHub repository security through gh (0 of 6): deleting Actions secrets, deleting branch protection or its review requirement, turning secret scanning off, and the same secret delete with its path base64-encoded.
  • CI workflow files (0 of 3): deleting workflows with rm or git rm (flagged, not held), and writing a workflow that sends secrets out.
  • Audit logging (0 of 2): CloudTrail stop-logging and delete-trail.
  • Secret reads outside the cloud CLIs (0 of 7): Kubernetes secrets dumped or decoded with kubectl, vault kv get, a root vault token create, reading .env.production (flagged), and CI environment variables written to a file.
  • Exfiltration and encoding (4 misses): a token read into a curl URL, DNS exfiltration with dig, and two inline Python calls (one base64-decoded); strict holds two of them.
  • kubectl delete clusterrolebinding is flagged on server and held on strict.

I'll open rule issues for the first four groups, as #359 to #361 came from the first pool. This PR adds only the pool file, so it can merge once CI passes. Thanks for writing it blind.

@LoopGlitch26

Copy link
Copy Markdown
Member

Rule issues from the misses: #402 (repository secrets and branch protection through gh), #403 (AWS audit logging), #404 (Kubernetes and Vault secret reads), #405 (CI workflow files). Any of them is yours if you want it.

@LoopGlitch26
LoopGlitch26 merged commit 79bdfa6 into Cygnux-Labs:main Oct 25, 2026
32 checks passed
@LoopGlitch26

Copy link
Copy Markdown
Member

Merged, thanks. The score above stays this pool's blind score.

LoopGlitch26 added a commit that referenced this pull request Nov 2, 2026
…rust; E21 scores the blind pools (#505)

* Go verifier: name checks as the Python verifier does, check its schema copies, ask a v2 bundle for -trust (#501)

- A failure names the reference verifier's check it fails (signatures, run chain,
  inclusion, chain intact, ...), and the warnings Go already computes carry
  Python's names (keys, trust root, run completeness, run boundaries, run tail
  witnessed). The v2 verifier stops at its first failure, so the parity gate
  requires its one failed check to be among Python's.
- KNOWN_GAPS keeps only the checks Go doesn't perform: the gate compares verdicts
  only there, and the README lists them and says why.
- TestEmbeddedSchemasAreTheRepositorys fails when an embedded event schema
  differs from tracekit/schema/.
- The CLI reads the format from the manifest: a v2 bundle without -trust is told
  it needs one, not that its v1 manifest is invalid.

* E21: score the blind pools as a blind set (#501)

eval/e21_blind/*.jsonl (#357, #401) are scored in e21_policy_robustness.py,
together and pool by pool, recorded in eval/results/ and reported in
docs/evaluation.md. The output says these aren't blind scores: rules written
after each pool was published came from its misses. The blind score at each
pool's publication is computed from git history (each merge commit's own
scorer and packs) and matches what the pull requests reported. The blind
false-positive rates join the no-regression gates; the recorded latency block
is kept as it was.

* Go verifier and E21: review fixes (#501)

- The parity gate exempts each verdict-only check only with the status Python
  gives it: Go's failures of head matches a witness checkpoint are compared.
- The text report prints a reason no failed check line gives, such as v1
  findings reached after a failed check.
- A v1 manifest whose file list is not an object fails bundle structure, as in
  Python.
- The Go README says which unsupported evidence is exit 2 and which fails keys
  (exit 1), and how an invalid signer.pub differs from Python.
- E21 scores each blind pool once; the latency text names the sets it times.

* Go verifier: a v1 manifest without a file list fails files match manifest; wrap an E21 docstring line (#501)

As in the Python verifier, a missing file list lists no file, so every file is
unlisted; only a list that is not an object (null included) is bundle
structure.
@kausthubhk kausthubhk mentioned this pull request Nov 2, 2026
9 of 10 tasks
LoopGlitch26 pushed a commit that referenced this pull request Nov 2, 2026
…#532)

TK-C010 held Google's and Azure's audit-log deletes but let AWS's through.
It now also holds aws cloudtrail stop-logging, delete-trail and
put-event-selectors; guardduty delete-detector and
disassociate-from-master-account (and its administrator-account successor);
configservice stop-configuration-recorder and delete-configuration-recorder;
securityhub disable-security-hub; and accessanalyzer delete-analyzer. The CLI
names the services configservice and accessanalyzer, so those spellings are
held, and so are the issue's config and access-analyzer. Describing, listing
and starting them stays allowed.

E17 gains 12 harmful and 9 benign cases (778 of 778 held, 1 false alarm in
843). On the second blind pool (#401) the default pack now stops 30 of 45, up
from 28 (the two CloudTrail calls), with no new false positive; the strict
pack 33, up from 31. E21's committed timing is kept.

Fixes #403

Signed-off-by: WhitePepperLambSoup <251834947+WhitePepperLambSoup@users.noreply.github.com>
LoopGlitch26 added a commit that referenced this pull request Nov 6, 2026
…052, TK-A053) (#582)

* Policy: reading a Kubernetes or Vault secret waits for a person

The second blind E21 pool read secrets through kubectl and Vault, and every
pack let them through. Two coding-pack rules, next to TK-A035, hold them in
the coding, dev, server and strict packs:

- TK-A052: kubectl's or oc's get of a secret with an output that prints it
  (any -o or --output but name and wide, custom-columns and kyaml too, or a
  --template), oc extract of a secret, view-secret (kubectl-view-secret too)
  and create token. The type is read in any case, with its API group, as
  TYPE/NAME, in a list (cm,secrets) or as a later TYPE/NAME, with the output
  before or after it. -n and --namespace take their value, so a namespace
  named secrets isn't a type, and a type ends at a space, / or , (a role
  named secret-reader isn't one).
- TK-A053: vault's (or OpenBao's bao) kv get, read, unwrap, print token,
  token create and a write to auth/token/create.

Listing secret names, describing one, kv list and metadata, token lookup and
status stay allowed. Both rules are anchored and bounded: 11 ms at worst on
64 KiB on the fallback engine. The TK-A035 limits row no longer lists vault
and kubectl as unheld (and names 1Password's op, not "1password"); a new row
names what TK-A052 and TK-A053 don't read.

E17 gains 22 harmful and 15 benign cases (800 of 800 held, 1 false alarm in
858). E21: the second blind pool (#401) is held 34 of 45 by default (was 30)
and 37 strict (was 33), the four calls of the issue; the held-out pool 254 of
420 (60.5%, was 252) and 285 strict (was 284); no new false positive in any
set. E21's committed machine and latency are kept.

The coding pack's version is 2026.10-v2-57, which other open pull requests
also take; it may need renumbering at merge.

Finishes #549 by shrinivas-sn: their rules' cases and look-alikes, with the
review's false-alarm fixes, other spellings, docs and evals.

Fixes #404

Co-authored-by: shrinivas-sn <shrinusn2001@gmail.com>
Signed-off-by: LoopGlitch26 <53336715+LoopGlitch26@users.noreply.github.com>

* Limits: TK-A052 doesn't read an output option far after the type, a type ninth in a list, or kubectl through an MCP tool

Co-authored-by: shrinivas-sn <shrinusn2001@gmail.com>
Signed-off-by: LoopGlitch26 <53336715+LoopGlitch26@users.noreply.github.com>

---------

Signed-off-by: LoopGlitch26 <53336715+LoopGlitch26@users.noreply.github.com>
Co-authored-by: shrinivas-sn <shrinusn2001@gmail.com>
@LoopGlitch26

Copy link
Copy Markdown
Member

Thanks again for contributing to Tracekit. A request: if you use a coding agent (Claude Code, Codex, Cursor, Gemini CLI or OpenCode), would you run Tracekit on it for a week and tell us how it went?

pip install -U tracekit-ai
tracekit audit --since 7d      # read-only: what it would have held in your last week (Claude Code history)
tracekit init --dev --v2       # then record and guard from now on

After a week, tracekit report --share prints counts only (no commands, paths or content). Post it in #385 with anything that got in your way: a false alarm, a confusing message, something slow. If you find a problem, you're welcome to fix it too: say so on #385 and it's yours.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

E21: a second blind pool (CI/CD and identity), written without reading the rules

3 participants