Skip to content

Commit 68688bc

Browse files
authored
Merge pull request #373 from Cisco-Talos/dev
feat: release EvidenceForge 1.14.0
2 parents c0c6199 + 4d52119 commit 68688bc

91 files changed

Lines changed: 4774 additions & 339 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,34 @@ Detailed development history for the EvidenceForge project. Transferred from TOD
66

77
## Unreleased
88

9+
## v1.14.0 (2026-08-04)
10+
11+
This minor release adds canonical multi-alert IDS attachments and exact
12+
cross-source evaluation integrity, then hardens the generator against realism
13+
findings discovered through repeated blind assessment.
14+
15+
**Correlated IDS evidence**
16+
17+
- Added typed, transport-owned IDS alert attachments with multi-SID support,
18+
sensor-local routing, filtering policy, validation, configuration overlays,
19+
documentation, and source-native Snort rendering (`2be53773`, `96f5afe1`).
20+
- Added exact IDS integrity evaluation across ground truth, transport evidence,
21+
visibility, sensors, and rendered alerts, including acceptance gates and
22+
regression coverage for correlation failures (`e023286b`).
23+
24+
**Cross-source and source-native realism**
25+
26+
- Corrected eCAR session timing and module principal ownership, machine-account
27+
application transport semantics, versioned Sysmon manifests, and
28+
deterministic leaf-certificate issuance (`3dfbd680`).
29+
- Replaced exact sudo ceilings and public-client User-Agent monoculture with
30+
host/source-sticky distributions, and added sensor-local timing and bounded
31+
capture-accounting texture for distributed network observations
32+
(`3dfbd680`).
33+
- Prevented impossible baseline signatures and payload-content alerts on opaque
34+
TLS while retaining metadata-visible TLS detections and cleartext payload
35+
coverage (`3dfbd680`).
36+
937
## v1.13.1 (2026-07-30)
1038

1139
This patch release hardens agent-facing security boundaries and CI dependency

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Most synthetic log generators produce isolated, single-format data that experien
2525

2626
- **Deterministic engine, LLM-assisted authoring.** Scenario creation uses Claude Code Skills for interactive, research-backed attack planning. Log generation is fully deterministic — no LLM calls, no API costs, reproducible output every time.
2727

28-
- **Built-in quality evaluation.** A 4-pillar scoring framework (20 sub-scores) measures parseability, plausibility, causality, and timing. Know exactly how good your data is before using it.
28+
- **Built-in quality evaluation.** A 4-pillar scoring framework (21 sub-scores) measures parseability, plausibility, causality, and timing. Know exactly how good your data is before using it.
2929

3030
## Quick Start
3131

@@ -82,7 +82,7 @@ For scripted or non-interactive use:
8282
|---------|-------------|
8383
| `eforge generate <scenario.yaml> -o <dir>` | Generate logs from a scenario file |
8484
| `eforge validate <scenario.yaml>` | Validate scenario schema and cross-references |
85-
| `eforge eval <output_dir> -s <scenario.yaml>` | Evaluate data quality (4 pillars, 20 sub-scores) |
85+
| `eforge eval <output_dir> -s <scenario.yaml>` | Evaluate data quality (4 pillars, 21 sub-scores) |
8686
| `eforge info [field]` | Show installation info, config paths, and data inventories. Pass a dot-path field for a specific value (e.g., `eforge info personas`). Use `--fields` to list available fields, `--json` for machine output. |
8787
| `eforge validate-config` | Validate config files for cross-reference integrity. Use `--json` for machine output. |
8888
| `eforge install-skills [--agent all\|claude\|chatgpt\|codex] [--global]` | Install project-local or user-wide agent skills; defaults to all agents (`codex` aliases `chatgpt`) |
@@ -128,7 +128,7 @@ Every generated scenario includes a `GROUND_TRUTH.md` file. Attack scenarios doc
128128
- **Ground truth documentation** — Every run generates a GROUND_TRUTH.md; attack scenarios include narrative, timeline, and IOCs
129129
- **Parallel generation** — Threaded emitters write all formats simultaneously with temporal consistency
130130
- **Scenario validation** — Cross-reference checking, uniqueness constraints, and network topology validation
131-
- **Data quality evaluation** — 4-pillar scoring framework (20 sub-scores) with acceptance criteria
131+
- **Data quality evaluation** — 4-pillar scoring framework (21 sub-scores) with acceptance criteria
132132
- **Multi-timezone support** — Pattern-based timezone overrides per system hostname
133133

