🐳

ユニバーサルクロスサイトスクリプティングとはなんぞや

2024/06/24に公開

どうもこんにちは、今回はユニバーサルクロスサイトスクリプティングという脆弱性について解説をしていきます。

最近LINEで以下の脆弱性が報告されたようで、iframe内から攻撃可能なXSSとはどういうことか?という相談が舞い込んできたためです。
https://jvn.jp/vu/JVNVU91384468/

スマホアプリ診断は更新が早いので実施していて楽しい反面、技術を追うのが大変ですね🥲
毎年API仕様がアップデートされるため、みなさまはスマホアプリは面倒くさがらず常に最新版にしておくことを推奨します。

この記事は普段脆弱性診断をしているような経験者を対象にしています。そのため、クロスサイトスクリプティングとはなんぞやの部分は割愛させていただくことをご容赦ください。

さて、ユニバーサルクロスサイトスクリプティングですが、こちらは結局のところクロスサイトスクリプティングと同様です。通常、Webでもアプリでも脆弱性診断を行う際に入力値を様々な方面からなんとかしてJavaScriptを動かすことができないか?と試行すると思います。
そこで、特定の条件が揃った時に検出可能なクロスサイトスクリプティング(XSS)のうち、ブラウザ側の仕様により特定のサイトに限定せず発生するものがユニバーサルクロスサイトスクリプティングとなっています。

「ブラウザ側の仕様」となるため、HTMLが解釈できるアプリはこの問題点が発生する可能性があります。とはいえ、スマホアプリはWebViewを使用してHTMLのレンダリングをすることが多いと思いますが、雑にWebViewを使用しているとXSSをはじめとした様々な脆弱性が生まれます。

今回はとある有名な(※1)ブラウザを使ってiframe内から攻撃可能な(※2)XSSの説明をしていきます。最初にお断りしておきますと、紹介するものは古の脆弱性であり2024年現在この手法ではXSSが発生しないことから診断手法として得られるものは少ないかと思います。

さて、この脆弱性を説明する前に、Content-TypeヘッダとCharsetの説明をする必要があります。
ブラウザは文字コードの解釈によって「<」や「'」のメタ文字がサニタイズされていてもXSSが実行可能になることがあり、代表的なものがこのInternet Explorerです。

スマホアプリではなくこの(※1)ブラウザを使って説明するのは、もう脆弱性が掘り尽くされているため説明しやすいのと、このブラウザに脆弱性が存在してももはや誰も困らないからです。(※1参照ください)

IEはiframe内でUTF-7という文字コードを利用した場合に「<」や「'」のメタ文字を使用せずともXSSが攻撃可能になる場合があります。

まず、XSSの発生文字列は以下のようにします

+ADw-script+AD4-alert(1)+ADw-/script+AD4-

上記はUTF-7文字列であり、ブラウザへは以下の文字列としての解釈を期待しています。

<script>alert(1)</script>

HTML内にエコーバックする箇所が存在すると次のようになります。<html>等の要素は元々のページで宣言されているものとします。

<html>
  <body>
  +ADw-script+AD4-alert(1)+ADw-/script+AD4-
  <!- ↑攻撃者の入力する文字列 ->
  </body>
</html>

このHTMLを読み込む際のHTTPヘッダは以下の通りです。

HTTP/1.1 200 OK
Content-type: text/html

このHTMLを通常通りブラウザで表示すると以下のようになります。これはjavaScriptが動作しておらず、問題ありません。

一方で、上記のHTMLをiframeで読み込んでみます。

<html>
  <head>
    <meta charset="UTF-7">
  </head>
  <body>
    <iframe src="http://example.com/charset-xss.html"></iframe>
    <!-- ↑+ADw-script+AD4-alert(1)+ADw-/script+AD4-が含まれるHTML -->
  </body>
</html>

すると、以下のようにXSSが成立します。

ちなみに、クロスオリジンからの呼び出しではCharsetを継承してくれないため、XSSは発生しません。

ここで興味深いのは、親HTML(window.top)のiframeから呼ばれるHTMLは「<」や「'」のメタ文字が使用されていないことです。
条件が限定的ではありますが、HTMLかHTTPヘッダでcharsetの指定できた上で、iframeの内部に入力地が含まれる場合にXSSの可能性があります。

今回報告されたLINEのUXSSがcharsetを利用したものかどうかは公開情報からは不明です。LINEはLIFFアプリがブラウザの機能を持つため、もしかしたらクロスドメインのiframe内のHTMLからwindow.topの書き換えができる...といった深刻なものである可能性もあります。iOSを使用されているかたは最新版へのアップデートを推奨します。

(※1)...なお、この挙動は既にInternet Explorer11では改修されており、ModernIEの公開が停止されてしまったことや、Windows11にInternet Explorerがインストールできなくなっているため、この挙動を公開しても影響を受けるユーザはいないだろうという判断です。

(※2)...こちらの挙動でiframeを利用せずとも、当該VersionのIEはクロスオリジンからのXSSやユニバーサルXSSが可能と思われます。あくまでこの記事はiframeからのXSSを紹介するものであり、IEのXSSを紹介し切れるものではないため、IEのXSSファミリーの詳細は以下の記事を参照願います。
https://mksben.l0.cm/2015/12/xxn.html
https://www.mbsd.jp/research/20160407/xss-filter/
https://piyolog.hatenadiary.jp/entry/20150206/1423236479

実行時の環境は以下の通りです。
OS: Windows 7 build 7601.17514 - ie8win7(Modern.IE)
IE: 8 and 10

Discussion