Shop gehackt: Zuerst sichern, nicht aufräumen
Wenn ein Shopware-Shop gehackt wurde, kommt zuerst die Sicherung, nicht das Aufräumen: Shop in den Wartungsmodus nehmen oder beim Hoster vom Netz, Dateien und Datenbank als Kopie sichern, Server- und Zugriffsprotokolle sichern, Verwaltungszugänge sperren. Erst dann wird analysiert. Der naheliegende Impuls — auffällige Dateien löschen, das Admin-Passwort ändern und weiterverkaufen — zerstört Spuren und schließt die Tür nicht. Die Hintertür liegt fast nie dort, wo die erste auffällige Datei liegt.
In einem Shopware-6-Shop suchen wir dort, wo Angreifer sich einrichten: zusätzliche Benutzer unter Einstellungen → System → Benutzer, fremde Integrationen mit Admin-API-Zugriff unter Einstellungen → System → Integrationen, geänderte Twig-Templates und JavaScript-Dateien im Theme und in den Erweiterungen unter custom/plugins und custom/apps, eingeschleustes HTML in Erlebniswelten und Textbausteinen, unbekannte Dateien unter public/ und geplante Aufgaben auf dem Server. Core und Erweiterungen vergleichen wir mit den Originalquellen aus Composer und Store. So wird sichtbar, was hinzugefügt oder verändert wurde, und aus den Zugriffsprotokollen ergibt sich, wann und über welchen Weg.
Ein Skimmer im Checkout ist der ernsteste Fall, weil er Daten abgreift, während der Shop normal weiterverkauft. Er sitzt meist als nachgeladenes Skript in einem Template oder einer Erweiterung und liest mit, was Kunden in Formulare tippen. Leitet Ihr Checkout zum Zahlungsanbieter weiter, sinkt das Risiko für Kartendaten — für Adressen, Kundenkonten und Bestellungen sinkt es nicht. Informieren Sie Ihren Zahlungsanbieter, sobald Zahlungsseiten manipuliert sein könnten. Waren personenbezogene Daten erreichbar, verlangt Artikel 33 DSGVO eine Meldung an die zuständige Aufsichtsbehörde binnen 72 Stunden. Die technischen Fakten dafür liefern wir, ob gemeldet wird, entscheiden Sie mit Ihrem Datenschutzbeauftragten.
Sauber wiederherstellen und die Lücke schließen
Der sauberste Weg zurück ist ein Backup von vor dem Einbruch, ergänzt um alle Sicherheitsupdates, die seitdem erschienen sind. Bestellungen und Kundenkonten, die seit dem Backup entstanden sind, gleichen wir ab und übernehmen sie geprüft. Gibt es kein verlässliches Backup, setzen wir Shopware und die Erweiterungen aus den Originalquellen neu auf und übernehmen aus der befallenen Installation nur, was sich prüfen lässt: Datenbankinhalte, Medien und eigene Plugins nach Durchsicht des Codes.
Danach werden alle Zugangsdaten getauscht, ohne Ausnahme: Administratoren, Integrationen und API-Schlüssel, Datenbank, SFTP und SSH, Zahlungs- und Versanddienste, Mailversand. Ein Schlüssel, den der Angreifer kennt, macht die beste Wiederherstellung wertlos. Dann wird die Ursache geschlossen — meist ein Shopware-Stand ohne Sicherheitsupdates oder eine veraltete Erweiterung — und der Shop gehärtet: ein zweiter Faktor vor der Administration, Verwaltung nur aus bekannten Netzen, auf Wunsch eine vorgelagerte Firewall mit Cloudflare, deren Regeln Zahlungsanbieter und Warenwirtschaft nicht aussperren.
Shopware veröffentlicht Sicherheitshinweise zu seinen Versionen, und der Patch gegen eine ausgenutzte Lücke ist fast immer schon verfügbar, wenn der Einbruch passiert. Die unbequeme Erkenntnis aus solchen Fällen: Sicherheitsupdates in festen Intervallen hätten den Vorfall meist verhindert, zu einem Bruchteil dessen, was Analyse und Neuaufbau kosten. Hundertprozentige Sicherheit versprechen wir nicht. Was wir herstellen, ist ein Zustand, in dem Massenangriffe ins Leere laufen und ein Vorfall ein Vorfall bleibt.
Shop defekt: Fehler 500, weiße Seite, leere Administration
Ein Fehler 500 (HTTP 500, „Internal Server Error“) im Checkout eines Shopware-6-Shops hat fast immer eine von drei Ursachen: Cache, Indexierung oder ein Plugin. Die Reihenfolge zur Selbsthilfe: 1. Logdateien unter var/log/ lesen. 2. bin/console cache:clear, cache:clear:http und cache:warmup. 3. bin/console dal:refresh:index, wenn neue Produkte nicht erscheinen. 4. bin/console plugin:deactivate, danach erneut cache:clear. Meldungen wie „Unable to generate a URL for the named route“ deuten auf Cache oder Routing. Ein Fehler aus dem Suchindex, also aus Elasticsearch beziehungsweise OpenSearch, beim Aufruf einer Kategorie deutet auf den Index, dann hilft bin/console es:index. „Class not found“ oder eine weiße Seite deuten auf ein Plugin. Wer das durchhat und weiter im Dunkeln steht, braucht jemanden mit Shell-Zugang.
Nach einem Update ist der häufigste Defekt eine Erweiterung, die nicht mehr zur neuen Version passt. Shopware 6.7 war ein Infrastruktur-Release mit harten Breaking Changes: Das Administration-Buildsystem wechselte von Webpack auf Vite, das State-Management von Vuex auf Pinia, die Cached*Route-Klassen entfielen, Header und Footer laden per ESI. Erweiterungen und eigene Templates, die darauf aufsetzen, brechen still — die Administration bleibt leer, der Checkout wirft Fehler. Wir prüfen Plugin- und Template-Stand gegen die Zielversion, bevor ein Update produktiv geht, und fahren Updates über die Kommandozeile statt über den grafischen Updater.
Im Störungsfall arbeitet Sharpness rückwärts vom letzten funktionierenden Zustand: Was wurde zuletzt deployed, welches Plugin wurde installiert, welcher Composer-Stand liegt vor. Reproduziert wird auf einem Staging-System, nicht im Live-Shop. Erst wenn die Ursache benannt ist, wird gefixt. Ein Rollback ist eine Entscheidung, keine Panikreaktion. Wer Updates ausschließlich über die grafische Oberfläche fährt und kein Staging hat, hat auch keinen Rückweg. Diese Lücke schließen wir zuerst, weil sie den nächsten Notfall billiger macht als den aktuellen.
Probleme im laufenden Betrieb: langsam, falsche Bestände, Shopware 5
Ein langsamer Shopware-Shop hat meist eine Ursachenkette, keinen einzelnen Schuldigen, und sie lässt sich in fester Reihenfolge abarbeiten. Zuerst: Läuft die Instanz noch im Development-Modus? Dann schreibt Shopware bei jedem Request Debug-Logs und kompiliert Templates neu. Allein die Umstellung auf den Production-Modus bringt in der Regel den größten Einzelsprung; wie groß, sagen wir erst nach der Messung. Zweitens: Ist der HTTP-Cache über SHOPWARE_HTTP_CACHE_ENABLED=1 überhaupt aktiv? Drittens: Wie viele Plugins hängen im Request-Pfad, und was machen sie dort? Erst danach lohnt das Gespräch über Redis, Valkey oder OpenSearch.
Meldet das ERP andere Bestände als der Shop, liegt das fast nie an Shopware selbst. Seit Shopware 6.6 ist der Bestand ein Echtzeitwert: product.stock wird über die Bestell-Events fortgeschrieben, der frühere „verfügbare Bestand“ ist nur noch ein schreibgeschützter Spiegel desselben Feldes. Abweichungen sind deshalb fast immer ein Synchronisations- oder Reservierungsproblem: Welches System schreibt zuletzt, werden Reservierungen doppelt gezählt, bricht der Import mitten im Lauf ab? Das klären wir an der Schnittstelle, nicht im Index.
Läuft der Shop noch auf Shopware 5, ist das kein akuter Defekt, aber ein offenes Risiko: Shopware 5 ist seit Ende Juli 2024 aus der Herstellerwartung, und jede neue Lücke bleibt offen, solange Sie keine Patches über safefive beziehen — den kostenpflichtigen Drittanbieter-Dienst, der die Pflege übernommen hat. safefive verschiebt den Migrationstermin, es ersetzt ihn nicht. Eine Migration auf Shopware 6 ist kein Update, sondern ein Neuaufbau mit Datenübernahme. Wie wir Shops neu bauen, steht auf einer eigenen Seite.
Fremde Shops übernehmen: erst prüfen, dann zusagen
Sharpness übernimmt bestehende Shopware-Shops, aber nicht blind. Am Anfang steht eine Bestandsaufnahme: Shopware-Version und Patch-Stand, Composer- und Plugin-Liste mit Herkunft, Umfang des eigenen Codes, Zustand des Hostings, vorhandene Deployment-Wege, Backups und ihre Wiederherstellbarkeit. Daraus wird ein Befundbericht mit Risikoliste und Aufwandsschätzung, ein abgegrenztes Erstprodukt, kein Vertriebsgespräch. Erst danach sagen wir zu, was wir übernehmen können. Eine Zusage vor dem Blick in den Code wäre geraten, und Raten ist bei fremdem Code keine Methode.
Nach dem Befundbericht gibt es zwei Wege der Zusammenarbeit mit Sharpness. Entweder Sie beauftragen einzelne Arbeiten — ein Fehlerbild, ein Update, eine Bereinigung — und wir rechnen nach Aufwand ab. Oder wir vereinbaren einen Wartungsvertrag mit einer SLA, in der Reaktionszeiten, Erreichbarkeit und Leistungsumfang schriftlich stehen. Der Unterschied zum Support des Herstellers: Shopware unterstützt sein eigenes Produkt, nicht Ihre Drittanbieter-Plugins und nicht Ihren individuellen Code. Genau dort sitzen die Fehler und Lücken, die uns am häufigsten erreichen. Unter der Marke Sharpness entwickeln wir seit 1999 in Oldenburg, Vertragspartnerin ist die Sharpness Solutions GmbH.