Blog
Hunting pre-patch compromise when the signal is KEV plus internet exposure
When a vulnerability is KEV-listed and the affected service is internet-facing, the forensic question is not just 'is it patched?' but 'was it exploited before the patch?' Structured artifact hunting by asset class, aligned with BOD 26-04 requirements.
KEV · Operator triage
"Known exploited" in the CISA KEV catalog means active exploitation has been observed in the wild. When the affected service is internet-facing, the question is not only whether a patch has been applied — it is whether exploitation occurred during the window between vulnerability disclosure (or silent exploitation) and patching.
Patching without hunting is insufficient for high-confidence incident response. The patch removes the attack vector; it does not remove an attacker who used the vector before the patch. This post structures the hunt by asset class using the October 2026 KEV additions as the reference set.
Hunt philosophy: window times exposure times capability
Three variables determine the required hunt depth:
| Variable | Low | Medium | High |
|---|---|---|---|
| Exposure window (time between disclosure and patch) | < 24 hours | 1–7 days | > 7 days |
| Internet exposure | Internal-only | Internet-accessible | Internet-facing, publicly indexed |
| Known exploitation activity | No in-wild evidence | Opportunistic scanning observed | Active threat actor use, PoC public |
KEV catalog addition implies "High" on the known exploitation axis. Combine with the exposure window and internet exposure level to determine hunt depth.
Hunt artifacts by asset class
Web application runtime (PHP — CVE-2026-109618 / CVE-2026-109619)
| Artifact | Location | Suspicious indicator |
|---|---|---|
| Web server access log for PHP CGI path | /var/log/apache2/access.log, /var/log/nginx/access.log | Requests with no = in query string to .php endpoints; unusual Content-Type boundary values |
| PHP error log | /var/log/php*.log, /var/log/php-fpm/www-error.log | Unexpected exec(), system(), passthru() in stack traces |
| Process tree anomalies | auditd syscall log, EDR | php-cgi or php-fpm spawning bash, sh, curl, wget, nc |
| Unexpected files in web root | File system (AIDE, Tripwire, or manual) | .php files created in document root during exposure window |
| Outbound connections from PHP process | Netflow, firewall logs | PHP process making unexpected outbound HTTP/S connections |
# Web access log: requests without '=' in query string to PHP (CGI injection vector)
grep -E '\?[^=&]+ HTTP' /var/log/apache2/access.log | grep '\.php'
# Look for shell-like queries (common in PoC testing)
grep -E 'cmd=|exec=|system=|passthru=|shell_exec=' /var/log/apache2/access.log
# auditd: execve calls from php-cgi or php-fpm processes
ausearch -c 'php-cgi' --syscall execve | grep -A5 'type=EXECVE'
ausearch -c 'php-fpm' --syscall execve | grep -A5 'type=EXECVE'
# Unexpected file creation in web root during window
find /var/www/html -newer /var/www/html/index.php -name "*.php" 2>/dev/nullMedia server (Plex — CVE-2026-96652 through CVE-2026-96656)
| Artifact | Location | Suspicious indicator |
|---|---|---|
| Plex access log for metadata fetch | ~/.config/Plex/Logs/ (Linux) or %LOCALAPPDATA%\Plex Media Server\Logs\ (Windows) | Fetch requests to non-Plex metadata destinations (non-plex.tv, non-themoviedb.org) |
| Plex plug-in directory | Plug-ins/ subdirectory of Plex data path | New or modified plug-in files during exposure window |
| OS process tree | EDR, auditd, Sysmon Event 1 | Plex process spawning bash, sh, python, powershell, cmd |
| Network connections from Plex | Netflow / firewall | Plex process initiating connections to RFC 1918 or loopback addresses (SSRF evidence) |
# Plex log: unusual metadata fetch destinations
grep -i "fetch\|metadata" ~/.config/Plex/Logs/*.log | \
grep -vE "plex\.tv|themoviedb|thetvdb|music\.plex\.tv|fanart\.tv"
# Plug-in directory: files modified during exposure window (use actual window date)
find /var/lib/plexmediaserver/ -name "*.py" -o -name "*.bundle" | \
xargs ls -la 2>/dev/null | grep "Oct [0-9 ][0-9]"
# Plex data directories for unexpected files
find ~/.config/Plex -newer ~/.config/Plex/Logs/ -type f 2>/dev/nullWAF appliance (SiteGuard — CVE-2026-106931)
| Artifact | Location | Suspicious indicator |
|---|---|---|
| Management interface auth log | SiteGuard audit log | Login events from unexpected IPs or at off-hours; failed login attempts preceding success |
| Configuration change history | SiteGuard config audit | WAF rule modifications or disables not initiated by known admin |
| OS command execution log | auditd (if Linux-based) | Shell commands executed as SiteGuard service account |
| WAF rule effectiveness | Application logs post-event | Attacks that would normally be blocked reaching application — WAF rule disabled |
Endpoint/workstation (Siemens Software Center — CVE-2026-110936)
| Artifact | Location | Suspicious indicator |
|---|---|---|
| DLL load events | Sysmon Event ID 7 (DLL loaded) | Siemens Software Center loading DLL from user-writable path |
| Process creation | Sysmon Event ID 1, Windows Security 4688 | Siemens Software Center spawning unexpected child processes |
| File creation in DLL search path | Sysmon Event ID 11 | New DLL created in Siemens Software Center search path directories |
| ClickFix delivery | Browser history, PowerShell ScriptBlock log | PowerShell commands pasted and executed near the exposure window |
# Sysmon: DLL loads from user-writable paths for Siemens process
Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" |
Where-Object { $_.Id -eq 7 -and $_.Message -like "*SiemensUpdateManager*" } |
Select-Object TimeCreated, Message
# Windows Security: process creation from Siemens process
Get-WinEvent -LogName Security |
Where-Object { $_.Id -eq 4688 -and $_.Message -like "*SiemensUpdateManager*" }Hunt prioritisation matrix
| Asset class | KEV internet-facing | Exposure window | Hunt depth |
|---|---|---|---|
| PHP (CGI mode, internet-facing) | Yes | Advisory to patch date | Deep: log forensics + file integrity + process audit |
| Plex (internet-facing, unpatched chain) | Yes | Advisory to patch date | Deep: log review + plug-in directory + network connections |
| SiteGuard management (if internet-accessible) | Partial (management port) | Advisory to patch date | Medium: auth log review + config change audit |
| Siemens Software Center (internal workstation) | No | Reduced — local access required | Light: DLL load events + process creation near incident date |
Negative evidence and log gaps
A clean artifact review is not proof of no compromise — it is absence of observed evidence. Document the hunt scope:
- Which logs were available and for what time range
- Which artifacts were checked and what was found
- Explicit log retention gaps (e.g., "access logs retained for 7 days; exposure window was 14 days — first 7 days cannot be reviewed")
Log retention gaps are themselves a finding for the report. BOD 26-04 compliance requires demonstrable hunt capability, not just intent.
Sources
- CISA Known Exploited Vulnerabilities catalog — CISA (2026-10-20)
- CISA adds six known exploited vulnerabilities — CISA (2026-10-20)
- Binding Operational Directive 26-04 — CISA (2026-09-15)