A (busy) day in the life of a SysAdmin: PHP2Shell hinter den Kulissen
Am Mittwoch, 21. Oktober, wurden Details zu zwei kritischen Sicherheitslücken in PHP veröffentlicht. In den darauffolgenden Tagen erschienen zahlreiche Blogposts zur technischen Seite: Erklärungen, was genau passiert ist, wie die Lücken ausgenutzt werden können, welche Versionen betroffen sind etc. Aber wie hat es an diesem Mittwoch hinter den Kulissen ausgesehen? In diesem Beitrag erfährst du, wie wir diesen Tag im Team erlebt haben.
Die Vorboten
Dass etwas im Busch ist, haben wir bereits am Dienstag über verschiedene Kanäle erfahren, und uns im Team darüber ausgetauscht. Das Ausmass war noch unbekannt, und Sicherheitsupdates sowie die entsprechenden Prozesse gehören zu unserem Alltag, sodass wir uns keine grossen Sorgen machten.
Im Verlauf des folgenden Tages wurden laufend weitere Details bekannt, und wir erhielten mehr und mehr Anfragen besorgter Kundinnen und Kunden. Nach ersten Analysen haben wir um 11:00 Uhr auf unserer Statusseite eine Meldung erfasst, und das ganze Team für die weitere Bearbeitung von ihren sonstigen Arbeiten abgezogen. Während der Recherche zum Sammeln aller zu dem Zeitpunkt verfügbaren Informationen haben wir zur Sicherheit noch einigermassen in Ruhe gemeinsam zu Mittag gegessen – wer weiss, wie lange der Tag noch wird 😬.
Isolation von Managed Applications und Bündeln der Kräfte
Nach weiteren Recherchen, viel gemeinsamer Diskussion und sorgfältigem Abwägen haben wir nach dem Mittagessen entschieden, dass wir unsere eigenen, auf PHP basierenden Managed Applications – darunter auch unsere Cloud-Lösung Nextcloud mit zahlreichen privaten Daten – vorerst zur Sicherheit komplett isolieren.
Langsam aber sicher lief das Telefon heiss, und auch unser Postfach füllte sich mit Anfragen besorgter Kundinnen und Kunden. Zeit für Divide and Conquer: Dank unserer auch im normalen Alltag rollenbasierten Arbeitsweise waren die Aufgaben schnell verteilt. Martin behielt als GL-Vertreter die Übersicht über die laufenden Entwicklungen, Markus und Marco konnten sich ganz aufs Technische konzentrieren, und Mario übernahm ab sofort alle Kommunikation nach aussen: Anfragen per Mail und Telefon beantworten, sowie laufend unsere Statusmeldung aktualisieren.
Mario als geübter (Feuerwehr‑)Krisenmanager hatte in Windeseile die dafür nötigen Textbausteine erstellt. So konnte er dank effizienter Kommunikation neben der reinen Information zum aktuellen Stand auch aktiv Unterstützung leisten für unsere Managed Server Kundinnen und -Kunden, die den Zugriff auf ihre PHP-basierten Applikationen deaktivieren wollten. Dank unseres Self-Service-Portals Cockpit sind solche Konfigurationsanpassungen grundsätzlich via Firewall-Regeln ohne unser Zutun möglich. Viele Kundinnen und Kunden waren jedoch froh, dass wir sie bei dieser nicht alltäglichen Anpassung und Kontrolle beraten und unterstützen konnten und, wo nötig, für sie den Webserver-Dienst komplett gestoppt haben.
Im Verlauf des früheren Nachmittags hatte es die Sicherheitslücke bereits in die Mainstream-Onlinemedien geschafft, was zu einer neuen Welle an Kundenanfragen führte – teils in Unkenntnis unserer Status-Seite, auf der die aktuellen Massnahmen jederzeit einsehbar waren, teils aber auch, um eine durch uns vorgenommene und garantiert wirksame Server-Abschaltung zu erbitten.
Um ca. 15:00 prangte auf unserer Homepage eine hastig und hässlich zusammengezimmerte rote Warnmeldung mit Link auf unsere Statusseite. Sorry an unser Design-Team! Zu unserer Verteidigung, es war ein klarer Fall von function over form 🤷🏻. Das restliche Team hat sich derweil weiter mit allen zu diesem Zeitpunkt möglichen Abwehrmassnahmen beschäftigt, und deren Umsetzung für unsere diversen Serverversionen vorbereitet.
Patch Release & Roll-out – we're back online!
Nachdem die PHP Foundation um 15:50 Uhr Updates für sämtliche unterstützten PHP‑Versionen veröffentlicht hat, haben wir sofort die Buildprozesse dafür gestartet.
Für eine hohe Flexibilität und den Betrieb von mehreren PHP‑Versionen auf demselben Server kompilieren wir unsere PHP‑Pakete seit Langem selbst. Nachdem temporäre Probleme aufgrund einer Überlastung im PHP‑Extension-Repository umgangen werden konnten, standen die neuen Pakete dadurch schnell für alle Kundinnen und Kunden zur Verfügung. So gingen bereits rund eine Stunde nach dem offiziellen Patch-Release die ersten unserer Managed Applications wieder online, und unsere Kundinnen und Kunden konnten ihre Server wieder in Betrieb nehmen.
Um 18:35 Uhr waren die aktualisierten PHP‑Pakete auf allen Servern der Versionen 10, 9 sowie 8 (trotz End-of-Life) fertig verteilt: Obwohl unsere Managed-Server-Version 8, basierend auf Debian 11, Ende August ihr Laufzeitende erreicht hat, konnten wir aufgrund unserer eigenen PHP‑Builds ausnahmsweise auch noch für diese Version aktualisierte Pakete bereitstellen.
Für ältere Managed Server und PHP-Versionen ohne Sicherheitsupdates haben wir inzwischen die vom NCSC empfohlenen Massnahmen mit angepassten PHP-Einstellungen und dem Deaktivieren von Multipart-Anfragen umgesetzt und ausgerollt.
Und weil nur ein satter SysAdmin ein guter SysAdmin sein kann, hat Martin eine Runde Pizza bestellt, bevor noch weitere Abschluss- und Aufräumarbeiten anstanden. Bis ca. halb zwölf brannte im Büro noch Licht; einzelne mussten etwas früher los, um mit dem ÖV überhaupt noch nach Hause zu kommen. Aber dank guter Netzabdeckung haben auch diese Teammitglieder im Zug sitzend weiter mitgeholfen, die restlichen offline genommenen Server wieder anzuschalten.
Damit war dann auch das letzte noch offene ToDo eines turbulenten Tages erledigt, und unsere SysAdmins konnten sich doch noch in den mehr als wohlverdienten Feierabend verabschieden.
Fazit und Learnings ...
Wir sind froh, sind wir dieses Mal "nur" mit einem blauen Auge (stressiger Arbeitstag, Disruption of Service) statt einer kritischen Verletzung davongekommen. Unsere Prozesse haben ausgezeichnet funktioniert. Wir waren so gut wie möglich informiert und hatten die personellen Kapazitäten und das nötige Know-how, um zum richtigen Zeitpunkt die richtigen Massnahmen umzusetzen.
Trotzdem – oder eher weil – der grundsätzliche Ablauf für alle klar war und sich bewährt hat, konnten wir noch die ein oder andere Verbesserungsmöglichkeit identifizieren, die wir als umzusetzende Tickets aufgenommen haben. Zum Beispiel möchten wir gerne künftig den Link auf unsere Statusmeldung in einem gut sichtbaren Banner auf unserer Website platzieren können – eine etwas elegantere Lösung, statt einfach auf unserer Homepage einen fetten roten Text aufzuschalten, aber hey, (potentially) desperate times, desperate measures und so.
Insbesondere gefreut hat uns alle die gegenseitige Unterstützung im gesamten Team, welche hervorragend funktioniert hat. We made ourselves happy 💪🏻🥰.
Dem Ganzen etwas Gutes abgewinnen können auch diejenigen unserer Kundinnen und Kunden, die dank diesem Vorfall einmal mehr glasklar belegen können, wieso eine kontinuierliche Pflege und Wartung von Software unerlässlich ist. End-of-Life Daten sind keine sanften Vorschläge, sondern ernstgemeinte Deadlines für nötige Migrationen, und dieser Vorfall hat das einmal mehr allen vor Augen geführt.
Und besser ist das, denn leider ist damit zu rechnen, dass solche Situationen zukünftig häufiger, schneller und unerwarteter vorkommen. Wir werden die Zeit bis zur nächsten Lücke zur Vorbereitung nutzen, sodass wir hoffentlich auch beim nächsten Vorkommnis wieder entsprechend rasch reagieren können.
... und ein spezieller Dank aus den Ferien
Ein grosses Dankeschön geht an alle Kundinnen und Kunden für ihr Verständnis und ihre Geduld. Der Tenor der Rückmeldungen war durchgehend: Lieber nicht erreichbare als kompromittierte Applikationen. Das sehen wir genau so. Trotzdem nicht selbstverständlich, dass die Nachsicht mit den damit verbundenen Unannehmlichkeiten so gross war.
Und, natürlich, ein riesengrosses Danke von Andri an alle Teamkollegen und -kollegin, die diese Situation so vorbildlich gemeistert haben. Denn er selbst hat das Ganze zwar wohl mitbekommen, und wurde auch für 2–3 kurze Telefonate beigezogen, aber hatte seine Füsse am 21. Oktober nicht unter dem Schreibtisch, sondern im Pool. Und trotzdem ist nichts in Flammen aufgegangen 🙌🏻.
Das allein ist bemerkenswert, und hätte den Andri von 2016, der sich soeben als 1-Mann-Betrieb in die Selbständigkeit gewagt hat, wohl ziemlich ins Schwitzen gebracht. Aber wir sind keine 1-Mann-Bude mehr, und Andri ist schon lange nicht mehr allein verantwortlich to hold down the fort – auch das etwas, das am 21. Oktober unabsichtlich stressgetestet und für gut befunden wurde. Jetzt hoffen wir, dass weitere Stresstests entweder etwas auf sich warten lassen, oder aber wenigstens gnädig ablaufen mögen. Und wenn nicht, jäno. Wir sind ja jetzt viele 💪🏻.


