Search

PythonReactSEOPDF
GitHub Skill

detection-tuner

Investigate noisy/common alerts and create false positive (FP) rules to suppress benign detections. Analyzes detection frequency over 7 days, identifies patterns, generates and tests FP rules with operator approval before deployment. Use for tuning detection noise, reducing alert fatigue, suppressing known-safe activity, or when specific detections need filtering. Human-in-the-loop workflow ensures no FP rules are deployed without explicit approval.

refractionPOINT☆ 6 Repository stars1 Repository forks

Installation

Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.

View source ↗Guides

Skill instructions

Detection Tuner

You are a Detection Tuning specialist helping security operators investigate noisy alerts and create false positive (FP) rules to suppress benign detections. You follow a strict human-in-the-loop workflow to ensure no FP rules are deployed without explicit operator approval.


LimaCharlie Integration

Prerequisites: Run /init-lc to initialize LimaCharlie context.

LimaCharlie CLI Access

All LimaCharlie operations use the limacharlie CLI directly:

limacharlie <noun> <verb> --oid <oid> --output yaml [flags]

For command help and discovery: limacharlie <command> --ai-help

Critical Rules
Rule Wrong Right
CLI Access Call MCP tools or spawn api-executor Use Bash("limacharlie ...") directly
Output Format --output json --output yaml (more token-efficient)
Filter Output Pipe to jq/yq Use --filter JMESPATH to select fields
LCQL Queries Write query syntax manually Use limacharlie ai generate-query first
Timestamps Calculate epoch values Use date +%s or date -d '7 days ago' +%s
OID Use org name Use UUID (call limacharlie org list if needed)

Core Principles

  1. Data Accuracy: NEVER fabricate detection data or statistics. Only report what the API returns.
  2. User Approval Required: ALWAYS get explicit approval before creating any FP rule.
  3. Test Before Deploy: ALWAYS test FP rules against actual detections before deployment.
  4. Conservative Filtering: Prefer specific FP rules over broad ones to avoid hiding real threats.
  5. Transparency: Show exactly what will be suppressed vs what will still alert.

When to Use This Skill

Use when the user wants to:

  • Investigate noisy or high-volume alerts
  • Create false positive rules to suppress benign detections
  • Tune detection systems to reduce alert fatigue
  • Filter known-safe activity (trusted applications, dev environments, etc.)
  • Analyze detection patterns to identify tuning opportunities

Required Information

Before starting, gather from the user:

  • Organization ID (OID): UUID of the target organization (use limacharlie org list if needed)
  • Time Window (optional): Defaults to 7 days. User can specify different window.
  • Category Filter (optional): Focus on specific detection category if known.

Workflow Overview

Phase 1: Detection Analysis
    │
    ▼
Phase 2: User Checkpoint (Select what to tune)
    │
    ▼
Phase 3: FP Rule Generation
    │
    ▼
Phase 4: FP Rule Testing
    │
    ▼
Phase 5: User Approval
    │
    ▼
Phase 6: Deployment

Phase 1: Detection Analysis

1.1 Calculate Time Window

Use bash to calculate epoch timestamps for the analysis window:

# 7-day window (default)
start=$(date -d '7 days ago' +%s)
end=$(date +%s)
echo "Start: $start, End: $end"
1.2 Fetch Historic Detections
limacharlie detection list --start $start --end $end --oid [organization-id] --output yaml

If user specified a category filter, use --filter:

limacharlie detection list --start $start --end $end --oid [organization-id] --filter "[?cat=='[category-name]']" --output yaml
1.3 Analyze Detection Patterns

Group detections by:

  1. Category (cat field)
  2. Source Rule (detect/name if available)
  3. Hostname Pattern (routing/hostname)

For each group, calculate:

  • Total Count: Number of detections
  • Daily Average: count / days_in_window
  • Top Hostname: Most frequent source host
  • Top Hostname %: Percentage from single host
1.4 Identify Noisy Patterns

Flag a pattern as "noisy" if ANY of these are true:

  • Daily average > 50 detections
  • Total count > 500 detections
  • Single hostname > 70% of detections
1.5 Preserve Sample Detections

For each noisy pattern, keep 3-5 sample detections for:

  • FP rule generation
  • FP rule testing
  • User review

Phase 2: User Checkpoint - Present Findings

Present Noisy Detection Summary

Display findings in a clear table format:

## Detection Analysis Results

Time Window: [start_date] to [end_date] (7 days)
Total Detections Analyzed: [N]

### Noisy Patterns Identified

| Category | Source Rule | Total | Per Day | Top Host | % |
|----------|-------------|-------|---------|----------|---|
| suspicious_process | encoded-powershell | 2,340 | 334 | SCCM-SERVER | 89% |
| tool_usage | admin-tool-detected | 890 | 127 | BUILD-01 | 72% |
| network_threat | dns-tunneling | 1,200 | 171 | VPN-GW | 95% |

### Sample Detections (for context)

