fix(corpus): address corpus-review #54 — detection quality + S3 exfil pair - #55
Merged
Conversation
… pair Acts on the report-first corpus review in issue #54. Changed (detection quality): - web-service-c2-beacon: invert from a hardcoded 4-domain allowlist to a process-centric gate (non-browser / user-writable-path process beaconing 443 to a rare-for-host SaaS API); demote the four domains to a seed IOC list. - adcs-esc1-4886: retarget to 4887 (cert issued) + CA request-attribute auditing; add caveat that the 4886 upn= parse is best-effort and can silently miss; separate the 5136 userCertificate line as shadow-cred/relay telemetry, not an ESC1-SAN backstop. - mass-encrypt-4663: implement and prefer the Sysmon-11 FileCreate variant (file-data SACLs are off by default, so the 4663-only query was blind). - mtls-c2-ja3: note JA3's uTLS weakness and prefer JA4/JA4S where available. Added (coverage): - aws-s3-mass-exfil <-> aws-s3-exfil-cloudtrail: new T1530 (Data from Cloud Storage) pair filling the corpus's thinnest tactic (Collection). Bulk ListBucket/GetObject or server-side CopyObject, detected on per-principal CloudTrail S3 data-event volume with a data-events-required caveat and an S3-access-log fallback. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FpmqDD5xMwESThUFa29nyW
Contributor
There was a problem hiding this comment.
Pull request overview
Addresses the corpus-review findings in #54 by improving detection fidelity for several existing blue entries and adding new cloud-collection coverage for AWS S3 mass exfiltration (T1530), with a corresponding changelog update.
Changes:
- Reworked
web-service-c2-beaconto be process-centric (not domain-IOC gated) and added triage seed IOCs. - Retargeted
adcs-esc1-4886toward 4887 + auditing caveats; added Sysmon 11 primary path formass-encrypt-4663; refreshedmtls-c2-ja3guidance toward JA4/JA4S. - Added a new red↔blue pair for AWS S3 bulk exfiltration (
aws-s3-mass-exfil↔aws-s3-exfil-cloudtrail).
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| entries/red/aws-s3-mass-exfil.md | New red entry describing bulk S3 object collection/exfil patterns (T1530). |
| entries/blue/aws-s3-exfil-cloudtrail.md | New blue detection entry for S3 bulk reads/copies using CloudTrail data events and access-log fallbacks. |
| entries/blue/web-service-c2-beacon.md | Updated SPL and prose to pivot on suspicious processes rather than SaaS domain allowlists. |
| entries/blue/adcs-esc1-4886.md | Updated to include 4887 and clearer auditing caveats; revised SPL accordingly. |
| entries/blue/mass-encrypt-4663.md | Added Sysmon Event ID 11 primary detection path; expanded event_ids. |
| entries/blue/mtls-c2-ja3.md | Updated guidance to prefer JA4/JA4S over JA3 where available. |
| CHANGELOG.md | Documented the Added/Changed items under [Unreleased]. |
Comments suppressed due to low confidence (1)
entries/blue/web-service-c2-beacon.md:32
- Splunk’s
sortcommand doesn’t accept commas between fields;| sort - user_writable, - connswill error. Provide fields as space-separated sort keys.
| sort - user_writable, - conns
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+21
to
+25
| > Caveat: `GetObject`/`ListObjects` are S3 **data events** — *not* logged by | ||
| > CloudTrail unless S3 data-event logging is enabled for the bucket (management | ||
| > events won't carry them). Where data events are off, fall back to **S3 server | ||
| > access logs** / CloudWatch `BytesDownloaded`. `CopyObject` to an external bucket | ||
| > is visible via data events on the *source* bucket. |
- web-service-c2-beacon: use explicit wildcard OR-list instead of `IN (...)` (portable wildcard exclusion of browsers) and drop the comma/space in `sort`. - adcs-esc1-4886: carry `_time` through the `stats` (latest(_time)) so the final `table _time` isn't empty. - aws-s3-exfil-cloudtrail: correct the CopyObject note — CloudTrail data events land on the DESTINATION bucket, so a copy to an attacker-owned bucket is a blind spot; catch it on the source bucket's S3 server access logs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FpmqDD5xMwESThUFa29nyW
Collaborator
Author
|
Thanks — all four points were valid and are fixed in 60f8a97:
The suppressed Generated by Claude Code |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Acts on the report-first corpus review in #54. All five findings are addressed; the
silver-ticketitem was recorded as a non-finding (no change needed), consistent with the report.Changed — detection quality
web-service-c2-beacon(high confidence). Inverted from a hardcoded 4-domain allowlist to a process-centric gate: non-browser / user-writable-path process making periodic 443 SaaS beacons rare-for-the-host. Any T1102.002 channel over a different trusted SaaS (Discord, Dropbox, Pastebin, …) no longer evades silently. The four domains are demoted to a labelled seed IOC list, matching the red entry's "the tell is the process."adcs-esc1-4886(config-dependent). Retargeted to 4887 (certificate issued) + CA request-attribute auditing as primary; added a caveat that the4886upn=parse is best-effort and can silently read zero as "no ESC1"; separated the5136 userCertificateline as shadow-cred/relay telemetry rather than an ESC1-SAN backstop.event_idsnow[4886, 4887, 5136].mass-encrypt-4663(low severity). Implemented and preferred the Sysmon-11 FileCreate variant the prose already advertised — file-data SACLs are off by default, so the 4663-only query was blind out-of-the-box.event_idsnow[4663, 11].mtls-c2-ja3(polish). Noted JA3's uTLS weakness and to prefer JA4/JA4S (FoxIO, 2023+, emitted by current Zeek) where available.Added — coverage
T1530pair (medium/scope).aws-s3-mass-exfil(bulkListBucket→GetObject/sync, or server-sideCopyObjectinto an attacker bucket) ↔aws-s3-exfil-cloudtrail(per-principal object-read volume via CloudTrail S3 data events, with a caveat that data events must be enabled and an S3-server-access-log /BytesDownloadedfallback). Fills the corpus's thinnest tactic (Collection, TA0009) — S3 is the canonical cloud-exfil target and was previously uncovered.Validation
Ran the CI gates locally — all green:
./gen-views.sh --check— drift gate passes (standalone, no flat-view targets){{slots}}(the cloud entries carry none)CHANGELOG.mdupdated under[Unreleased](Added + Changed) per the repo's Conventional-Commits + Keep-a-Changelog contract.Closes #54.
🤖 Generated with Claude Code
Generated by Claude Code