134134
## Supported Log Formats

TODO.md

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# EvidenceForge Implementation Plan
22

3-
**Status:** Phase 8.5 (Dual src/dst HostContext) COMPLETE; Pre-MVP quality fixes ongoing
3+
**Status:** Phase 8.5 (Dual src/dst HostContext) COMPLETE; post-1.0 quality improvements ongoing
44
**Started:** 2026-03-11
55
**Last Roadmap Review:** 2026-05-26
66

@@ -21,11 +21,12 @@ ground truth documentation.
2121
**Phase 2: Scalability.** Parallel threaded emitters, 7 log formats, persona
2222
temporal distribution, network visibility modeling, and multi-OS support.
2323

24-
**Phase 3: MVP Release.** Skill-based scenario/generate/validate/evaluate
24+
**Phase 3: Initial Product Release.** Skill-based scenario/generate/validate/evaluate
2525
workflow, prebuilt personas, skill installation, and scenario reference docs.
2626

2727
**Phase 4: Data Quality Evaluation.** `eforge eval` with deterministic scoring,
28-
source parsers, and acceptance criteria.
28+
source-instance-aware parsers, inferred narrative pivots, acceptance criteria,
29+
and exact correlated-IDS integrity gating.
2930

3031
**Phase 5: Data Realism Improvements.** Major generator-level realism fixes for
3132
identity, protocol, process, temporal, and baseline noise patterns.
@@ -40,7 +41,7 @@ assessment history belongs in worklogs and changelog entries, not this roadmap.
4041

4142
---
4243

43-
## Pre-MVP Quality Roadmap
44+
## Quality Roadmap
4445

4546
Current goal: fix analyst-rejection issues and finish remaining quality work
4647
without turning `TODO.md` back into a high-conflict work journal.
@@ -212,15 +213,24 @@ further per-loop or per-PR details in worklogs or PR descriptions.
212213

213214
---
214215

215-
## Post-MVP Enhancements
216+
## Future Enhancements
216217

217218
### Short-Term
218219

219220
- [ ] Configurable work-week schedules and per-persona day-of-week overrides.
220221
- [ ] Storyline cadence field: `human`, `automated`, or periodic interval with
221222
jitter.
222223
- [ ] Cloud/SaaS log formats: Azure AD, AWS CloudTrail, GCP audit logs, and M365.
223-
- [ ] `snort_alert` typed event spec for IDS signature declarations.
224+
- [x] Correlated multi-SID IDS attachments on typed transport-owning events,
225+
including connections, beacons, remote sessions, DHCP, scans, and DNS activity,
226+
with sensor-local Snort-style alert filtering and reporting.
227+
- [ ] Extend correlated IDS attachments to typed `email_message` and `email_read`
228+
events so asserted SIDs follow the real mail transports produced by modeled
229+
routing and sensor placement. IDS sensors do not currently decrypt traffic;
230+
before implementation, decide whether STARTTLS and implicit TLS suppress every
231+
candidate or permit signatures classified as detectable from flow,
232+
pre-encryption, or TLS metadata. Plaintext mail is eligible only when a
233+
storyline or background path explicitly asserts a signature.
224234
- [ ] HTTP proxy server support for Squid, Blue Coat, and Zscaler.
225235
- [ ] Checkpointing and resume for long-running generation.
226236
- [ ] Additional skills: create-persona, create-log-format, create-network, and

commands/eforge/config.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ Also read the relevant reference doc for field schemas and conventions:
109109
| Evaluation rules | `references/config-evaluation.md` (read-only reference — not user-customizable) |
110110
| Cross-file dependencies | `references/config-dependency-graph.md` |
111111
| Validation checks | `references/config-validation.md` |
112+
| IDS signatures and alert policy | `references/config-ids.md` |
112113