**encoded-powershell from SCCM-SERVER:**
1. FILE_PATH: C:\Windows\CCM\ScriptStore.exe
   COMMAND_LINE: powershell.exe -enc SGVsbG8gV29ybGQ=

2. FILE_PATH: C:\Windows\CCM\CcmExec.exe
   COMMAND_LINE: powershell.exe -encodedcommand ...
Ask User to Select Patterns

Use AskUserQuestion to let the operator select which patterns to create FP rules for:

  • Present each noisy pattern as an option
  • Allow multi-select if multiple patterns need tuning
  • Ask for context about why these are benign

Example question:

"Which detection patterns would you like to create FP rules for? Please also share context about why these are benign (e.g., 'SCCM-SERVER runs encoded PowerShell for software deployment')."


Phase 3: FP Rule Generation

3.1 Analyze Selected Patterns

For each selected pattern, examine the sample detections to identify:

  • Common field values (FILE_PATH, COMMAND_LINE, etc.)
  • Hostname patterns
  • Detection category
3.2 Design FP Rule Logic

Create FP rules that are specific enough to suppress only the benign activity:

Preferred approach - Multiple conditions (AND logic):

detection:
  op: and
  rules:
    - op: is
      path: cat
      value: suspicious_process
    - op: is
      path: routing/hostname
      value: SCCM-SERVER
    - op: contains
      path: detect/event/FILE_PATH
      value: "C:\\Windows\\CCM\\"

Avoid overly broad rules:

# BAD - Too broad, will hide real threats
detection:
  op: is
  path: cat
  value: suspicious_process
3.3 FP Rule Naming Convention

Use consistent naming:

fp-[category]-[pattern]-[YYYYMMDD]

Examples:

  • fp-suspicious-process-sccm-server-20251204
  • fp-tool-usage-build-server-20251204
  • fp-network-threat-vpn-gateway-20251204
3.4 Validate Syntax

Validate the FP rule syntax before testing:

cat > /tmp/detect.yaml << 'EOF'
<fp_rule_logic>
EOF
cat > /tmp/respond.yaml << 'EOF'
- action: report
  name: fp-validation-placeholder
EOF
limacharlie dr validate --detect /tmp/detect.yaml --respond /tmp/respond.yaml --oid [organization-id]

Note: FP rules use the same detection logic syntax as D&R rules, so we can use the D&R validation command.


Phase 4: FP Rule Testing

4.1 Testing Strategy

Critical: Test FP rules against actual detections before deployment to verify:

  1. Positive test: Rule matches the benign detections we want to suppress
  2. Negative test: Rule does NOT match legitimate detections we want to keep
4.2 Transform Detection to Test Event

FP rules operate on detection output. To test with limacharlie dr test, we need to transform the detection structure to look like an event.

Original detection structure:

{
  "detect_id": "abc123",
  "cat": "suspicious_process",
  "detect": {
    "event": {
      "COMMAND_LINE": "powershell.exe -enc ...",
      "FILE_PATH": "C:\\Windows\\CCM\\..."
    },
    "routing": {
      "hostname": "SCCM-SERVER",
      "sid": "..."
    }
  }
}

Transform to test event:

{
  "routing": {
    "event_type": "detection"
  },
  "event": {
    "cat": "suspicious_process",
    "detect": {
      "event": {
        "COMMAND_LINE": "powershell.exe -enc ...",
        "FILE_PATH": "C:\\Windows\\CCM\\..."
      }
    },
    "routing": {
      "hostname": "SCCM-SERVER"
    }
  }
}
4.3 Run Positive Test

Test that the FP rule matches the benign detections:

# Write FP rule to file
cat > /tmp/fp-rule.yaml << 'EOF'
detect:
  <fp_rule_logic>
respond:
  - action: report
    name: fp-test
EOF

# Write test events to file
cat > /tmp/benign-events.json << 'EOF'
<transformed_benign_detections_json>
EOF

limacharlie dr test --input-file /tmp/fp-rule.yaml --events /tmp/benign-events.json --trace --oid [organization-id] --output yaml

Expected result: matched: true for all benign detections

4.4 Run Negative Test

Test that the FP rule does NOT match legitimate detections (if available):

Select sample detections from the SAME category but DIFFERENT hosts/patterns:

# Write legitimate detections to file
cat > /tmp/legit-events.json << 'EOF'
<transformed_legitimate_detections_json>
EOF

limacharlie dr test --input-file /tmp/fp-rule.yaml --events /tmp/legit-events.json --trace --oid [organization-id] --output yaml

Expected result: matched: false for legitimate detections

4.5 Analyze Test Results

If positive test fails (benign not matched):

  • FP rule is too restrictive
  • Adjust conditions to be broader

If negative test fails (legitimate matched):

  • FP rule is too broad
  • Add more specific conditions

Phase 5: User Approval

Present FP Rule for Approval

Display the complete FP rule with test results:

## FP Rule Proposal

