
Zeek- und Suricata-Erkennungen für „php2shell“ CVE-2026-109618 und CVE-2026-109619
Zeek-Erkennungen und Suricata-Regeln für HTTP-Indikatoren im Zusammenhang mit „php2shell“ CVE-2026-109618 / CVE-2026-109619, potenzielle RCE in der Speicherverwaltung von PHP longjmp(). Die Ergebnisse identifizieren verdächtigen Datenverkehr oder potenziell betroffene Software.
Erfordert Zeek 7.0.0 oder neuer. Installation mit dem Zeek Package Manager:
zkg install https://github.com/corelight/php2shell-detect
Laden Sie installierte Pakete mit @load packages in Ihrer Zeek-Konfiguration.
Für einen direkten Checkout laden Sie /path/to/php2shell-detect/scripts.
Das Paket verwendet die Standard-Zeek-APIs für HTTP, Dateianalyse, Notices und Cluster.
Das Paket untersucht die Längen von POST-Feldnamen, ausgewählte serialisierte Datenstrukturen und wiederholte MIME-Header. Es korreliert außerdem zusammenhängende verdächtige Transaktionen anhand konfigurierter Session-Cookies. Antwort-Header liefern eine separate PHP-Versionsinventur. Der Datenverkehr muss für Zeek's HTTP- Analyzer sichtbar sein; verschlüsseltes HTTP erfordert eine Entschlüsselung vor der Untersuchung.
Alle Notice-Typen befinden sich unter PHP2SHELL:::
| Notice | Beobachtung |
|---|---|
PHP_Crash_Sequence | Zusammenhängende verdächtige HTTP-Transaktionen innerhalb einer Sitzung |
Multipart_Header_Flood | Übermäßige Wiederholung erkannter MIME-Header |
Large_Form_Key | Ungewöhnlich langer URL-kodierter Formularfeldname |
Serialized_Integer_Overflow | Ungewöhnlich großes serialisiertes Integer-Token |
Serialized_Integer_Collisions | Erkanntes serialisiertes Integer-Schlüsselmuster |
Serialized_String_Collisions | Erkanntes serialisiertes String-Schlüsselmuster |
Serialized_Duplicate_Array | Wiederholtes serialisiertes Array-Eintragsmuster |
Serialized_Object_Repetition | Wiederholtes serialisiertes Objektmuster |
Potentially_Affected_PHP_Version | Antwort-Header gibt eine Version innerhalb des konfigurierten betroffenen Bereichs an |
Die Ergebnisse gehen an das Standard-notice.log; das Paket erstellt keinen zusätzlichen Log-
Stream. Das sub-Feld der Notice liefert begrenzten Kontext wie Header-Name,
Transaktionstiefe, Zähler und ein kurzes maskiertes POST-Body-Beispiel. Beispiele sind
standardmäßig auf 64 Rohbytes vor der Maskierung begrenzt; setzen Sie
notice_body_sample_bytes=0, um sie auszulassen. Cookies und ihre Digests werden
nur im Speicher verwendet und von diesem Paket nicht protokolliert.
Standardmäßig kann jeder unterschiedliche Request-Indikator eine Notice pro Transaktion ausgeben.
Wiederholte Treffer desselben Indikators werden unterdrückt. Setzen Sie detect_only_once=T,
um die Body-Untersuchung nach dem ersten Request-Fund in jeder Transaktion zu beenden.
Versionsinventur-Notices sind unabhängig von Request-Funden.
Alle Einstellungen verwenden den Namespace PHP2SHELL:::
| Einstellung | Standard | Wirkung |
|---|---|---|
detect_only_once | F | Meldet jeden unterschiedlichen Request-Indikator; T stoppt nach dem ersten Fund |
max_trans_depth | 3 | Untersucht die ersten drei HTTP-Transaktionen pro Verbindung; 0 bedeutet alle |
inspect_cookies | T | Verwendet Session-Cookies zur Korrelation |
session_cookie_names | {"PHPSESSID"} | Cookie-Namen, die zur Zuordnung von Sitzungen verwendet werden |
correlation_window | 1 min | Maximales Alter des ausstehenden Sitzungskorrelationszustands |
max_pending_sessions | 1000 | Obergrenze für beibehaltene Einträge in jeder Korrelationstabelle |
inspect_post_bodies | T | Untersucht POST-Entity-Daten und MIME-Header |
http_body_analysis_byte_depth | 8388608 | Konservative Obergrenze von 8 MiB für die POST-Body-Untersuchungsarbeit, gemeinsam über MIME-Teile hinweg; 0 deaktiviert die Body-Zustellung |
body_overlap_bytes | 256 | Beibehaltener Überlappungsbereich für Muster, die Body-Chunks überschreiten |
large_form_key_bytes | 65536 | Schwellenwert für Formularnamen in Wire-Bytes |
multipart_header_threshold | 128 | Anzahl wiederholter erkannter MIME-Header, die für einen Fund erforderlich ist |
notice_body_sample_bytes | 64 | Maximale Roh-Body-Bytes pro Notice-Beispiel; 0 lässt Beispiele aus |
detect_affected_php_versions | T | Aktiviert die Versionsinventur über Antwort-Header |
php_version_notice_interval | 1 hr | Unterdrückt Versions-Notices pro Server-IP über Ports und Versionen hinweg |
php_fixed_patch_versions | 8.2: 35, 8.3: 36, 8.4: 27, 8.5: 12 | Vorläufiger erster fester Patch pro Branch |
Zum Beispiel:
redef PHP2SHELL::detect_only_once = T;
redef PHP2SHELL::notice_body_sample_bytes = 0;
redef PHP2SHELL::session_cookie_names += { "custom_session" };
Die POST-Inspektion verwendet Dateianalyse-Chunks mit begrenzter Überlappung, anstatt ganze Bodies zusammenzusetzen. Die Zählung von Formularnamen berücksichtigt Werttrennzeichen und rohe NUL-Terminierung. Nur berechtigte POST-Entitäten erhalten einen Analyzer; Body-Budgets und Transaktionslimits schränken den Erkennungsumfang bewusst ein. Diese Indikatoren sind unvollständig und können auch auf harmlosen Datenverkehr zutreffen.
In einem Zeek-Cluster leiten Worker kleine Sitzungsbeobachtungen mit Cluster::publish_hrw() an Proxies weiter. Beide Stufen für dieselbe Sitzung erreichen denselben Proxy, der sie abgleicht und PHP_Crash_Sequence direkt auslöst. Die Notice behält die Connection-ID, UID und Transaktionstiefe des Follow-ups bei; peer_descr identifiziert den Proxy. Worker behalten für Callbacks keine vollständigen Connection- oder HTTP-Records.
Trigger und nicht zugeordnete Follow-ups laufen nach correlation_window ab, wobei max_pending_sessions jede Tabelle begrenzt. Proxies behalten das erste nicht zugeordnete Follow-up für jeden Sitzungsschlüssel. Ein Trigger schlägt diesen Schlüssel direkt nach, um in umgekehrter Reihenfolge eintreffende Nachrichten zu verarbeiten; spätere nicht zugeordnete Follow-ups für denselben Schlüssel werden zusammengeführt, bis dieser Eintrag zugeordnet wird oder abläuft. Der Abgleich verwendet Beobachtungszeitstempel sowie Client, Server, Server-Port, HTTP-Host und Sitzungs-Digest. Standalone-Zeek korreliert lokal. Normale Proxy-Konnektivität ist erforderlich.
Proxy-Notices verwenden die standardmäßige Notice-Unterdrückung, die nach UID und Transaktionstiefe für correlation_window erfolgt. Dies ist unabhängig von Worker-Funden und stoppt nicht die Body-Inspektion der Worker. Gleichzeitige Übereinstimmungen für unterschiedliche Sitzungs-Cookies auf verschiedenen Proxies können dennoch doppelte Notices erzeugen, bevor sich die Cluster-Unterdrückung durchsetzt.
Die äußeren Antwort-Header Server und X-Powered-By werden geprüft, einschließlich Antworten auf GET. Header-Namen sind case-insensitiv. Die betroffene Untergrenze ist PHP 5.4.0. Die folgenden Grenzwerte gehen davon aus, dass der nächste Patch nach den am 18. Oktober 2026 geprüften neuesten stabilen Releases beide Fehler behebt:
| Branch | Neuestes stabiles Release bei Prüfung | Vorläufig erste korrigierte Version |
|---|---|---|
| 8.2 | 8.2.34 | 8.2.35 |
| 8.3 | 8.3.35 | 8.3.36 |
| 8.4 | 8.4.26 | 8.4.27 |
| 8.5 | 8.5.11 | 8.5.12 |
Konfigurierte korrigierte Versionen und spätere Patches im selben Branch lösen keinen Alarm aus. Branches ohne konfigurierten Grenzwert bleiben Kandidaten. Gängige Hersteller-Suffixe verwenden die zugrunde liegende numerische Version. Banner können fehlen, umgeschrieben sein oder einen Hersteller-Build mit Backports von Fixes widerspiegeln, daher sind dies Inventarhinweise.