|
527 | 527 |
|
528 | 528 | **Goal:** Fix the hard acceptance failure (parsability) and the most obvious per-record tells. Smallest changes, biggest eval score impact. |
529 | 529 |
|
530 | | -- [ ] **Fix empty SID fields in Windows events** |
| 530 | +- [x] **Fix empty SID fields in Windows events** |
531 | 531 | - Generate realistic SIDs: `S-1-5-21-{domain_sub_authorities}-{user_rid}` |
532 | 532 | - Assign per-domain base SID at engine init (e.g., `S-1-5-21-3623811015-3361044348-30300820`) |
533 | 533 | - Map each user to a unique RID (starting at 1001, incrementing) |
534 | 534 | - Well-known SIDs for system accounts: `S-1-5-18` (SYSTEM), `S-1-5-19` (LOCAL SERVICE), `S-1-5-20` (NETWORK SERVICE) |
535 | 535 | - Populate `SubjectUserSid` and `TargetUserSid` in all Windows event data dicts in `activity.py` |
536 | 536 | - Files: `activity.py`, `engine.py` (SID registry initialization) |
537 | | -- [ ] **Add logoff generation to baseline activity** |
| 537 | +- [x] **Add logoff generation to baseline activity** |
538 | 538 | - Track active sessions per user; probabilistically end sessions (e.g., 30% chance per hour after first hour) |
539 | 539 | - Emit Windows 4634 (logoff) and eCAR USER_SESSION/LOGOUT |
540 | 540 | - Ensure logon→activity→logoff ordering within each session |
541 | 541 | - Files: `activity.py` (`execute_baseline_activity`), `engine.py` (`_generate_baseline`) |
542 | | -- [ ] **Vary Zeek conn_state and history strings** |
| 542 | +- [x] **Vary Zeek conn_state and history strings** |
543 | 543 | - Replace hardcoded `SF`/`ShADadfF` with probabilistic selection |
544 | 544 | - Connection states: SF (85%), S0 (5%), S1 (3%), REJ (2%), RSTO (3%), RSTR (1%), OTH (1%) |
545 | 545 | - Generate history strings that match conn_state (e.g., S0→`S`, REJ→`Sr`, RSTO→`ShADaR`) |
546 | 546 | - Adjust orig_bytes/resp_bytes to be consistent (e.g., S0 = 0 resp_bytes) |
547 | 547 | - Files: `activity.py` (`generate_connection`) |
548 | | -- [ ] **Expand process template pools** |
| 548 | +- [x] **Expand process template pools** |
549 | 549 | - Windows: add system backbone (svchost.exe, lsass.exe, explorer.exe, services.exe, csrss.exe, RuntimeBroker.exe, SearchIndexer.exe) + user apps (chrome.exe, firefox.exe, outlook.exe, teams.exe, OneDrive.exe) |
550 | 550 | - Linux: add system processes (systemd, cron, sshd, rsyslogd, NetworkManager) + user apps (firefox, thunderbird, git, docker, python3) |
551 | 551 | - Per-persona weighting: developers see more compilers/editors, executives see more Office/browser |
552 | 552 | - Files: `activity.py` (PROCESS_TEMPLATES, PROCESS_TEMPLATES_LINUX) |
553 | | -- [ ] Test: Parsability score ≥ 98% (SIDs valid format) |
554 | | -- [ ] Test: Logoff events present in output, paired with logons |
555 | | -- [ ] Test: conn_state distribution is varied (not 100% SF) |
556 | | -- [ ] Test: Process path count > 30 unique paths |
| 553 | +- [x] Test: Parsability score ≥ 98% (SIDs valid format) |
| 554 | +- [x] Test: Logoff events present in output, paired with logons |
| 555 | +- [x] Test: conn_state distribution is varied (not 100% SF) |
| 556 | +- [x] Test: Process path count > 30 unique paths |
557 | 557 |
|
558 | 558 | ### 5.2 Event Type Diversity |
559 | 559 |
|
560 | 560 | **Goal:** Expand the vocabulary of events generated. Address "only 2 Event IDs" and "only 2 eCAR object types." |
561 | 561 |
|
562 | | -- [ ] **Add Windows Event IDs to format definition and emitters** |
| 562 | +- [x] **Add Windows Event IDs to format definition and emitters** |
563 | 563 | - 4625: Failed logon (account does not exist, bad password, account locked) |
564 | 564 | - 4672: Special privileges assigned to new logon (admin logons) |
565 | 565 | - 4689: Process termination (pair with 4688) |
566 | 566 | - 4648: Explicit credential logon (RunAs, scheduled tasks) |
567 | 567 | - 5156: Windows Filtering Platform connection allowed (host firewall) |
568 | 568 | - Update `windows_event_security.yaml` schema, Jinja2 templates, and validation rules |
569 | 569 | - Files: `formats/definitions/windows_event_security.yaml`, `generation/emitters/windows.py` |
570 | | -- [ ] **Generate failed logons in baseline** |
| 570 | +- [x] **Generate failed logons in baseline** |
571 | 571 | - 5-15% of logon attempts fail (configurable via persona risk_profile) |
572 | 572 | - Failure reasons: bad password (most common), account locked, expired password |
573 | 573 | - Emit Windows 4625 + eCAR USER_SESSION/LOGON_FAILURE |
574 | 574 | - Files: `activity.py` (`generate_logon` or new `generate_failed_logon`) |
575 | | -- [ ] **Add eCAR object type diversity** |
| 575 | +- [x] **Add eCAR object type diversity** |
576 | 576 | - FILE/CREATE, FILE/MODIFY, FILE/DELETE — generated alongside process activity |
577 | 577 | - REGISTRY/MODIFY — Windows system processes and app installs |
578 | 578 | - FLOW/CONNECT — parallel to Zeek connections for eCAR-equipped hosts |
579 | 579 | - MODULE/LOAD — DLL loads for Windows processes |
580 | 580 | - Files: `activity.py` (new methods), `generation/emitters/ecar.py` |
581 | | -- [ ] **Add process termination events** |
| 581 | +- [x] **Add process termination events** |
582 | 582 | - Pair 4689 with 4688: terminate processes after realistic duration (seconds to hours) |
583 | 583 | - Track running processes in StateManager, probabilistically terminate |
584 | 584 | - Files: `activity.py`, `state_manager.py` |
585 | | -- [ ] Test: ≥ 6 unique Windows Event IDs in output |
586 | | -- [ ] Test: ≥ 5 unique eCAR object types in output |
587 | | -- [ ] Test: Failed logon rate between 5-15% of total logon events |
588 | | -- [ ] Test: Process termination events present, paired with creation |
| 585 | +- [x] Test: ≥ 6 unique Windows Event IDs in output |
| 586 | +- [x] Test: ≥ 5 unique eCAR object types in output |
| 587 | +- [x] Test: Failed logon rate between 5-15% of total logon events |
| 588 | +- [x] Test: Process termination events present, paired with creation |
589 | 589 |
|
590 | 590 | ### 5.3 Protocol & Network Diversity |
591 | 591 |
|
|
654 | 654 |
|
655 | 655 | **Goal:** Replace uniform event distribution with realistic human timing patterns. Address "metronomic spacing" and "hard rectangular work hours." |
656 | 656 |
|
657 | | -- [ ] **Soft ramp-up/ramp-down for work hours** |
| 657 | +- [x] **Soft ramp-up/ramp-down for work hours** |
658 | 658 | - Replace binary on/off with sigmoid curve: 10% activity at work_start-1h, ramp to 100% by work_start+1h |
659 | 659 | - Soft lunch dip (50% reduction, not 0%) |
660 | 660 | - Evening tail: 20% activity for 1-2 hours after work_end |
661 | 661 | - Occasional late-night activity (1-3% probability per user per night) |
662 | 662 | - Files: `engine.py` (`_calculate_events_for_hour`) |
663 | | -- [ ] **Activity cluster model** |
| 663 | +- [x] **Activity cluster model** |
664 | 664 | - Replace `_distribute_events_in_hour()` uniform distribution with cluster generation |
665 | 665 | - Each "activity" becomes a burst of 3-15 correlated events over 5-30 seconds |
666 | 666 | - Cluster types per persona: developer (editor→compile→test→git), executive (email→calendar→browser), analyst (query→export→review) |
667 | 667 | - Inter-cluster gaps: 2-15 minutes (exponential distribution) |
668 | 668 | - Files: `engine.py` (`_distribute_events_in_hour` → `_generate_activity_clusters`), `activity.py` (cluster templates) |
669 | | -- [ ] **Per-user work hour jitter** |
| 669 | +- [x] **Per-user work hour jitter** |
670 | 670 | - Randomize each user's actual start/end/lunch times ±30min from persona defaults |
671 | 671 | - Applied once at engine init, consistent throughout scenario |
672 | 672 | - Early arrivals, late starters, short/long lunches |
673 | 673 | - Files: `engine.py` (init), `engine.py` (`_calculate_events_for_hour`) |
674 | | -- [ ] **Per-persona behavioral differentiation** |
| 674 | +- [x] **Per-persona behavioral differentiation** |
675 | 675 | - Developers: longer clusters (sustained coding sessions), more process events, fewer web connections |
676 | 676 | - Executives: short frequent clusters (meetings → quick email checks), more web/email, fewer processes |
677 | 677 | - Analysts: medium clusters with heavy DB/query activity |
678 | 678 | - Each persona type gets distinct cluster templates and inter-cluster timing |
679 | 679 | - Files: `activity.py` (persona-specific cluster definitions) |
680 | | -- [ ] Test: Events cluster with sub-second intra-cluster timing |
681 | | -- [ ] Test: Inter-cluster gaps follow non-uniform distribution |
682 | | -- [ ] Test: Work hour profile shows gradual ramp (not step function) |
683 | | -- [ ] Test: Per-user timing varies (different arrival times) |
684 | | -- [ ] Test: Human burstiness CV > 1.0 (eval dimension) |
| 680 | +- [x] Test: Events cluster with sub-second intra-cluster timing |
| 681 | +- [x] Test: Inter-cluster gaps follow non-uniform distribution |
| 682 | +- [x] Test: Work hour profile shows gradual ramp (not step function) |
| 683 | +- [x] Test: Per-user timing varies (different arrival times) |
| 684 | +- [x] Test: Human burstiness CV > 1.0 (eval dimension) |
685 | 685 |
|
686 | 686 | **Phase 5 Milestone:** Generated data passes qualitative review — no instant tells. Eval score ≥ 85, all hard acceptance criteria pass. Background noise has protocol diversity (TCP+UDP+ICMP), event type depth (≥ 6 Windows Event IDs, ≥ 5 eCAR objects), realistic timing patterns, and hundreds of unique destination IPs. |
687 | 687 |
|
|
0 commit comments