Sie sind hier: Home » Aktuelle Meldungen » Meldung
Meldung Nr: RUS-CERT-392

[Generic/i18n] Locale-Einstellungen mit überraschenden Auswirkungen
(2001-07-02 21:43:04+00) Druckversion


Die Umsetzung von Standards, die die Internationalisierung der klassischen UNIX-Kommandozeilen-Tools vorantreiben sollen, kann die Korrektheit von Shell-Skripten und ähnlichen Programmen signifikant beeinflussen.

Betroffene Systeme

  • UNIX-ähnliche Systeme neueren Datums, die umfassende locale-Unterstützung bereitstellen.

Einfallstor
Lokaler Account. Serverdienste verwenden in der Regel die Internationalisierungsroutinen nicht.

Auswirkung
Fehlverhalten von Programmen, möglicherweise in einer Weise, die das System gefährdet.

Typ der Verwundbarkeit
Änderungen an etablierten Schnittstellen, ohne daß die die Schnittstellen nutzenden Skripte und Programme angepaßt werden.

Gefahrenpotential
Nicht abzuschätzen.

Beschreibung
Mit der Adaptierung von Standards wie der Single UNIX Specification, Version 2 hält auch auf UNIX-Systemen die Internationalisierung auf breiter Front Einzug. Davon sind auch die üblichen Systemprogramme wie die Shell selbst, grep, find und viele mehr betroffen. Die Internationalisierung beläuft sich dabei nicht nur auf die Übersetzung von Fehlermeldungen, sondern verändert auch das Verhalten einiger C-Laufzeitroutinen und damit auch dieser Hilfsprogramme.

Um zu einer anderen locale, also einem Satz von Regeln zur Berücksichtung regionaler Gebräuche bei Verarbeitung von Zahlen und Zeichen, zu wechseln, existieren eine Reihe von Umgebungsvariablen:

  • Einzelne Variablen wie LC_CTYPE (Art der Zeichenkodierung), LC_NUMERIC (Zahlenformatierung), LC_COLLATE (Sortierung von Zeichen und Zeichenketten), LC_MESSAGES (Sprache der Meldungen) usw.
  • Die Variable LC_ALL setzt alle diese Variablen auf einen Schlag. Ihr Wert hat Vorrang vor den einzeln gesetzten Werten.
  • LANG gibt die Voreinstellung an, die verwendet wird, wenn keine der LC_-Variablen für den entsprechenden Bereich gesetzt wurde.
Die letztendlich gesetzten Werte lassen sich mit dem Programm locale anzeigen. Für uns sind im folgenden vor allem LC_CTYPE, LC_COLLATE und LC_MESSAGES interessant.

Über LC_CTYPE wird kontrolliert, wie Oktette als Zeichen interpretiert werden. Ein Beispiel: die hexadezimale Zahlenfolge 'C3 A4' wird als Text im ISO-8859-Zeichensatz als 'ä' eingelesen, im UTF-8-Zeichensatz aber als 'ä'. Die Risiken, die das Setzen der LC_CTYPE-Variable eventuell birgt, sind unter anderen:

  • Es werden Zeichen wie '.' und '/' als Buchstaben erkannt und daher möglicherweise dort zu gelassen, wo sie gefährlich sind. Mit der Zeichenkette '../' kann beispielsweise ein sogenannter directory traversal-Angriff eingeleitet werden, um auf Dateien in einem Verzeichnis zuzugreifen, ohne daß das vom Programm aus beabsichtigt wäre, da ja nur Buchstaben und Ziffern erlaubt sind.
  • Möglicherweise werden Kontrollzeichen angezeigt, die das verwendete Terminal nicht nur durcheinander bringen, sondern auch beschädigen.
  • Manche Zeichensätze oder Konverter erlauben, ASCII-Zeichen in unüberlicherweise zu kodieren, mit der Folge, daß kritische Zeichen nicht mehr erkannt werden (sehr häufig tritt dieses Problem mit fehlerhaften UTF-8-Decodern auf, zum Beispiel im IIS).
LC_COLLATE hingegen verändert die Sortierreihenfolge bei Zeichenketten und paßt sie lokalen Erfordernissen an. Man vergleiche selbst:
$ printf 'a\nb\nA\nB\n' | sort
A
B
a
b
$ printf 'a\nb\nA\nB\n' | LC_COLLATE=en_US sort
a
A
b
B
$ 
Dadurch ergeben sich folgende Auswirkungen:
  • Die Sortierreihenfolge ist plötzlich völlig anders. Falls zum Beispiel mittels binärer Suche in einer vorsortierten Tabelle gesucht wird, wird diese Suche in den meisten Fällen fortan fehlschlagen. Dies kann z.B. fatale Auswirkungen haben, falls über einen derartigen Mechanismus Zeichenketten ausgefiltert werden sollen, die nicht an andere Programme übergeben werden dürfen.
  • Reguläre Ausdrücke wie [A-Z] enthalten plötzlich auch die Kleinbuchstaben 'b' bis 'z'.

Mit LC_MESSAGE wird ein message catalog ausgewählt, der Übersetzungen enthält. Möglicherweise lassen sich Programmen über diese Variable und weitere Mechanismen Übersetzungen mit gefährlichen format strings unterjubeln.

Auch das Setzen der Variablen LC_CTYPE und LC_COLLATE kann mit dem Unterschieben spezieller locale-Definitionen verbunden werden; dadurch ergeben sich zusätzliche Möglichkeiten.

Angesichts dieser Probleme erscheint es zunehmend fragwürdig, ob dieser Weg zur Internationalisierung der klassischen UNIX-Tools wirklich empfehlenswert ist, zumal diese Mechanismen einige Probleme nicht behandeln (z.B. unterschiedliche Zeichensätze für Dateiinhalte, Dateinamen und zur Kommunikation mit dem Terminal).

Gegenmaßnahmen

  • Falls aus setuid- oder setgid-Programmen (oder andersweitig privilegierten Programmen) weitere Anwendungen aufgerufen werden, sind möglichst alle Umgebungsvariablen zu löschen. Bei den essentiell benötigten sind angemessene Werte zu erzwingen. In diesem Bereich darf nicht mit einer black list gefährlicher Variablen gearbeitet werden; eine (möglichst minimale) white list ist notwendig.
  • Falls die LANG-Variable gesetzt wird, ist gleichzeitig LC_COLLATE auf den Wert C zu setzen. Dies gilt sowohl für die systemweite Vorgabe, als auch für die indivuellen Einstellungen einzelner Nutzer. Anwendungen, die andere Werte für LC_COLLATE benötigen, sind am besten mit kleinen Skripten zu ummanteln, die die Variable passend setzen.
  • LC_CTYPE ist für das verwendete Terminal geeignet zu wählen (zum Beispiel als en_US.ISO-8859-1 oder en_US.UTF-8).
  • Bei manchen System müssen die locale-Definitionen vor der Benutzung durch root übersetzt werden. (Bei Debian GNU/Linux ist beispielsweise die Datei /etc/locale.gen zu bearbeiten und dann locale-gen aufzurufen.) Falls dies unterbleibt, liegen zumindest keine vordefinierten locale-Einstellungen vor, auf die umgeschaltet werden könnte. Eventuell ist das Einschleppen selbstdefinierter locale-Regeln aber trotzdem möglich.

(fw)

Hinweis
Die in diesem Text enthaltene Information wurde für die Mitglieder der Universität Stuttgart recherchiert und zusammengestellt. Die Universität Stuttgart übernimmt keinerlei Haftung für die Inhalte. Dieser Artikel darf ausschließlich in unveränderter Form und nur zusammen mit diesem Hinweis sowie dem folgenden Copyrightverweis veröffentlicht werden. Eine Veröffentlichung unter diesen Bedingungen an anderer Stelle ist ausdrücklich gestattet.

Copyright © 2017 RUS-CERT, Universität Stuttgart, http://cert.uni-stuttgart.de/

Vorherige Meldung Weitere Meldungen... Nächste Meldung

Bitte lesen Sie auch die Grundsätze, nach denen das RUS-CERT Tickermeldungen veröffentlicht. Der regelmäßige Bezug von Tickermeldungen über E-Mail und RSS-Feed ist ebenfalls möglich.