Sven Rautenberg: Malware durch file_exists?

Beitrag lesen

Moin!

ich habe in den letzten Tagen das Problem, dass immer wieder schädliche Code in meine Dateien (JavaScript, HTML und PHP) gelangt. Ich weiß allerdings nicht, wo die Lücke liegen kann.

Informiere deinen Hoster und bitte ihn um Mithilfe. Zum einen kennt er seine Server vermutlich besser, hat häufiger mit dem Problem zu tun, und sieht eventuell schneller die Ursache. Andererseits hat er außerdem auch den Blick auf sein Gesamtsystem, den du gar nicht bekommen kannst. So kann er beispielsweise auch erkennen, dass ein Angriff auf einen ganz anderen Kunden erlaubt, bei dir die Dateien zu verändern (bei Shared Hosting).

Ich habe außer meinem Projekt nur Piwik in der aktuellen Version auf dem Server.

Das ist ja trotzdem verdächtig, auch wenn es die aktuelle Version ist. Klingt nach viel Code, den du nicht im Detail kennst.

Hast du dein Access-Log angeschaut? Error-Log? Überhaupt alle Logs, die du sehen kannst. Die zeitliche Korrelation zwischen "Originaldatei" und "schädliche Datei" kannst du durch permanentes Prüfen der Dateiinhalte über einen gewissen Zeitraum (gern auch automatisiert) hinbekommen, sofern die Logfiles zu viele unstrukturierte Informationen haben.

In meinem Projekt gibt es nur eine Datei, die in Dateien schreiben kann und auf die wird nicht verlinkt und sie ist mit einem Passwort geschützt (das aber evtl. nicht gut genug ist). Ich führe keinen Code aus der Datenbank per eval oder ähnlichem aus und in die Datenbank kann eigentlich auch kein schädlicher Code gelangen, weil ich immer real_escape_string verwende.

Wenn es dein eigener Code nicht ist, ist es anderer Code.

Wenn du kein Shared Hosting hast, ist Piwik schuld. Oder irgendein Code-Rest, den du nicht erkennst.

Ich öffne Dateien, deren Name per URL-Parameter übergeben wurde. Mit file_exists prüfe ich zunächst, ob es eine Datei mit dem Namen und entsprechender Endung gibt. Ich lese die Datei mit file() ein und verarbeite sie dann weiter. Kann es sein, dass file_exists() oder file() unsicher ist und sich auch falsche Dateinamen übergeben lassen, die dann irgendwie dazu führen, dass der Inhalt einer anderen Datei geändert wird?

Beide Funktionen sind ungefährlich, führen zumindest keinen Code aus.

file_exists() und dann include() wäre gefährlich. Aber include() allein wäre genauso gefährlich. Heißt aber: Das Prüfen mit file_exists() ist keine Sicherheitsprüfung! Es ist eine Prüfung nach Existenz einer Datei - mit dieser Datei kann man dann unsicheren Unfug treiben oder auch nicht.

- Sven Rautenberg