113114
## Step 4: Interview for Completeness
114115

@@ -126,6 +127,13 @@ duplicate names. Keep profile contents synthetic and behavior-shaped: URI shapes
126127
method/status/byte ranges, User-Agent pools, and deterministic tokens are fine;
127128
do not encode live malware IOC paths, domains, or exact campaign payloads.
128129

130+
**Changing IDS cadence:** Edit the project overlay at
131+
`.eforge/config/activity/ids_signatures.yaml`; entries merge by `sid`. Add or
132+
replace `alert_policy` with `detection_filter`, `event_filter`, or both, or set it
133+
to `every`. Do not copy the whole packaged signature unless its metadata also
134+
needs to change. Read `references/config-ids.md`, run `eforge validate-config`,
135+
and start a fresh CLI process after the edit so cached signature data is reloaded.
136+
129137
**Adding an application:** Which OS(es)? Categories? Which personas? Image path? PE metadata? Command templates? Parent process? Children? Network traffic?
130138

131139
**Creating a persona:** Role description? Typical activities? Work hours (format: "9am-5pm (lunch 12pm-1pm)")? Risk profile (low/medium/high)? Browsing intensity (light/normal/heavy)? Applications? Custom traffic? Linux user?

commands/eforge/evaluate.md

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ description: >
1111

1212
# EvidenceForge Data Quality Evaluator
1313

14-
You are helping the user evaluate the quality of generated synthetic security log datasets using EvidenceForge's evaluation framework. The eval command scores datasets across **4 pillars** with 20 sub-scores, all deterministic and statistical. Your job is to run the eval, interpret the results, review sample records for realism, and provide actionable improvement suggestions.
14+
You are helping the user evaluate the quality of generated synthetic security log datasets using EvidenceForge's evaluation framework. The eval command scores datasets across **4 pillars** with 21 sub-scores, all deterministic and statistical. Your job is to run the eval, interpret the results, review sample records for realism, and provide actionable improvement suggestions.
1515

1616
## Quick Start
1717

@@ -25,6 +25,19 @@ Default to `eforge` for all CLI execution. If `eforge` is not found and you are
2525
in an EvidenceForge source checkout, retry the same command with
2626
`uv run eforge ...`.
2727

28+
Canonical IDS reconciliation is automated by the zero-weight
29+
`plausibility.ids_integrity` hard gate. It compares every per-sensor `(gid, sid)`
30+
count and ordered normalized digest in `GROUND_TRUTH.json` with parsed Snort
31+
rows, including the sensor-visible UTC timestamp, signature metadata, complete
32+
tuple, ephemeral source port, and NAT/PAT projection. It also reconciles policy
33+
filtering and observation totals and requires every emitted row to have an
34+
authorized authored, built-in, or raw origin. Legacy datasets without
35+
`ids_evaluation` skip this check with a warning, but a scenario containing
36+
authored `ids_alerts` fails when the summary is missing or invalid.
37+
For DHCP, count only the authored transaction, not later automatic renewals; for
38+
DNS tunnel activity, exclude generated background cover queries. For web scans,
39+
account for automatic and authored SIDs and the authored-wins duplicate rule.
40+
2841
If they don't have generated output yet, suggest using `/eforge generate` first.
2942

3043
For detailed field documentation and known limitations of each log format, use the `/eforge:references:evidence-formats` skill.
@@ -133,12 +146,13 @@ For each pillar, explain what the score means in practical terms:
133146
- Cross-Source Field Agreement: When the same event appears in multiple log sources, do shared fields agree? Uses pivot-key joins defined in `cross_source_pairs.yaml` plus built-in email checks — pairs include Windows 4688 ↔ eCAR PROCESS/CREATE (same PID+host → same process name), zeek_conn ↔ Cisco ASA (same 4-tuple), web_access/proxy ↔ zeek_http (same client+URI+10s bucket → same status/method), zeek_ssl ↔ zeek_x509 (cert chain fuids → server_name ∈ SAN), and email checks where SMTP UIDs join to conn.log, visible SMTP FUIDs join to files.log, and plaintext SMTP subject metadata agrees with `ARTIFACTS_MANIFEST.json` email records. A score below 100 means real field disagreements were found.
134147
- User Behavioral Diversity: Do different users behave differently, or are they cookie-cutter clones?
135148
- Benign Anomaly Rate: Is there a realistic 1–5% rate of anomalous-but-benign events? Zero anomalies is as implausible as 50%.
149+
- IDS Correlation Integrity: Do sensor-local Snort rows exactly match canonical counts, ordered digests, origins, and observation totals? This is a 100% hard gate with zero scoring weight.
136150

