Skip to content

Commit cfb893a

Browse files
author
JERVS Auditor
committed
Add email security posture skill
1 parent ffbaba0 commit cfb893a

8 files changed

Lines changed: 620 additions & 2 deletions

File tree

index.yaml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
meta:
77
version: "1.0.0"
8-
last_updated: "2026-03-05"
9-
skill_count: 45
8+
last_updated: "2026-06-05"
9+
skill_count: 46
1010
role_count: 5
1111

1212
tag_vocabulary:
@@ -517,6 +517,18 @@ skills:
517517
file: skills/network/dns-security/SKILL.md
518518
compatible_tools: [claude-code, gemini-cli, cursor, codex-cli, openclaw, kiro]
519519

520+
- id: email-security
521+
name: "Email Security Posture Review"
522+
tags: [network, email, spf, dkim, dmarc, mta-sts, tls-rpt]
523+
role: [security-engineer, vciso]
524+
phase: [operate, assess]
525+
activity: [review, audit, assess]
526+
frameworks: [RFC-9989, RFC-9990, RFC-9991, RFC-7208, RFC-6376, RFC-8461, RFC-8460, CISA-BOD-18-01]
527+
difficulty: intermediate
528+
time_estimate: "45-90min"
529+
file: skills/network/email-security/SKILL.md
530+
compatible_tools: [claude-code, gemini-cli, cursor, codex-cli, openclaw, kiro]
531+
520532
# -- DevSecOps ------------------------------------------------------------
521533
- id: pipeline-security
522534
name: "CI/CD Pipeline Security Review"

skills/network/email-security/SKILL.md

Lines changed: 452 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
case: aligned-m365-dmarc-reject
3+
expected: benign
4+
finding_ids: []
5+
---
6+
7+
# Benign: Inventoried Microsoft 365 Sender With Strict DMARC
8+
9+
```dns
10+
example.com. MX 0 example-com.mail.protection.outlook.com.
11+
example.com. TXT "v=spf1 include:spf.protection.outlook.com -all"
12+
selector1._domainkey.example.com. CNAME selector1-example-com._domainkey.example.onmicrosoft.com.
13+
selector2._domainkey.example.com. CNAME selector2-example-com._domainkey.example.onmicrosoft.com.
14+
_dmarc.example.com. TXT "v=DMARC1; p=reject; rua=mailto:dmarc-aggregate@example.com; adkim=s; aspf=s"
15+
```
16+
17+
```yaml
18+
header_evidence:
19+
spf_result: pass
20+
dkim_result: pass
21+
dmarc_result: pass
22+
from_domain_aligned: true
23+
reporting:
24+
aggregate_reports_received: true
25+
owner: messaging-security
26+
confidence: strong
27+
```
28+
29+
Expected review: pass strict DMARC posture when sender inventory, header alignment, and report monitoring are evidenced.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
case: monitored-dmarc-rollout-pnone
3+
expected: benign
4+
finding_ids: []
5+
---
6+
7+
# Benign: Monitored DMARC Rollout in p=none
8+
9+
```dns
10+
example.org. TXT "v=spf1 include:_spf.google.com include:sendgrid.net -all"
11+
_dmarc.example.org. TXT "v=DMARC1; p=none; rua=mailto:dmarc-aggregate@example.org; adkim=r; aspf=r"
12+
```
13+
14+
```yaml
15+
rollout_state:
16+
owner: messaging-security
17+
aggregate_reports_received: true
18+
unknown_sources_triaged: weekly
19+
aligned_senders_percent: 96
20+
target_policy: quarantine
21+
target_date: 2026-07-15
22+
open_sender_backlog:
23+
- ticket: MAIL-1842
24+
sender: billing-saas
25+
issue: DKIM alignment pending
26+
confidence: partial
27+
```
28+
29+
Expected review: do not escalate solely because policy is `p=none`; record as controlled rollout if reports, owner, backlog, and enforcement plan are present.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
---
2+
case: non-sending-domain-no-send
3+
expected: benign
4+
finding_ids: []
5+
---
6+
7+
# Benign: Non-Sending Domain With Explicit No-Send Posture
8+
9+
```dns
10+
example.net. MX 0 .
11+
example.net. TXT "v=spf1 -all"
12+
_dmarc.example.net. TXT "v=DMARC1; p=reject"
13+
```
14+
15+
```yaml
16+
classification: non-sending
17+
owner: brand-protection
18+
last_review: 2026-06-01
19+
header_evidence_required: false
20+
confidence: strong
21+
```
22+
23+
Expected review: do not require DKIM or sender headers for a confirmed non-sending domain with null MX, SPF fail-all, DMARC reject, and owner evidence.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
---
2+
case: cross-domain-rua-no-authorization
3+
expected: vulnerable
4+
finding_ids:
5+
- EMAIL-DMARC-05
6+
- EMAIL-RPT-02
7+
---
8+
9+
# Vulnerable: Cross-Domain DMARC Reporting Without Authorization Evidence
10+
11+
```dns
12+
_dmarc.example.com. TXT "v=DMARC1; p=reject; rua=mailto:dmarc@vendor.example"
13+
```
14+
15+
```yaml
16+
report_authorization:
17+
destination_domain: vendor.example
18+
authorization_record_found: false
19+
report_owner: unknown
20+
last_review: unknown
21+
```
22+
23+
Expected review: do not fail strict DMARC policy only because the report destination is external, but require external reporting authorization and report ownership evidence.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
case: overbroad-spf-dmarc-none
3+
expected: vulnerable
4+
finding_ids:
5+
- EMAIL-INV-01
6+
- EMAIL-SPF-02
7+
- EMAIL-DMARC-02
8+
- EMAIL-DMARC-04
9+
---
10+
11+
# Vulnerable: Overbroad SPF and Unmonitored DMARC
12+
13+
```dns
14+
example.com. TXT "v=spf1 include:_spf.google.com include:sendgrid.net include:mailgun.org include:spf.protection.outlook.com include:_spf.salesforce.com ~all"
15+
_dmarc.example.com. TXT "v=DMARC1; p=none"
16+
```
17+
18+
Expected review: require sender inventory, SPF include ownership, aggregate reporting, owner, report review cadence, and an enforcement plan before treating this as controlled.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
case: stale-mta-sts-policy
3+
expected: vulnerable
4+
finding_ids:
5+
- EMAIL-TLS-01
6+
- EMAIL-TLS-02
7+
- EMAIL-TLS-03
8+
---
9+
10+
# Vulnerable: Stale MTA-STS Policy
11+
12+
```dns
13+
example.com. MX 10 mx1.current-mail.example.
14+
_mta-sts.example.com. TXT "v=STSv1; id=2026060101"
15+
```
16+
17+
```txt
18+
https://mta-sts.example.com/.well-known/mta-sts.txt
19+
20+
version: STSv1
21+
mode: enforce
22+
mx: mx1.old-mail.example
23+
max_age: 604800
24+
```
25+
26+
```yaml
27+
tls_rpt_record: missing
28+
mx_matches_policy: false
29+
rollback_plan: unknown
30+
```
31+
32+
Expected review: flag stale MX policy in enforce mode, especially when TLS-RPT is missing and rollback evidence is unknown.

0 commit comments

Comments
 (0)