Zum Hauptinhalt springen

10. Sicherheitsüberlegungen

Implementierer von UTF-8 müssen die Sicherheitsaspekte berücksichtigen, die sich aus dem Umgang mit unzulässigen UTF-8-Sequenzen ergeben. Es ist denkbar, dass ein Angreifer unter bestimmten Umständen einen unvorsichtigen UTF-8-Parser ausnutzt, indem er ihm eine Oktettfolge sendet, die von der UTF-8-Syntax nicht zugelassen ist.

Angriff über überlange Kodierung (overlong)

Eine besonders raffinierte Form dieses Angriffs kann gegen einen Parser gerichtet werden, der sicherheitskritische Gültigkeitsprüfungen an der UTF-8-kodierten Form seiner Eingabe durchführt, bestimmte unzulässige Oktettfolgen jedoch als Zeichen interpretiert.

Beispiel 1: NUL-Zeichen

So könnte ein Parser etwa das NUL-Zeichen verbieten, wenn es als Ein-Oktett-Sequenz 00 kodiert ist, die unzulässige Zwei-Oktett-Sequenz C0 80 jedoch fälschlicherweise zulassen und als NUL-Zeichen interpretieren.

Beispiel 2: Pfadtraversierung

Ein weiteres Beispiel wäre ein Parser, der die Oktettfolge 2F 2E 2E 2F („/../“) verbietet, die unzulässige Oktettfolge 2F C0 AE 2E 2F jedoch zulässt.

Reale Auswirkungen

Letzterer Exploit wurde tatsächlich von einem weit verbreiteten Virus genutzt, der im Jahr 2001 Webserver angriff; die Sicherheitsbedrohung ist also durchaus real.

Risiko eines Pufferüberlaufs

Ein weiteres Sicherheitsproblem tritt beim Kodieren nach UTF-8 auf: Die Beschreibung von UTF-8 in ISO/IEC 10646 erlaubt die Kodierung von Zeichennummern bis U+7FFFFFFF und erzeugt dabei Sequenzen von bis zu 6 Byte.

Es besteht daher die Gefahr eines Pufferüberlaufs, wenn:

  • Der Bereich der Zeichennummern nicht ausdrücklich auf U+10FFFF begrenzt wird
  • Bei der Dimensionierung von Puffern die Möglichkeit von 5- und 6-Byte-Sequenzen nicht berücksichtigt wird

Probleme der kanonischen Äquivalenz

Die Sicherheit kann außerdem durch ein Merkmal mehrerer Zeichenkodierungen, darunter UTF-8, beeinträchtigt werden: „Dasselbe“ (soweit ein Benutzer dies wahrnimmt) kann durch mehrere verschiedene Zeichenfolgen dargestellt werden.

Beispiel: Akzentzeichen

Ein e mit Akut kann beispielsweise dargestellt werden durch:

  • Das vorkomponierte Zeichen U+00E9 E ACUTE
  • Die kanonisch äquivalente Folge U+0065 U+0301 (E + COMBINING ACUTE)

Auswirkungen auf die Sicherheit

Obwohl UTF-8 für jede Zeichenfolge eine eindeutige Bytefolge liefert, kann die Existenz mehrerer Zeichenfolgen für „dasselbe“ überall dort sicherheitsrelevante Folgen haben, wo Folgendes eine Rolle spielt:

  • Zeichenkettenvergleich
  • Indizierung
  • Suche
  • Sortierung
  • Abgleich mit regulären Ausdrücken
  • Auswahloperationen

Beispiel für ein Angriffsszenario

Ein Beispiel wäre der Zeichenkettenvergleich einer Kennung in einem Berechtigungsnachweis mit den Einträgen einer Zugriffssteuerungsliste.

Unicode-Normalisierung

Dieses Problem lässt sich mit Lösungen auf Basis der Unicode-Normalisierungsformen angehen, siehe [UAX15].

Die Normalisierungsformen stellen kanonische Repräsentationen bereit, die sicherstellen, dass äquivalente Zeichen beim Vergleich als gleich gelten.