~/blog/running-end-of-life-drupal-beside-current-drupalPOSTED
von Shady Nathan Tawfik · 11. Juli 2026 · 3 min

Die Legacy-Instanz neben der modernen ist die eigentliche Landschaft

Eine Organisation betrieb zwei Generationen einer Content-Plattform gleichzeitig. Die moderne war aktuell; die Legacy-Instanz definierte das Risiko, einschliesslich einer Client-Bibliothek jenseits des Supports.

Interaktiv[blog-2.0]

TL;DR: Zwei Generationen einer Plattform auf einer Domain: die moderne war aktuell, die Legacy-Instanz definierte das Risiko, und der Parent-Cookie-Scope verband beide. Ich zeige, wie ich beide Landschaften kartiert habe und wie man das Archiv abschaltet.

Ausgangslage

Ich habe das Ziel als Black-Box geprüft: keine Zugangsdaten, nur die öffentlich sichtbare Fläche. Das ist, was ich sah, bevor ich etwas angefasst habe.

Eine Community- und Veranstaltungsplattform mit aktuellem Content-Management-System auf der Hauptdomain und einer Legacy-Installation desselben Plattformsystems für einen archivierten Bereich auf einer Subdomain, davor ein Caching-Layer. Geprüft wurden beide Landschaften, der gemeinsame Cookie-Scope, Client-Bibliotheksversionen und Subdomain-Freigabe.

Ich habe alle identifizierenden Informationen entfernt. Das Ziel wird ausschließlich nach Branche und Technologieklasse beschrieben, damit das Muster übertragbar bleibt.

Das Muster

Das Muster, das ich erkannt habe — und das ich in ähnlichen Landschaften immer wieder finde:

Nebeneinander laufende Generationen sind normal, und dort wird technische Schulde zur Angriffsfläche. Wenn eine aktuelle Plattform die Seite bedient und eine Legacy-Plattform ein Archiv, sind beide erreichbar, teilen eine Domain und erhalten Anfragen desselben Publikums. Die Legacy-Instanz hat keine Betreuer, keinen Patch-Takt und eine kleinere Nutzerbasis, die einen Einbruch bemerkt.

Zwei Verstärker: erstens der Cache, der alte Plattformen vor einer oberflächlichen Prüfung verbirgt, sodass die Landschaft für alle aktuell aussieht. Zweitens der Cookie-Scope, denn ein Cookie auf der Elterndomain wird an jeden Host darunter gesendet.

Der dritte Verstärker ist die Client-Bibliothek. Lange tote Plattformen liefern tote Bibliotheken, die andere Seiten weiter nutzen. Eine ungepflegte Installation ist daher auch ein Supply-Chain-Problem.

TL;DR: Eine Organisation betrieb zwei Generationen einer Content-Plattform gleichzeitig. Die moderne war aktuell; die Legacy-Instanz definierte das Risiko, einschliesslich einer Client-Bibliothek jenseits des Supports.

Befunde

SchweregradBefundNachweis
HOCHLegacy-Plattform weiterhin auf einer Subdomain ausgeliefertArchivbereich auf einer Version jenseits des Supports
HOCHClient-Bibliotheksversion jenseits des SupportsBetrifft Drittseiten, die die Abhängigkeit nicht gewählt haben
MITTELCookie-Scope über beide Plattformen geteiltSitzung vom Legacy-Host gilt auf dem modernen Host
MITTELCaching-Layer verbirgt die Legacy-PlattformLandschaft wirkt auf automatisierte Prüfungen aktuell
NIEDRIGEnumerierte Subdomains mit unterschiedlichen StacksMehrere Technologien auf einer Domain
NIEDRIGAdministrative Pfade auf beiden Landschaften erreichbarGleichmäßige Angriffsfläche statt eines gehärteten Punkts

Der Angriffspfad

hidesShared parent domainCurrent platformLegacy platform subdomainCookie sent to every hostSession cookie obtained on legacy hostPresented to current platformCaching layer

Reproduktion im Labor

Jeder Befehl unten zielt auf einen Lab-Container, den ich selbst kontrolliere. Nichts davon ist auf ein laufendes System gerichtet.

Die Generationen in der eigenen Landschaft kartieren

~/code/bash bash
# was antwortet wo, einschliesslich Archivbereichen
$ for h in example.org www.example.org archive.example.org old.example.org legacy.example.org; do
    printf '%-28s %s  %s\n' "$h" \
      "$(curl -so /dev/null -w '%{http_code}' https://$h/)" \
      "$(curl -sI https://$h/ | grep -i '^x-powered-by\|^x-generator\|^server:' | head -1 | tr -d '\r')"
done

# wird das Eltern-Cookie geteilt
$ curl -sI https://example.org/ | grep -i '^set-cookie'

Erkennung in eigener Infrastruktur

Prüfen, welche eigenen Client-Bibliotheken das Supportende erreicht haben

~/code/bash bash
$ npm outdated --json 2>/dev/null | python3 -c '
import json,sys
d = json.load(sys.stdin)
for name, info in d.items():
    cur, want = info.get("current"), info.get("wanted")
    print(f"{name}: {cur} -> {want}")' | head -30

# und jeden Host auflisten, den Sie wirklich besitzen
$ for h in $(cat hosts.txt); do
    printf '%s %s\n' "$h" "$(dig +short "$h" | tr '\n' ' ')"
done

Behebung

Das Sitzungs-Cookie auf den Host einschränken, der es braucht

~/code/nginx nginx
# kein Sitzungs-Cookie für die gesamte Landschaft
proxy_cookie_path / /;
proxy_cookie_domain example.org ~^([a-z0-9-]+\.)?example\.org$ localhost;

# besser: Host-only setzen, indem kein Domain-Attribut gesetzt wird
add_header Set-Cookie "sessionid=; Path=/; Secure; HttpOnly; SameSite=Lax" always;

Sobald ein Angreifer Zugriff hat, kann er folgende Aktionen durchführen:

Legacy-Plattform weiterhin auf einer Subdomain ausgeliefert
Client-Bibliotheksversion jenseits des Supports
Cookie-Scope über beide Plattformen geteilt
Caching-Layer verbirgt die Legacy-Plattform

Fazit — was ich daraus mitnehme

  • Zwei Generationen auf einer Domain bedeuten zwei Angriffsflächen und einen Cookie-Scope.
  • Ein Cache, der eine alte Plattform verbirgt, verbirgt sie auch vor Ihren eigenen Audits.
  • Eine ungepflegte Plattform ist ein Abhängigkeitsproblem für Dritte, nicht nur Ihres.
  • Ziehen Sie das Archiv per Redirect zurück; jedes laufende Jahr ist ein Jahr Exposition.

Nur zu Bildungszwecken. Alle reproduzierbaren Befehle zielen auf meine eigene Lab-Umgebung (localhost), nie auf ein laufendes System. © 2026