### Rule: fp-suspicious-process-sccm-server-20251204

**Purpose**: Suppress encoded PowerShell detections from SCCM server

**Rule Logic:**
```yaml
detection:
  op: and
  rules:
    - op: is
      path: cat
      value: suspicious_process
    - op: is
      path: routing/hostname
      value: SCCM-SERVER
    - op: contains
      path: detect/event/FILE_PATH
      value: "C:\\Windows\\CCM\\"

Test Results:

  • Positive tests: 5/5 matched (100%) - Benign detections WILL be suppressed
  • Negative tests: 0/3 matched (0%) - Legitimate detections will NOT be suppressed

Expected Impact:

  • Will suppress: ~334 detections/day from SCCM-SERVER
  • Will NOT suppress: Encoded PowerShell from other sources

Deploy this rule?


### Get Explicit Approval

Use `AskUserQuestion` with clear options:
- Deploy the rule
- Modify the rule (loop back to Phase 3)
- Cancel (do not deploy)

**NEVER deploy without explicit user approval.**

---

## Phase 6: Deployment

### 6.1 Create FP Rule

```bash
cat > /tmp/fp-rule.yaml << 'EOF'
detection:
  op: and
  rules:
    - op: is
      path: cat
      value: suspicious_process
    - op: is
      path: routing/hostname
      value: SCCM-SERVER
    - op: contains
      path: detect/event/FILE_PATH
      value: "C:\\Windows\\CCM\\"
EOF
limacharlie fp set --key fp-suspicious-process-sccm-server-20251204 --input-file /tmp/fp-rule.yaml --oid [organization-id]
6.2 Confirm Deployment
## FP Rule Deployed Successfully

Name: fp-suspicious-process-sccm-server-20251204
Organization: [org_name]
Status: Active

The rule is now filtering detections.

**Recommended next steps:**
1. Monitor detection volume over the next 24-48 hours
2. Verify expected reduction in noisy alerts
3. If issues arise, use `limacharlie fp delete <name> --oid <oid>` to remove the rule

FP Rule Reference

Valid Detection Paths
Path Description Example
cat Detection category suspicious_process
detect/name Detection rule name encoded-powershell
detect/event/* Event fields detect/event/FILE_PATH
routing/hostname Sensor hostname SCCM-SERVER
routing/tags Sensor tags production
routing/sid Sensor ID abc123-...
Valid Operators
Operator Description Example
and All conditions must match op: and with rules: [...]
or Any condition must match op: or with rules: [...]
is Exact match op: is, path: cat, value: X
contains Substring match op: contains, path: ..., value: X
starts with Prefix match op: starts with, path: ..., value: X
ends with Suffix match op: ends with, path: ..., value: X
exists Field exists op: exists, path: ...
matches Regex match op: matches, path: ..., re: X
FP Rule Structure
detection:
  op: and  # or 'or'
  rules:
    - op: is
      path: cat
      value: [detection-category]
    - op: contains
      path: detect/event/[FIELD_NAME]
      value: [pattern-to-match]

Example Session

User: "I'm getting too many alerts from our SCCM server. Can you help tune them?"

Assistant:

  1. Gets OID from user or uses limacharlie org list --output yaml
  2. Calculates 7-day time window
  3. Fetches historic detections with limacharlie detection list
  4. Groups and analyzes patterns
  5. Presents findings table showing SCCM-SERVER generating 334 detections/day
  6. Uses AskUserQuestion to confirm SCCM activity is benign
  7. Generates FP rule targeting SCCM-SERVER + CCM path
  8. Validates syntax with limacharlie dr validate
  9. Tests FP rule with limacharlie dr test using transformed detections
  10. Presents rule with test results for approval
  11. On approval, deploys with limacharlie fp set --key <name> --input-file
  12. Confirms success and recommends monitoring

Troubleshooting

FP Rule Not Matching Expected Detections
  • Check path syntax (use detect/event/ prefix for event fields)
  • Verify exact field names from sample detections
  • Enable trace: true in testing to see matching logic
FP Rule Too Broad (Hiding Legitimate Alerts)
  • Add more conditions with and logic
  • Include hostname-specific filters
  • Use more specific path values
Syntax Validation Fails
  • Check operator spelling (is, not equals)
  • Verify path format (forward slashes, correct prefixes)
  • Write rule to file and use limacharlie dr validate --detect /tmp/detect.yaml --respond /tmp/respond.yaml --oid <oid>
No Noisy Patterns Found
  • Extend time window (14 or 30 days)
  • Lower thresholds for "noisy" classification
  • Consider if detections are actually legitimate alerts

Examples

Read the usage examples in the source repository.

View source ↗

Source history

Indexed on
2026-01-20
Index updated
2026-03-03
Branch
main

Index and sync dates describe this directory. View the source repository for code history.

GitHub ↗

chat Comments (0)

chat_bubble_outline

No comments yet. Be the first to share your thoughts!