What could possibly go wrong? Security in Magento Shops
Magento Audit - anonymisiert (German)
1. Analyse anonymized.at von integer_net GmbH Seite 1
Analyse des Magento-Shops
www.anonymized.at
Version: 1.0
Datum: 21.12.2015
Adressat: Harald Meier, ANONYMIZED GmbH
Autor: Andreas von Studnitz, Geschäftsführer
Diplom-Informatiker
Magento Certified Developer
Magento Certified Solution Specialist
2. Analyse anonymized.at von integer_net GmbH Seite 2
Inhalt
1 Funktionsumfang des Shops .................................................................................................................. 3
1.1 Magento-System .............................................................................................................................. 3
1.2 Integrierte Module ........................................................................................................................... 3
1.3 Individuelle Module.......................................................................................................................... 6
1.4 Einschätzung..................................................................................................................................... 7
2 Analyseergebnisse.................................................................................................................................. 8
2.1 Sicherheit.......................................................................................................................................... 8
2.1.1 Server ................................................................................................................................................ 8
2.1.2 Basissystem ....................................................................................................................................... 8
2.1.3 Eingesetzte Module........................................................................................................................... 8
2.2 Qualität............................................................................................................................................. 8
2.2.1 Konfiguration..................................................................................................................................... 8
2.2.2 Layout und Template ........................................................................................................................ 8
2.2.3 Fremdmodule.................................................................................................................................. 10
2.2.4 Individuelle Module ........................................................................................................................ 10
2.2.5 Skripte im Hauptverzeichnis............................................................................................................ 10
2.3 Updatefähigkeit.............................................................................................................................. 11
2.3.1 Überschriebene Kerndateien .......................................................................................................... 11
2.3.2 Dateien in app/code/local/Mage/ .................................................................................................. 11
2.3.3 Rewrites .......................................................................................................................................... 11
2.3.4 Struktur der Template-Dateien....................................................................................................... 11
2.3.5 Struktur der Layout-XML-Dateien ................................................................................................... 12
3 Fazit und Handlungsempfehlung ......................................................................................................... 13
3.1 Gesamtzustand und aktuelle Probleme ......................................................................................... 13
3.2 Empfehlungen ................................................................................................................................ 13
3. Analyse anonymized.at von integer_net GmbH Seite 3
1 Funktionsumfang des Shops
1.1 Magento-System
Der Shop beruht auf der Magento Enterprise Edition 1.14.0.1, veröffentlicht 15.05.2014. Aktuell ist Version
1.14.2.2, veröffentlicht 27.10.2015.
1.2 Integrierte Module
Die folgenden Fremdmodule sind im Shop integriert:
Aijko_WidgetImageChooser
Ermöglicht das Einbinden von Bildern und Grafiken in Widgets
Qualität: gut
Umfang: gering
Anaraky_Gdrt
Google Remarketing Tags
Qualität: in Ordnung
Umfang gering
Aoe_Scheduler
Deaktiviert
Atwix_CustomCategoryAttribute
Legt ein Kategorieattribut an
Umfang: sehr gering
Modul überflüssig
AvS_FastSimpleImport
Basismodul für verschiedene Importe
Qualität: gut
Umfang: groß
Buric_Apc
Cache-Säuberungsfunktion für APC-Cache
Qualität: gut
Umfang: gering
Ebizmarts_Abandonedcart
Versand von Emails bei bestimmten Auslösern
Qualität: in Ordnung
Umfang: groß
Ebizmarts_Autoresponder
Versand von Emails bei bestimmten Auslösern
Qualität: in Ordnung
Umfang: sehr groß
Ebizmarts_MageMonkey
MailChimp-Integration (Newsletter)
Qualität: gut
Umfang: groß
Ebizmarts_Mandrill
Mandrill-Integration (Newsletter)
Qualität: gut
Umfang: mittel
Fooman_EmailAttachments
Hängt PDFs an Bestell- und Rechnungsemails an
Qualität: gut:
Umfang: mittel
4. Analyse anonymized.at von integer_net GmbH Seite 4
Fooman_GoogleAnalyticsPlus
deaktiviert
Magefast_FileTypesWYSIWYG
Einbindung von hochgeladenen Dokumenten im Wysiwyg-Editor
Qualität: gut
Umfang: gering
Mediarocks_NewsletterExtended
Erweiterte Newsletter-Registrierung (z.B. neue Felder)
Qualität: in Ordnung
Umfang: mittel
Netresearch_Ops
Zahlungsmodul Ogone
Qualität: gut
Umfang: groß
Nostress_Nscexport
Export von Produkt-Feeds für Preissuchmaschinen
Qualität: in Ordnung
Umfang: sehr groß
Paymentnetwork_Pnsofortueberweisung
Zahlungsart Sofortüberweisung
Qualität: gut
Umfang: mittel
Vaimo_Klarna
Zahlungsart Klarna
Qualität: gut
Umfang: mittel
Vinagento_Vpager
deaktiviert
WP_CustomMenu
Individuelles Hauptmenü
Qualität: mäßig
Umfang: mittel
Xonu_FGP
Fixierte Bruttopreise unabhängig vom Steuersatz
Qualität: gut
Umfang: gering
Amasty_Customerattr
deaktiviert
Amasty_File
Dateianhänge zu Produkten
Qualität: in Ordnung
Umfang: mittel
Amasty_Ogrid
Optimierte Bestellungen-Tabelle im Backend
Qualität: in Ordnung
Umfang: mittel
Amasty_Pgrid
Optimierte Produkte-Tabelle im Backend
Qualität: in Ordnung
Umfang: mittel
5. Analyse anonymized.at von integer_net GmbH Seite 5
Andavis_Mapy
Erweiterte Produkt-API
Qualität: mäßig
Umfang; gering
Anowave_Ec
Google Tag Manager
Qualität: in Ordnung
Umfang: mittel
Conlabz_Useroptin
Email-Bestätigung nach Benutzerregistrierung
Qualität: in Ordnung
Umfang: gering
Anonymized_*
Individuelle Module, siehe unten
GoMage_Navigation
Optimierte Filterfunktion
Qualität: in Ordnung
Umfang: groß
Mana_Ajax
deaktiviert
Mana_Db
Unklare Indizierungs-Funktionalität
Qualität: mäßig
Umfang: mittel
Mana_Filters
Optimierte Filterfunktionalität
Qualität: mäßig
Umfang: groß
Mana_Seo
deaktiviert
ManaPro_Filter*
deaktiviert
Mango_Categoryattributes
Verwaltung von Kategorieattributen
Qualität: mäßig
Umfang: mittel
Mango_Categorytabs
Verwaltung von Kategorieattributgruppen
Qualität: mäßig
Umfang: mittel
Mirasvit_*
Verschiedene Module für Caching, Suche (Sphinx) und Seo
Qualität: in Ordnung
Umfang: sehr groß
Mstage_*
Individuelle Module, siehe unten
Rup_Voucheractivate
Individuelles Modul, siehe unten
6. Analyse anonymized.at von integer_net GmbH Seite 6
1.3 Individuelle Module
Die speziell für den Anonymized-Shop entwickelten Module befinden sich in den Namespaces „Anonymized“,
„Mstage“ und „Rup“. Die hierin enthaltenen Anpassungen sind im Verhältnis zu den Anpassungen aus externen
Modulen relativ gering. Hervorzuheben ist hier die Funktion zum Anzeigen von konfigurierbaren Produkten
innerhalb von gruppierten Produkten (Modul „Anonymized_GroupedConfigurable) und die Import- und Export-
funktionen („Anonymized_OmImport“ und „Anonymized_OmExport“). Im Detail:
Anonymized_AjaxCart
deaktiviert
Anonymized_Cache
ohne Funktion
Anonymized_Catalog
Standardeinstellung für Kategorien und kleinere Anpassungen
Anonymized_Checkout
Anpassung Anzahl Crossselling-Produkte und Funktion zur Lieferzeitdarstellung
Anonymized_Common
Automatisierte Konfiguration, viele kleine Anpassungen für Gutscheine, SAP etc.
Anonymized_Contacts
Anpassungen Kontaktformular
Anonymized_GroupedConfigurable
Darstellung von konfigurierbaren Produkten innerhalb von gruppierten Produkten
Anonymized_IndexUpdater
ohne sichtbare Funktion
Anonymized_Mapy
Anpassung API-Funktion (URL-Key)
Anonymized_OmExport
Export von Gutscheinen und Guthaben
Anonymized_OmImport
Import von Produktdaten
Anonymized_Slider
Slider als Widget
Anonymized_Topseller
Widgets für Topseller und Neuheiten
Mstage_AddSimple
Unklare Anpassung beim Hinzufügen von Produkten zum Warenkorb
Mstage_Catalog
Standardeinstellung „auf Lager“ für Produkte
Mstage_Customcatattrb
Anlegen eines Kategorieattributes
Mstage_Import
Import von Lagerbestand
Mstage_Optionstyles
Gestaltungsmöglichkeiten per CSS für Filteroptionen
Mstage_UltimateConfigurableProducts
Angepasste Darstellung von konfigurierbaren Produkten
Rup_Voucheractivate
Aktivierung von Gutscheinen bei Bezahlung
7. Analyse anonymized.at von integer_net GmbH Seite 7
Die Qualität der Module ist durchwachsen, bewegt sich aber immer in einem gewissen Rahmen – die meisten
Module haben eine zufriedenstellende, aber nicht herausragende Codequalität.
1.4 Einschätzung
Das Projekt Anonymized ist eindeutig „historisch gewachsen“. Dafür spricht allein die Zahl von 28 deaktivierten,
aber noch im System vorhandenen Modulen, aber auch die große Zahl von 88 externen aktiven Modulen, die
teilweise auch die gleiche Funktionalität abdecken. Positiv ist zu bemerken, dass die Qualität der eingesetzten
Module durchgehend relativ hoch ist und es keine Ausreißer nach unten gibt.
8. Analyse anonymized.at von integer_net GmbH Seite 8
2 Analyseergebnisse
2.1 Sicherheit
2.1.1 Server
Der Server konnte mangels Zugriff nicht geprüft werden. Von außen wurden keine Probleme festgestellt.
2.1.2 Basissystem
Die Magento-Version 1.14.0.1 ist relativ aktuell. Alle relevanten Sicherheitspatches sind eingespielt.
Bei der Analyse auf Core-Hacks ist ein offensichtlich erfolgreicher Hack aus dem Mai 2015 aufgefallen. Über die
vom Angreifer ausgenutzte Sicherheitslücke können wir nur spekulieren – es könnte sowohl ein zu spät einge-
spielter Sicherheitspatch sein, als auch ein geknackter Admin-Account. Auch eine Sicherheitslücke außerhalb
von Magento ist denkbar. Das lässt sich leider nicht mehr nachvollziehen.
Durch geeignete Maßnahmen hätte der Angriff allerdings verhindert (Eingeschränkte Dateirechte für den Web-
User) oder schneller bemerkt (regelmäßige Analyse auf Veränderungen am Core-Code) werden können. Es
wurden bereits erfolgreich Maßnahmen zum Entfernen des Schadcodes durchgeführt.
Ansonsten sind keine relevanten Sicherheitslücken öffentlich bekannt.
2.1.3 Eingesetzte Module
Die Analyse der eingesetzten Module hat keine Schwachstellen ergeben.
2.2 Qualität
2.2.1 Konfiguration
Bei der Konfiguration des Magento-Systems wurde im Großen und Ganzen nicht viel falsch gemacht. Folgende
Punkte sind aufgefallen:
- Die Funktion „Flat Catalog“ für eine schnellere Auslieferung von Produkt- und Kategoriedaten ist deak-
tiviert. Aus Performancegründen sollte sie aktiviert sein.
- Aus Sicherheitsgründen wäre eine abgewandelte Admin-URL sowie die Entfernung / Deaktivierung des
Magento-Connect-Managers wichtig (siehe http://www.integer-net.de/warum-man-keine-module-
ueber-den-magento-connect-manager-installieren-sollte/)
- CSS-Dateien und JS-Dateien sollten zusammengefasst werden, um weniger Requests und damit eine
höhere Performance zu erzielen.
2.2.2 Layout und Template
Template
Das Template besteht in Magento aus einer Mischung aus PHP und HTML in Dateien mit der Endung .phtml.
Dazu kommt die Strukturierung dieser Template-Dateien mit Hilfe von Layout-XML-Dateien.
Schwierig für die Analyse und später auch für die Weiterentwicklung ist die Tatsache, dass sich dutzende Si-
cherheitskopien verschiedener Dateien in den Verzeichnissen befinden. Üblicherweise verwendet man für
diesen Zweck eine Versionsverwaltung wie Git, Mercurial oder SVN. Beispiele:
9. Analyse anonymized.at von integer_net GmbH Seite 9
Die Qualität des Templates ist sehr durchwachsen, tendenziell aber eher schlecht. Positiv ist, dass der Fallback-
Mechanismus von Magento genutzt wird und nur die Dateien in das eigene Theme-Verzeichnis kopiert wurden,
die auch Anpassungen erfahren haben. Alle anderen Dateien bleiben updatefähig.
Für die Layout-XML-Dateien wurde dieses Konzept leider nicht durchgezogen, sodass größere Dateien wie ca-
talog.xml, checkout.xml oder page.xml komplett, mit nur geringen Anpassungen, kopiert sind.
Leider weisen einige Template-Dateien größere Schwächen auf. Die größten Probleme sind:
- Umsetzung kompletter Funktionen in phtml-Dateien. Aufgrund der Trennung von Struktur, Funktion
und Layout sollten diese Funktionen in passenden Blocks bzw. Helpern umgesetzt werden. Beispiele:
o app/design/frontend/anonymized/default/template/catalog/category/view.phtml
o app/design/frontend/anonymized/default/template/amshopby/price.phtml
o app/design/frontend/anonymized/default/template/page/2columns-left.phtml
- Integration langer Javascript-Bereiche direkt im Template statt in separaten Javascript-Dateien:
o app/design/frontend/anonymized/default/template/ec/header.phtml
o app/design/frontend/anonymized/default/template/page/html/overlay.phtml
10. Analyse anonymized.at von integer_net GmbH Seite 10
o app/design/frontend/anonymized/default/template/page/2columns-left.phtml
- Performance-Probleme dadurch, dass innerhalb von Schleifen Produkte oder Kategorien neu geladen
werden, was einfach vermieden werden kann. Beispiele:
o app/design/frontend/anonymized/default/template/catalog/category/list.phtml
o app/design/frontend/anonymized/default/template/catalog/navigation/left.phtml
o app/design/frontend/anonymized/default/template/catalog/product/list/upsell.phtml
o app/design/frontend/anonymized/default/template/catalog/product/list/related.phtml
CSS
Für CSS wird der Präprozessor LESS verwendet, was gegenüber dem Standard-CSS von Magento ein deutlicher
Fortschritt ist und strukturierteres Arbeiten ermöglicht. Die Codequalität ist in Ordnung; leider sind einige
leicht vermeidbare Fehler enthalten.
JavaScript
Der mit jQuery umgesetzte JavaScript-Code ist in Ordnung und immerhin modulweise strukturiert.
HTML
Die Prüfung des HTML-Codes mit dem W3C Validator hat je nach geprüfter Seite zwischen 35 und 211
(http://www.anonymized.at/blendtec-classic-575-hochleistungsstandmixer?va=8486) Fehler gefunden. Hier
handelt es sich größtenteils um Nachlässigkeiten bei der Frontend-Entwicklung – Fehler, die größtenteils mit
geringem Aufwand vermeidbar wären.
2.2.3 Fremdmodule
- Größtenteils vernünftige Qualität
- Sehr (zu) hohe Anzahl
- Updatefähigkeit ungewiss
2.2.4 Individuelle Module
- Größtenteils mäßige bis vernünftige Qualität
- Teilweise unerfahrene(r) Entwickler im Einsatz
2.2.5 Skripte im Hauptverzeichnis
Im Hauptverzeichnis finden sich mehrere PHP-Dateien, die auch von außerhalb per
Browser aufrufbar sind. Auch wenn dies im konkreten Fall kein aktuelles Risiko dar-
stellt, widerspricht dies doch den „Best Practices“. Systemoperationen sollten immer
zumindest per Passwort geschützt sein, damit mögliche Sicherheitslücken oder Opera-
tionen mit hoher Systemlast nicht ausgenutzt werden können.
Kritisch ist in meinen Augen die Datei cron_admin.php. Der Aufruf der URL
http://www.anonymized.at/cron_admin.php führt zu einer Auflistung aller Magento-
Cronjobs. Diese Informationen sollten nicht frei verfügbar im Internet abrufbar sein, da
sich damit Rückschlüsse auf eingesetzte Module und Technologien ziehen lassen.
Die Qualität der Skripte ist durchwachsen – die kleineren Skripte, die nur eine Metho-
de in einem Magento-Model aufrufen (z.B. crontest.php), sind okay, während v.a. das
Skript cronprice.php relativ schlechte Qualität mit direkten SQL-Anweisungen beinhal-
tet.
Die Skripte sollten zumindest in das dafür vorgesehen Verzeichnis „shell/“ verschoben
werden, sodass sie nur noch per Kommandozeile oder per Cronjob, aber nicht mehr im
Browser aufgerufen werden können.
11. Analyse anonymized.at von integer_net GmbH Seite 11
2.3 Updatefähigkeit
2.3.1 Überschriebene Kerndateien
Leider befinden sich mehrere Überschreibungen von Kerndateien im Repository. Hundertprozentig lässt sich
die genaue Zahl der Core-Hacks nicht bestimmen, da nicht alle Patches für uns verfügbar sind und es keinen
eindeutigen Stand zum Vergleich gibt.
Beispiele für überschrieben Kerndateien:
- app/code/core/Mage/Catalog/Model/Layer.php
- app/code/core/Mage/Core/Model/Config.php
- app/code/core/Mage/Sales/Model/Order.php
Dateien, in denen nur Kommentare oder Logging-Aufrufe hinzugefügt sind, habe ich nicht aufgeführt.
Die aufgeführten Dateien sollten kurzfristig analysiert und bereinigt werden, da die Änderungen bei zukünfti-
gen Updates überschrieben werden.
Inwiefern Dateien von gekauften oder kostenlos heruntergeladenen Modulen verändert wurden, lässt sich
momentan leider nicht bestimmen, da nicht alle Original-Module vorliegen. Mit großer Wahrscheinlichkeit
wurden Dateien in externen Modulen angepasst, wodurch sich diese Module nicht mehr gefahrlos aktualisie-
ren lassen (z.B. bei Inkompatibilitäten zu neueren Magento-Versionen). Das Vorhandensein der folgenden
Dateien lässt sehr deutlich darauf schließen:
- app/code/community/Fooman/GoogleAnalyticsPlus/Block/2015-01-30_Ga.php
- app/code/community/Anaraky/Gdrt/Block/_Script.php
Solcherart modifizierte Module lassen sich leider nicht mehr ohne größere Aufwände mit neuen Versionen der
Hersteller aktualisieren.
2.3.2 Dateien in app/code/local/Mage/
Zwei entsprechende Dateien wurden gefunden:
- app/code/local/Mage/Adminhtml/Block/Catalog/Product/Attribute/Edit/Form.php
- app/code/local/Mage/Page/Block/Html/Footer.php
In beiden Fällen wäre eine andere Lösung möglich gewesen. Diese Dateien sollten vor einem Update entfernt
werden und die Änderungen durch andere Lösungen ersetzt werden.
Hintergrund ist, dass es sich hier (neben Core-Hacks) ebenfalls um eine sehr schlechte und wenig updatesichere
Art handelt, Magento-Code zu modifizieren. Mit Rewrites und Event/Observer stehen deutlich bessere Metho-
den zur Verfügung.
2.3.3 Rewrites
Die Anzahl der Rewrites im System ist mit über 60 sehr hoch. Innerhalb dieser Rewrites gibt es drei nicht aufge-
löste Konflikte, wo also mindestens eine Funktionalität jeweils nicht so funktionieren kann wie gedacht. Die
folgenden Klassen werden überschrieben und kommen nicht zum Einsatz:
- Conlabz_Useroptin_Model_Newsletter_Subscriber
- Ebizmarts_MageMonkey_Model_Subscriber
- Mango_Categoryattributes_Block_Adminhtml_Catalog_Category_Tab_Attributes
2.3.4 Struktur der Template-Dateien
Nur angepasste PHTML-Dateien wurden ins Theme-Verzeichnis kopiert – gut. Dennoch befinden sich unter
diesen Dateien mehrere, in denen bei einem Update Anpassungen vorgenommen werden müssen, beispiels-
weise um den mit Magento 1.8 eingeführten Form Key zu unterstützen. Dies lässt sich aber üblicherweise nicht
vermeiden, hier wurde nichts falsch gemacht.
12. Analyse anonymized.at von integer_net GmbH Seite 12
2.3.5 Struktur der Layout-XML-Dateien
Manche Layout-XML-Dateien wurden komplett ins individuelle Theme kopiert und dort angepasst. Das führt
dazu, dass bei einem Update die Dateien erneut abgeglichen werden müssen. Andere Layout-Dateien sind
hingegen nicht betroffen. Hier sind für eine komplett saubere Umsetzung noch Arbeiten notwendig, um die
Anpassungen in eigene Layout-XML-Dateien zu übertragen und nicht die Kerndateien zu verwenden.
13. Analyse anonymized.at von integer_net GmbH Seite 13
3 Fazit und Handlungsempfehlung
3.1 Gesamtzustand und aktuelle Probleme
Der Shop ist eindeutig historisch gewachsen, im positiven wie im negativen Sinn, wobei ein Großteil der Zusatz-
funktionalität aus gekauften bzw. heruntergeladenen Modulen besteht. Nur ein relativ kleiner Teil wurde pro-
jektspezifisch umgesetzt. Die Folge davon ist, dass es momentan eine große Menge an inhomogenem, relativ
schlecht wartbaren Code gibt, der nur bedingt gut miteinander funktioniert.
Ein großes Problem ist zurzeit auch, dass im Shop relativ viel „Müll“ in Form von deaktivierten und nicht (mehr)
verwendeten Modulen existiert, was den Shop unübersichtlich und die Weiterentwicklung aufwändiger und
fehleranfälliger macht. Auch die fehlende Versionsverwaltung bzw. das Vorliegen einer Vielzahl von Sicher-
heitskopien modifizierter Dateien ist negativ für die Übersicht und die Wartbarkeit.
Die Updatefähigkeit auf neuere Magento-Versionen ist derzeit nicht gegeben, da in der bisherigen Betreuung
des Shops einige Fehler (z.B. Core-Hacks) gemacht wurden.
Der Shop ist aktuell lauffähig, behindert jedoch die zukünftige Weiterentwicklung deutlich.
3.2 Empfehlungen
In jedem Fall sollten folgende Maßnahmen kurzfristig durchgeführt werden:
- Umzug des Shops auf einen anderen Server, da wir wegen der Sicherheitsprobleme nicht sicher sein
können, dass der jetzige Server nicht kompromittiert wurde
- Einführung einer Versionsverwaltung
- Entfernung deaktivierter Module und Sicherheitskopien
- Verschieben der Skripte im Hauptverzeichnis in das Verzeichnis „shell/“
Soll der aktuelle Shop in den nächsten Monaten weiter gepflegt werden, empfehlen wir zusätzlich folgende
Maßnahmen:
- Entfernung der Core Hacks an Magento-Kerndateien und Umsetzung als Module
- Entfernung der Dateien in app/code/local/Mage und Umsetzung als Module
- Entfernung der Kopien von Kerndateien in app/design/frontend/anonymized/default/layout und Um-
setzung als eigenständige Layout-XML-Dateien
- Auflösung der Rewrite-Konflikte
- Behebung der größten Probleme im Template
- Weitere Aufräumarbeiten (z.B. Entfernung von Logging-Aufrufen)
- Prüfung, ob Module entfernt werden können
- Umwandung von Inline-JavaScript in JS-Dateien
- Evtl. Einführung einer neuen Projektstruktur mit Trennung von Core-Code und einzelnen Modulen
- Update auf neueste Magento-Version