Login
Newsletter
Werbung

Do, 26. März 2009, 13:07

Software::UNIX

Korrektur von Unix-Dateinamen vorgeschlagen

Der Sicherheits-Spezialist David Wheeler hat vorgeschlagen, die Auswahl der in Dateinamen erlaubten Zeichen aus praktischen und Sicherheitsgründen einzuschränken.

Implementationsbedingt werden Dateinamen in Unix und Linux in Folgen von Bytes kodiert. Dabei sind von den 256 möglichen Werten, die ein Byte fassen kann, nur zwei nicht erlaubt: Die Null, da sie das Ende einer Zeichenkette markiert, und der Schrägstrich, der Verzeichnisnamen trennt.

Diese Freiheit verursacht eine Menge von Komplikationen, Portabilitäts- und Interoperabilitäts-Problemen. Wheeler führt das klassische Beispiel an, dass Programmoptionen mit einem Minuszeichen beginnen, jedoch auch Dateinamen mit einem Minus beginnen dürfen. Man male sich beispielsweise aus, was der simple Befehl »cat *« bewirkt, wenn sich im Verzeichnis eine Datei mit dem Namen »-n« befindet.

Schlimmer noch als dieses lösbare Problem sind Dateinamen die Steuerzeichen enthalten. Diese machen nicht nur erhebliche Schwierigkeiten in Shell-Kommandos (bis hin zu dem Punkt, dass manche Dateinamen überhaupt nicht oder nicht portabel unterstützt werden können), sondern können sogar Sicherheitsprobleme aufwerfen, wenn ein Angreifer Dateien mit Steuerzeichen im Namen anlegt. Laut Wheeler gibt es überhaupt keine legitime Verwendung für Steuerzeichen in Dateinamen, so dass deren Abschaffung gar kein Problem wäre.

Auch Leerzeichen in Dateinamen stellen ein Problem dar, wenn auch hauptsächlich für Shell-Skripte. Da diese jedoch weit verbreitet sind, besonders auf Nicht-Unix-Systemen, wäre es laut Wheeler nicht zweckmäßig, diese abzuschaffen. Man könnte allerdings Leerzeichen am Anfang und am Ende von Dateinamen verbieten. Windows macht laut Wheeler schon letzteres und erlaubt auch keine Steuerzeichen in Dateinamen.

Shell-Programmierer wissen auch, dass auch Shell-Metazeichen in Dateinamen ein Problem darstellen. Dazu gehören alle Klammern, Kleiner, Größer, das Semikolon, der Stern und einige mehr. Es wäre jedoch für Wheeler wenig praktikabel, diese alle zu verbieten, zumindest jetzt noch nicht, denn sie werden in Dateinamen durchaus verwendet, und alle Programme zu ändern, die solche Namen erzeugen, wäre eine langwierige Aufgabe.

Die Einschränkung von Dateinamen wäre mit POSIX verträglich, stellt Wheeler fest. POSIX fordert zwar keine Einschränkung, erlaubt sie aber und schlägt sogar eine minimale Menge von Zeichen vor, die garantiert portabel sein soll. Diese Menge enthält lediglich die Großbuchstaben A-Z, die Kleinbuchstaben a-z, die Ziffern 0-9 sowie Punkt, Unterstrich und Minus, wobei letzteres nicht am Anfang des Namens stehen darf.

Ein weiteres Problem sieht Wheeler darin, dass nicht festgelegt ist, in welchem Zeichensatz ein Dateinamen kodiert ist. Neuere Linux-Distributionen verwenden per Konvention UTF-8, doch wird dies nirgends erzwungen. Aktuelle Systeme verwenden meist die Ländereinstellungen, um daraus die Kodierung der Dateinamen abzuleiten. Das ist jedoch nicht portabel, da die Dateinamen auf einem System mit anderen Einstellungen anders interpretiert werden.

Für Wheeler kann die Lösung nur darin bestehen, UTF-8 als Kodierung verbindlich festzulegen. Damit werden Dateinamen in vielen Sprachen möglich, und die Portabilität bliebe trotzdem gewahrt. Die vielen zusätzlich verfügbaren Zeichen würden für die Programme kein Problem darstellen, da sie nicht als Steuerzeichen interpretiert werden.

Zusammenfassend ist Wheeler der Ansicht, dass eine Beschränkung der zulässigen Zeichen eine große Verbesserung wäre. Er schlägt mehrere Schritte vor, in denen diese Änderung nach und nach erreicht werden könnte. Der erste Schritt wäre die Definition eines einheitlichen Fehlercodes für unerlaubte Dateinamen durch eine Standardisierungs-Organisation wie POSIX. Der zweite Schritt wäre eine Möglichkeit, dem Kernel mitzuteilen, welche Zeichen und welche Kodierung erlaubt sind. Der Kernel würde diese Restriktionen durchsetzen, sie könnten aber außerhalb des Kernels definiert werden. Auf diese Weise kann der Kernel auf Richtlinien-Entscheidungen herausgehalten werden. Im nächsten Schritt sollten diverse Anwendungen modifiziert werden, wiederum durch POSIX-Standards unterstützt, um mit solchen Restriktionen besser arbeiten zu können. Noch später könnte der Kernel vielleicht eine automatische Ersetzung von unerlaubten Zeichen implementieren.

Die Definition, welche Zeichen akzeptabel sind, wäre parallel dazu vorzunehmen. Wheeler schlägt mehrere Maßnahmen vor, hält jedoch nur zwei für unbedingt nötig. Diese sind das Verbot der Steuerzeichen 1-31 und das Verbot des Minuszeichens als erstes Zeichen eines Dateinamens. Alle weiteren Problemen seien bereits entschärft, wenn diese beiden Punkte umgesetzt sind.

Weitere Maßnahmen wären dann die Festlegung auf UTF-8 in allen APIs, das Verbot von Shell-Metazeichen, das Verbot von Leerzeichen am Anfang und Ende eines Namens, eventuell auch von mehreren Leerzeichen hintereinander, und schließlich das Verbot der Tilde am Anfang eines Dateinamens. Am schwierigsten wäre das Verbot der Shell-Metazeichen durchzusetzen, obwohl es auch für Dateinamen in HTML hilfreich wäre. Denn viele Anwendungen nutzen Klammern in all ihren Varianten als Teil von Dateinamen.

Der Artikel ist bereits auf großes Interesse gestoßen und hat einige Reaktionen ausgelöst, die Wheeler in einer aktualisierten Fassung des Artikel angefügt und kommentiert hat.

Werbung
Kommentare (Insgesamt: 108 || Alle anzeigen )
Re[2]: Shellprogramme, nicht Namen, sind das Probl (fuffy, Fr, 27. März 2009)
Re[7]: UTF-8 (fuffy, Fr, 27. März 2009)
Re[3]: Was hast du denn geraucht? (fuffy, Fr, 27. März 2009)
Re[3]: 20 jahre zu spät (fuffy, Fr, 27. März 2009)
Re: UTF-8 (baka0815, Fr, 27. März 2009)
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung