[Generic/i18n] Locale-Einstellungen mit überraschenden Auswirkungen
(2001-07-02 21:43:04+00)
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 derLC_
-Variablen für den entsprechenden Bereich gesetzt wurde.
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: Dadurch ergeben sich folgende Auswirkungen:$ 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 $
- 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
- odersetgid
-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 gleichzeitigLC_COLLATE
auf den WertC
zu setzen. Dies gilt sowohl für die systemweite Vorgabe, als auch für die indivuellen Einstellungen einzelner Nutzer. Anwendungen, die andere Werte fürLC_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 alsen_US.ISO-8859-1
oderen_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 dannlocale-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.
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 © 2022 RUS-CERT, Universität Stuttgart, https://cert.uni-stuttgart.de/
https://cert.uni-stuttgart.de/ticker/article.php?mid=392