137151
**Pillar 3: Causality (weight 0.25)**
138152
- Causal Ordering: Are logon→process→logoff and lock→reauth→unlock sequences correctly ordered? DNS before TCP? Kerberos/DC TGT/TGS before domain logons? NTLM/DC validation and Windows audit/process-access companions after their owning evidence?
139153
- Storyline Event Presence: Are all expected-visible storyline events visible in at least one log source? For non-`complete` observation profiles with a manifest, source rows marked `dropped`, `filtered`, or `out_of_window` are excluded from this coverage denominator.
140154
- Indicator Accuracy: Do traces carry the correct IPs, usernames, hostnames from the scenario?
141-
- Pivot Linkability: Can a hunter pivot between consecutive expected-visible attack steps using shared field values?
155+
- Pivot Linkability: Can a hunter pivot along inferred narrative edges built from shared typed indicators such as hosts, IPs, accounts, domains, URLs, files/hashes, and artifact/message IDs? Unrelated interleaved steps are not connected, generic ports/protocols are excluded, and isolated events are reported separately.
142156
- Storyline Temporal Integrity: Are expected-visible attack events in the right relative order at the right times?
143157
- Storyline Trace Coverage: For each expected-visible log format group on each involved host, does the storyline leave a trace?
144158

commands/eforge/generate.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,27 @@ Default to `eforge` for all CLI execution. If `eforge` is not found and you are
2525
in an EvidenceForge source checkout, retry the same command with
2626
`uv run eforge ...`.
2727

28+
When a scenario uses canonical `ids_alerts`, do not infer missing Snort rows from
29+
the authored attachment count alone. Check `GROUND_TRUTH.json`/`.md` for each
30+
SID's effective policy and candidate/emitted/policy-filtered sensor totals, then
31+
check `OBSERVATION_MANIFEST.json` for collection drops, clipping, and policy
32+
`filtered` status. No IDS sensor, an invisible proxy leg, a denied/cache-hit
33+
origin request, observation missingness, or policy cadence can all legitimately
34+
reduce output. Candidate spooling is disk-backed and removed on success or
35+
failure; a leftover EvidenceForge IDS spool indicates an interrupted process and
36+
may be removed once no generation process is using it.
37+
`GROUND_TRUTH.json` also includes the bounded `ids_evaluation` acceptance
38+
contract: per-sensor/SID counts, origin totals, observation totals, and an
39+
ordered normalized alert digest. `GROUND_TRUTH.md` renders the same information
40+
in its IDS Evaluation Summary. Generation accumulates this summary while Snort
41+
candidates finalize and does not retain alert-volume-sized state.
42+
43+
Interpret candidates by owned transport: SSH/RDP use only their session
44+
connection; DHCP uses only the authored transaction and does not pass assertions
45+
to automatic renewals; scans and DNS families fan out across authored
46+
probes/requests/queries. DNS-tunnel cover traffic is not attached. IDS sensors
47+
do not decrypt traffic, and email attachments remain unsupported.
48+
2849
If they don't have a scenario file yet, suggest using `/eforge scenario` to create one first.
2950

3051
## Command Reference

commands/eforge/references/config-evaluation.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ correctness gates such as parseability, value plausibility, field agreement, and
3030
ordering remain strict. Adjusted sub-scores expose `raw_score` in JSON and show `raw:<score>` in
3131
the text report.
3232

