Skip to content

feat(engine): per-objective corroboration from agent behaviors (JEF-49)#24

Merged
thejefflarson merged 1 commit into
mainfrom
jef-49-per-objective-corroboration
Jun 21, 2026
Merged

feat(engine): per-objective corroboration from agent behaviors (JEF-49)#24
thejefflarson merged 1 commit into
mainfrom
jef-49-per-objective-corroboration

Conversation

@thejefflarson

Copy link
Copy Markdown
Owner

Summary

Fills the deferred arms in corroborates(behavior, attack) in engine/src/engine/reason/proof.rs so the agent's OWN runtime behaviors corroborate a threat chain (set corroborated=true), not only Falco Alert. Each behavior corroborates only the objective class whose ATT&CK tactic it evidences:

Behavior Objective class Technique
NetworkConnection { internet: true } EXFILTRATION (Tactic::Exfiltration) T1041
SecretRead { .. } CREDENTIAL_ACCESS (Tactic::CredentialAccess) T1552
LibraryLoaded { .. } FOOTHOLD / Initial Access (Tactic::InitialAccess) T1190
  • An in-cluster connection (internet: false) corroborates nothing — only egress is exfil evidence.
  • Alert still corroborates any objective (unchanged — no regression).
  • FileRead never reaches here (the RuntimeAdapter refines it to SecretRead or drops it).

Matching is keyed on attack.tactic rather than the precise technique, because the tactic is the stable objective-class key the recognizers tag with.

Shadow-gated (ADR-0014)

These arms only set corroborated=true. Actuation stays gated behind engine.enable (empty = shadow) — they are inert for action until the shadow bake clears and an operator sets enable. No default/enable config is touched in this PR.

Tests

  • network_internet_corroborates_exfiltration
  • secret_read_corroborates_credential_access
  • library_load_corroborates_foothold
  • behavior_does_not_corroborate_unrelated_objective (negative: wrong-tactic behaviors + in-cluster connection)
  • alert_still_corroborates_any_objective (regression guard)
  • secret_read_signal_corroborates_credential_chain_end_to_end (full prove path)

cargo build, cargo test -p protector (114 passed, 0 failed), and cargo clippy -p protector --all-targets -- -D warnings all green; cargo fmt applied.

🤖 Generated with Claude Code

https://claude.ai/code/session_01VtjoJttCvBY4dzCoE4f9vP

Fill the deferred arms in `corroborates(behavior, attack)` so the agent's
own runtime behaviors corroborate a threat chain, keyed on the objective's
ATT&CK tactic:

- NetworkConnection{internet:true} -> EXFILTRATION (T1041)
- SecretRead                       -> CREDENTIAL_ACCESS (T1552)
- LibraryLoaded                    -> FOOTHOLD / Initial Access (T1190)

The Falco Alert arm still corroborates any objective (unchanged). FileRead
never reaches here. Shadow-gated per ADR-0014: this only sets
corroborated=true; actuation stays gated behind engine.enable (empty =
shadow). No default/enable config changed.

Adds direct unit tests for each mapping, a negative case (wrong-tactic
behavior + in-cluster connection do not corroborate), an alert-still-broad
regression guard, and an end-to-end check through `prove`.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VtjoJttCvBY4dzCoE4f9vP
@thejefflarson thejefflarson merged commit 0227660 into main Jun 21, 2026
2 checks passed
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.

1 participant