鳩丸ぐろっさり (用語集)

bakera.jp > 鳩丸ぐろっさり (用語集) > Unicode Web Traversal

用語「Unicode Web Traversal」について

Unicode Web Traversal (ゆにこーどうぇぶとらばーさる)

話題 : セキュリティ

かつて IIS に存在した脆弱性で、「Unicodeバグ」とも呼ばれます。これは、冗長な符号化がなされた UTF-8 の文字列を含む URL によって、本来アクセスできてはならないものにアクセスできてしまうという Path Traversal の問題です。Microsoft はこの問題を MS00-057 (www.microsoft.com) および MS00-078 (www.microsoft.com) として公開、修正プログラムを提供しています。

※名前だけ聞くと Unicode 系の符号化方式全般の問題のように思えますが、これは UTF-8 に固有の問題で、UTF-16 ではこのような問題は発生しません。

たとえば、スラッシュは ASCII文字ですから、UTF-8 では、単に 00101111 (0x2F) という 1オクテットのビット列で表現されます。従って、スラッシュが危険な文字である場合は、0x2F をチェックして弾く、あるいはサニタイズすれば良いように思えます。

ところが、UTF-8 では、同じ文字を冗長な符号化によって異なるビット列で表現することができてしまいます。たとえば、11000000 10101111 (0xC0AF) というビット列は、本来であれば 0080-07FF の文字を表現するビット列ですが、素直にデコードすると 00000101111、というビット列が得られます。これは 16進数では 0x2F で、"/"(スラッシュ)に他なりません。同様に、1110000 10000000 10101111 (0xE080AF) という 3オクテットのビット列、11110000 10000000 10000000 10101111 (0xF08080AF) という 4オクテットのビット列もまた、スラッシュを表現することになります。

0x2F だけをサニタイズしていると、このようなビット列が通ってしまうことになるわけです。その結果、本来であれば遮断される ../.. を含む URL が、するりと通り抜けてしまう (traverse) 結果になります。

なお、RFC2279 では、この問題について特別に注意を促すため、以下のような注意書きが追加されています。

NOTE -- actual implementations of the decoding algorithm above should protect against decoding invalid sequences. For instance, a naive implementation may (wrongly) decode the invalid UTF-8 sequence C0 80 into the character U+0000, which may have security consequences and/or cause other problems. See the Security Considerations section below.

以上、RFC2279 2. UTF-8 definition より

0xC0AE のような冗長なビット列は明確に "invalid" とされました。さらに 6. Security Considerations の項にもセキュリティ上の注意書きが追加されています。

最近の日記

関わった本など