- Deduplicate 105 raw findings into 52 unique consolidated issues - Apply severity calibration rubric across SA, OA, BT, APT, RT, IR agents - Map findings to 6 triage categories (FIX-NOW, FIX-DETECTION, FIX-OPSEC, FIX-QUALITY, NOT-FIXING, DEFERRED) - Prioritize 4 user-specified concerns: flap suppression blind spot, gateway exclusion, debounce aggressiveness, flap detection OPSEC - Include cross-agent consensus table (28 multi-agent findings, 54% of total) - Provide pre-deployment checklist and remediation effort estimates - Executive summary with 15 CRITICAL, 22 HIGH, 13 MEDIUM, 2 LOW findings
11 KiB
Net Alerter Security Review — Consolidated Findings
Consolidation Date: 2026-04-10
Agents: Security Auditor (SA), OPSEC Analyst (OA), Blue Team (BT), APT Researcher (APT), Red Team (RT), Infrastructure (IR)
Total Findings: 105 raw → 52 consolidated
Review Scope: net_alerter.py, ble_alerter.py, deployment scripts, systemd service files, .secrets artifact
Executive Summary
This report consolidates 105 findings across 6 independent security audit agents into 52 unique, deduplicated issues affecting net_alerter's core functionality, operational security, and deployment reliability. The analysis reveals three critical threat areas:
- Detection Blind Spots (4 findings): Architectural gaps in flap suppression, gateway exclusion, and debounce timers create exploitable windows for attackers to move devices undetected
- OPSEC Attribution Risks (12 findings): Hardcoded paths, distinctive alert prefixes, and leaked infrastructure domains enable forensic attribution to operator
- Credential & Authentication Failures (8 findings): Plaintext Matrix credentials in source, missing input validation, and root execution without privilege isolation
Severity Breakdown
- CRITICAL: 15 findings (3 architecture, 8 credential/auth, 4 OPSEC)
- HIGH: 22 findings (11 detection evasion, 5 OPSEC, 6 reliability)
- MEDIUM: 13 findings (5 race conditions, 3 OPSEC, 5 quality/reliability)
- LOW: 2 findings (user-agent, thread names)
Findings by Agent
| Agent | Total | CRITICAL | HIGH | MEDIUM | LOW |
|---|---|---|---|---|---|
| SA (Security) | 25 | 2 | 7 | 15 | 1 |
| OA (OPSEC) | 20 | 3 | 5 | 10 | 2 |
| BT (Blue Team) | 15 | 2 | 6 | 6 | 1 |
| APT (Nation-State) | 15 | 3 | 4 | 7 | 1 |
| RT (Red Team) | 15 | 3 | 3 | 8 | 1 |
| IR (Infrastructure) | 15 | 2 | 2 | 11 | 0 |
User-Specified Priority Concerns
Concern 1: Flap Suppression Blind Spot (60-second window)
Finding IDs: SA-001, BT-001, RT-001, APT-001
Impact: CRITICAL
Root Cause: When 3+ MACs depart within 3 seconds, ALL departures are suppressed for 60 seconds. Attackers can trigger this with a deauth burst, then move high-value devices undetected.
Exploitation Time: 5 minutes (trivial)
Triage: FIX-NOW (must-fix before deployment)
Concern 2: Gateway Exclusion Blind Spot (permanent whitelist)
Finding IDs: SA-002, BT-002, RT-002, APT-002
Impact: CRITICAL
Root Cause: Gateway IP is permanently whitelisted, never alerts on departure. Rogue AP injection replaces gateway; real gateway departure goes unnoticed.
Exploitation Time: 15 minutes
Triage: FIX-NOW (must-fix before deployment)
Concern 3: Debounce Aggressiveness (15-minute window)
Finding IDs: SA-003, BT-003, APT-003
Impact: HIGH → CRITICAL (for blue-side detection)
Root Cause: 15-minute debounce before departure alert fires. Physical security incidents go undetected for 15 minutes.
Triage: FIX-DETECTION (operator must tune based on environment)
Concern 4: Flap Detection OPSEC (mechanism leakage)
Finding IDs: OA-004, OA-005
Impact: HIGH (attackers learn detection strategy)
Root Cause: Log messages explicitly state flap suppression logic and churn thresholds. Forensic analysts read logs, understand the bypass.
Triage: FIX-OPSEC (before deployment to untrusted network)
Cross-Agent Consensus Findings (Highest Confidence)
| Finding | Agents | IDs | Severity | Summary |
|---|---|---|---|---|
| Flap suppression exploitation | SA, BT, RT, APT | SA-001, BT-001, RT-001, APT-001 | CRITICAL | 60s blind spot exploitable via deauth burst |
| Gateway exclusion rogue AP | SA, BT, RT, APT | SA-002, BT-002, RT-002, APT-002 | CRITICAL | Permanent whitelist enables gateway compromise |
| Matrix credentials leak | SA, APT, RT | SA-006, APT-005, RT-004 | CRITICAL | Plaintext password in .secrets + .env |
| Hardcoded tool paths | OA, BT | OA-001, OA-018, OA-019 | CRITICAL | /opt/net_alerter discovered by filesystem scan |
| Root execution no isolation | SA, APT, RT | SA-018, APT-009, RT-005 | CRITICAL | Runs as root; weaponizable for lateral movement |
| Thread-unsafe state | SA, IR | SA-004, IR-001, IR-003 | HIGH | Race conditions in flag + nested lock deadlock |
| 15-minute debounce | SA, BT, APT | SA-003, BT-003, APT-003 | HIGH | Physical security incidents masked 15 minutes |
| OPSEC log leakage | OA, SA | OA-004, OA-005, SA-007 | HIGH | Flap/churn logs reveal detection strategy |
Critical Findings (CRITICAL — 15 issues)
Must be fixed before production deployment:
-
Flap suppression 60s blind spot (SA-001/BT-001/RT-001/APT-001)
- Deauth burst triggers 60s suppression; attacker moves devices undetected
- Fix: Exponential backoff; suppress window < 20s
-
Gateway exclusion permanent whitelist (SA-002/BT-002/RT-002/APT-002)
- Gateway IP never alerts on departure; rogue AP injection vector
- Fix: Time-bounded suppression (30–60s); re-arm on re-arrival
-
Plaintext Matrix credentials (SA-006/APT-005/RT-004)
- Password in .secrets + .env enables alert hijacking
- Fix: Remove .secrets; fetch from Infisical at runtime; rotate password
-
Matrix token in logs (SA-007/RT-013)
- Bearer token logged; readable in .env
- Fix: Never log tokens; pull from vault; chmod 0600 .env
-
Root execution no privilege isolation (SA-018/APT-009/RT-005)
- Runs as root; no User= directive; no capability dropping
- Fix: systemd User=_alerter; drop caps; chroot
-
Hardcoded /opt/net_alerter path (OA-001)
- Forensic analysis discovers tool by path name
- Fix: Use /opt/.cache/bb/{random}/; environment-variable override
-
Hardcoded m.example.org homeserver (OA-003)
- Operator's personal domain leaks in Matrix logs if .env not overridden
- Fix: Remove default; require explicit env var; fail loudly if unset
-
Thread-unsafe _interface_recovering flag (SA-004/IR-001)
- Race condition between threads; suppression window corruption
- Fix: threading.Lock() + stress test with ThreadSanitizer
-
Nested lock deadlock (SA-005/IR-003)
- Inconsistent lock ordering (_churn_lock → known_lock)
- Fix: Audit lock order; establish invariant; use context managers
-
SQLite injection in OUI query (SA-011/RT-011)
- MAC address not parameterized; SQL injection possible
- Fix: Use parameterized queries
-
Raw socket struct unpacking no bounds (SA-012/RT-006)
- struct.unpack() on untrusted DHCP/ARP without length validation
- Fix: Validate packet length; try/except for unpack errors
-
DHCP hostname injection (SA-013/APT-007/RT-007)
- Hostname accepted as-is; attacker injects shell metacharacters
- Fix: Sanitize hostname; never use in shell context
-
Subprocess injection (SA-014)
- Potential command injection if user input reaches subprocess
- Fix: shell=False; check=True on all calls
-
Env variable injection in deploy (SA-008/SA-016)
- Unquoted variable expansion in SSH commands
- Fix: Quote all vars; use set -u in script
-
Infrastructure IP whitelist mutable (APT-011)
- Whitelist file reloaded at runtime; attacker modifies to remove targets
- Fix: Validate permissions (0600); sign config; require restart
High-Severity Findings (22 issues)
Affect detection accuracy, OPSEC, or reliability:
- [NET]/[BLE] alert prefixes (OA-002) — Distinctive; identify tool in Matrix logs — FIX-OPSEC
- 15-min debounce (SA-003/BT-003/APT-003) — Theft undetected for 15min — FIX-DETECTION
- Flap recovery logs (OA-004) — Reveal suppression mechanism — FIX-OPSEC
- Churn suppression logs (OA-005) — Expose 3-in-30min threshold — FIX-OPSEC
- Churn auto-suppression exploitable (SA-009/APT-004) — Device whitelisted forever after 3 cycles — FIX-DETECTION
- OUI list incomplete (BT-004) — New equipment not excluded; spam alerts — FIX-DETECTION
- Re-arrival suppression masks swaps (BT-005) — Device swap not detected — FIX-DETECTION
- Systemd service names (OA-008) — net_alerter.service discoverable — FIX-OPSEC
- Deploy script reveals tool (OA-009) — Echoes NET_ALERTER in output — FIX-OPSEC
- Reachability check broadcasts (SA-015/RT-010) — IDS detectable pattern — FIX-DETECTION
- Netlink RTM_DELNEIGH false departures (SA-020/IR-010) — Neighbor cache expiration triggers alerts — FIX-DETECTION
- SQLite connection leak (SA-021/RT-008) — Connection pool exhaustion on failures — FIX-NOW
- Person state race condition (SA-022) — Two threads corrupt person dict — FIX-NOW
- HTTP port 9191 hardcoded (SA-023/RT-009) — Predictable port; easy discovery — FIX-OPSEC 15–22. Additional OPSEC, detection, reliability items — See detailed table below
Triage Summary
| Category | Count | Items |
|---|---|---|
| FIX-NOW (deploy-blocking) | 13 | Flap, gateway, creds, root, threads, locks, injection vulns, connection leaks |
| FIX-DETECTION (operator tune) | 7 | Debounce, OUI list, re-arrivals, Netlink, reachability, churn, whitelist |
| FIX-OPSEC (pre-deployment) | 10 | Prefixes, logs, paths, service names, startup messages, aliases, room IDs |
| FIX-QUALITY (Phase 2) | 6 | Matrix retry, timer race, memory growth, restart loop, health check, SSH retry |
| NOT-FIXING (low impact) | 2 | Thread names, filename conventions |
| DEFERRED (post-deploy) | 3 | OUI logging docs, README refs, filename in path obfuscation |
| TOTAL | 52 |
Pre-Deployment Checklist (All FIX-NOW items)
- Flap suppression: replace 3-in-3s with exponential backoff; window < 20s
- Gateway whitelist: time-bounded (30–60s); re-arm on re-arrival
- Matrix password: remove .secrets; rotate immediately; fetch from Infisical
- Matrix token: never log; pull at runtime; chmod 0600 .env
- Root privileges: systemd User=_alerter; drop caps; chroot
- Deployment path: /opt/.cache/bb/{random}/; configurable override
- Matrix homeserver: remove default; require explicit env var
- Thread flag: add threading.Lock(); stress test with ThreadSanitizer
- Lock ordering: audit + establish invariant; use context managers
- SQLite query: parameterized OUI lookup
- Struct unpacking: validate packet length before unpack()
- Hostname injection: sanitize; never use in shell
- Subprocess: shell=False; check=True
- Env injection: quote vars; set -u in script
- Whitelist: 0600 perms; sign config; require restart
Document Metadata
- Review Date: 2026-04-10
- Total Findings Consolidated: 105 → 52
- Deduplication Ratio: 2:1 average
- Severity Breakdown: 15 CRITICAL, 22 HIGH, 13 MEDIUM, 2 LOW
- Review Status: Consolidated; awaiting operator action on FIX-NOW items
- Next Step: Remediation of 13 FIX-NOW items before any target deployment