severity-scoring · v1.1 · 2026-09-24 · sha256 5ae1b5860c231640
severity-scoring v1.1A
Immutable. This exact content is served forever at /api/v1/blob/5ae1b5860c231640.
--- name: severity-scoring description: Compute a defensible priority (P1–P4), severity and confidence for a case from rule level, asset criticality, blast radius and ATT&CK tactic; use whenever you set or change case severity. allowed-tools: get_case get_wazuh_agents get_wazuh_rules_summary perform_risk_assessment update_case add_finding metadata: category: detection display_name: Severity Scoring standards: [nist-800-61r3, nist-csf-2, mitre-attack] version: "1.1" --- # Severity Scoring Severity must be explainable. Use this formula, then sanity-check it. ## Inputs (each scored 0–10) | Factor | Weight | How to score | |---|---|---| | Rule level (L) | 0.30 | `min(10, rule.level * 10 / 15)` using the highest level in the case (see note below) | | Asset criticality (A) | 0.25 | 10 crown-jewel / domain controller / prod DB; 7 prod server; 4 internal workstation; 2 lab/test | | Tactic weight (T) | 0.20 | see table below, highest tactic present | | Blast radius (B) | 0.15 | 1 host = 2; 2–5 hosts = 5; >5 hosts or domain-wide identity = 9; org-wide = 10 | | Evidence strength (E) | 0.10 | 10 confirmed success (e.g. login after brute force, file dropped); 5 attempt; 2 anomaly only | `score = 0.30L + 0.25A + 0.20T + 0.15B + 0.10E` ### About Wazuh levels Wazuh levels describe the rule, not your environment. Some are misleading in context: - High-level rules can be environmental or operational. For example, rule 204 (agent event queue flooded, level 12) is a pipeline problem, and rule 1003 (oversized syslog message, level 13) is often a misbehaving device. Keep L from the level, but score E low unless there is attacker evidence. - Low-level rules can be the key evidence. For example, rule 5715 (sshd authentication success, level 3) right after rule 5712 (brute force, level 10) from the same source is a likely compromise. Score E = 10 and use the highest level in the case, not the success event's. - Vulnerability-detector levels follow CVE severity (rules 23503, 23504, 23505, 23506 = Low, Medium, High, Critical). That is exposure, not activity: route to `vulnerability-prioritization` instead of scoring it as an intrusion. ## Tactic weights (MITRE ATT&CK) | Tactic | Weight | |---|---| | Reconnaissance, Resource Development | 2 | | Initial Access (attempt), Discovery | 4 | | Execution, Persistence, Defense Evasion | 6 | | Credential Access, Privilege Escalation | 7 | | Lateral Movement, Command and Control | 8 | | Collection, Exfiltration | 9 | | Impact | 10 | ## Mapping | Score | Priority | Severity | Target response | |---|---|---|---| | ≥ 8.0 | P1 | critical | immediate, page on-call | | 6.0–7.9 | P2 | high | within 1 hour | | 4.0–5.9 | P3 | medium | same business day | | < 4.0 | P4 | low / informational | backlog / batch | Overrides (apply after the formula): - Confirmed data exfiltration or ransomware behaviour → P1 regardless. - Only reconnaissance with no success, external source → cap at P3. - Asset tagged protected/critical in org context → floor at P2. ## Confidence (0–1) Confidence is how sure you are the activity is malicious, separate from severity. | Evidence | Confidence | |---|---| | Multiple independent signals + threat-intel match | 0.9–1.0 | | Clear pattern (e.g. brute force then success) | 0.75–0.9 | | Single high-fidelity rule | 0.6–0.75 | | Single generic rule / anomaly | 0.3–0.6 | | Likely benign, unexplained | < 0.3 | `perform_risk_assessment` may be used as an extra input; don't let it override your own reasoning without explanation. ## Output - `update_case(case_id, severity=..., confidence=...)`. - `add_finding` titled `Severity rationale` containing the factor table with scores, the computed score, overrides applied, priority, and confidence reasoning. standard_refs: `NIST-800-61r3`.