30.05.2014

Transcend WiFi SD-Karte: Bugs fixed? Nah... (I)

Ich habe mir vor einigen Tagen eine weitere Transcend WiFi SD-Karte zugelegt und erlebte eine Überraschung. Das Directory-Traversal über die URL

http://192.168.11.254/cgi-bin/file_list.pl?dir=%2Fwww%2Fsd%2F..%2F..

funktionierte bei der neueren Karte nicht mehr. Ein wenig beunruhigt probierte ich mein Tool tshell aus und stellte erleichtert fest, dass der Shell-Zugriff noch immer möglich ist. Was hat Transcend an der Karte geschraubt? Warum funktioniert das Directory-Traversal nicht mehr?

Der Bugfix

Ein Blick mit tshell in das Verzeichnis /www/cgi-bin/ zeigt, dass dort vier Scripte vom 20. Februar dieses Jahres stammen, während der Rest bedeutend älter ist (3. Mai 2013). Wie erwartet trägt auch file_list.pl den neueren Zeitstempel. Hier findet sich ab Zeile 177 der Patch für/gegen das Directory Traversal:

if( $list_dir =~ /\.\./ ) {
    print "Path error <br>";
    die("Path error");
}

Der Fix passt zur Programmierung der gesamten Weboberfläche (das ist kein Kompliment). Er besteht aus einem einfachen “Wenn im Pfad die Zeichenkette ‘..’ vorkommt, beende Dich mit der Fehlermeldung ‘Path error’”.

Der Fix funktioniert… nur leider zu gut!

Der Patch ist so effektiv wie falsch.

Die gute Nachricht: Der Fix fängt Directory Traversals ab. Auch das Verschleiern der benötigten Punkte im Pfad durch (double) URL-Encoding (%2E und z.B. %252E) ist wirkungslos, weil file_list.pl die URL decodiert, bevor sie auf die Zeichenkette ‘..’ geprüft wird.

Die schlechte Nachricht: Transcend schiesst mit dem Patch weit über das gewünschte Ziel hinaus, weil er dafür sorgt, dass alle Verzeichnisse mit zwei (oder mehr) aufeinanderfolgenden Punkten im Namen nicht mehr in der Weboberfläche angezeigt werden können. Ein Verzeichnisname beendet das Script ganz einfach. Bilder im Ordner “Sehr wichtig… Sofort ansehen!” z.B. sind nicht mehr erreichbar.

Die Lösung liegt so nah…

Für das Abfangen von Directory Traversals eignet sich die Funktion “basename” aus dem PERL-Paket “File::Basename”. Sie sorgt dafür, dass Pfadangaben ordnungsgemäß normalisiert werden und macht eigene Lösungen überflüssig. Warum sie nicht eingesetzt wird, bleibt rätselhaft – zumal das Paket in file_list.pl ohnehin eingebunden ist.

Weitere Untersuchungen nötig

In den nächsten Tagen werde ich mir die anderen Fixes ansehen.