33+
`plausibility.ids_integrity` is a special zero-weight 100% hard gate. It validates
34+
the bounded `GROUND_TRUTH.json.ids_evaluation` contract against parsed,
35+
sensor-provenanced Snort rows and `OBSERVATION_MANIFEST.json`. Its zero weight
36+
keeps the overall numeric score unchanged while any count, digest, origin, tuple,
37+
timestamp, filtering, or observation contradiction fails acceptance. Legacy
38+
ground truth without the section skips the gate unless the supplied scenario
39+
authors `ids_alerts`, in which case absence is a failure.
40+
3341
### Structure
3442

3543
```yaml
@@ -87,6 +95,7 @@ pillars:
8795
| plausibility | `field_agreement` | no |
8896
| plausibility | `user_diversity` | no |
8997
| plausibility | `anomaly_rate` | no |
98+
| plausibility | `ids_integrity` | yes (100%; zero weight) |
9099
| causality | `causal_ordering` | yes |
91100
| causality | `event_presence` | yes |
92101
| causality | `indicator_accuracy` | no |
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# IDS Signature Configuration
2+
3+
## File and overlay
4+
5+
Package defaults live in `activity/ids_signatures.yaml`. Project changes belong
6+
in `.eforge/config/activity/ids_signatures.yaml`. Entries merge by `sid`, so an
7+
overlay can add a signature or replace selected fields, including its default
8+
alert policy. Reset/reload config state (or start a new CLI process) after edits,
9+
then run `eforge validate-config`.
10+
11+
```yaml
12+
signatures:
13+
- sid: 2002910
14+
alert_policy:
15+
event_filter:
16+
type: both
17+
track: by_src
18+
count: 5
19+
seconds: 60
20+
```
21+
22+
Required signature fields remain `sid`, `rev`, `message`, `classification`,
23+
`priority`, and `proto`; the existing `dst_port`, `direction`, DNS templates,
24+
target service/OS, and baseline eligibility fields keep their current meanings.
25+
26+
## `alert_policy`
27+
28+
`alert_policy` is optional. Omission and `every` both admit every sensor-visible
29+
candidate. A policy object supports:
30+
31+
```yaml
32+
alert_policy:
33+
detection_filter:
34+
track: by_src # by_src | by_dst
35+
count: 5 # positive integer
36+
seconds: 60 # positive integer; half-open window
37+
event_filter:
38+
type: limit # limit | threshold | both
39+
track: by_src
40+
count: 1
41+
seconds: 300
42+
```
43+
44+
`detection_filter` suppresses the first `count` rule matches and admits later
45+
matches while the rolling window stays above that threshold. `event_filter` is
46+
then applied to admitted matches: `limit` emits the first `count` per window,
47+
`threshold` emits every `count`th match and resets, and `both` emits once when the
48+
count is reached and suppresses until expiry. A timestamp exactly `seconds`
49+
after the window start begins a new window.
50+
51+
Scenario attachment policies replace, rather than merge with, this default.
52+
Use `policy: every` on an attachment to explicitly bypass a signature default.
53+
EvidenceForge models alert output only: it does not parse complete Snort rules,
54+
apply `rate_filter`, CIDR suppressions, or IPS actions.
55+
56+
Signature defaults are inherited by attachments on typed `connection`,
57+
`beacon`, `ssh_session`, `rdp_session`, `dhcp_lease`, `port_scan`, `web_scan`,
58+
`dns_query`, `dga_queries`, and `dns_tunnel` events. Defaults never make an
59+
unattached tuple alert. The IDS model does not decrypt traffic, and mail-event
60+
attachments remain deferred.
61+
62+
## Validation
63+
64+
`eforge validate-config` rejects empty policies, unknown keys, invalid
65+
filter/type/track values, booleans/fractions/non-positive values, and integers
66+
above 2,147,483,647. `eforge validate <scenario>` rejects unknown or duplicate
67+
attachment SIDs and conflicting effective policies for one SID. Protocol, port,
68+
and direction mismatches are advisory warnings because nonstandard deployments
69+
can be intentional.

0 commit comments

Comments
 (0)