IPA テクニカルウォッチ DOM Based XSS に 関 するレポート ~JavaScript で HTML を 操 作 するアプリは 要 注 意!~
目 次 はじめに... 2 本 書 の 対 象 読 者... 2 本 書 における 用 語... 3 1. DOM Based XSS の 概 要... 4 1.1. XSS の 種 類... 4 1.2. DOM とは... 6 2. IPA に 報 告 された DOM Based XSS の 脆 弱 性... 9 2.1. 届 出 の 傾 向... 9 2.2. 脆 弱 性 が 作 り 込 まれた 原 因 の 考 察 と 簡 易 調 査 の 結 果... 9 3. DOM Based XSS の 事 例... 11 3.1. 脆 弱 性 があるコード 例 の 紹 介... 11 4. DOM Based XSS の 対 策 方 法... 14 コラム... 17 おわりに... 18 1
はじめに JavaScript は 動 的 にウェブページを 操 作 できる 強 力 な 言 語 であるが 使 い 方 を 誤 ればセキュリ ティ 上 の 問 題 ( 脆 弱 性 )を 作 り 込 んでしまう JavaScript が 関 連 する 代 表 的 な 脆 弱 性 には クロ スサイト スクリプティング( 以 降 XSS と 呼 ぶ)があり IPA への 届 出 も 多 い IPA への XSS の 脆 弱 性 の 届 出 状 況 だが 2012 年 の 後 半 に 変 化 があった これまで 届 出 が 少 なか った DOM Based XSS と 呼 ばれるタイプの XSS の 脆 弱 性 の 届 出 が 増 加 したのである DOM Based XSS は JavaScript から 動 的 に HTML を 操 作 しているアプリ 全 般 に 注 意 が 必 要 な 脆 弱 性 だが このタイプの XSS について 解 説 した 資 料 が 少 ないことや 類 似 の 届 出 が 多 かったことから IPA では 脆 弱 性 の 原 因 や 対 策 方 法 が 理 解 されにくい 状 況 にあると 考 えた 以 上 の 経 緯 から DOM Based XSS の 脆 弱 性 について 解 説 した 資 料 を 公 表 することにした 本 資 料 が 当 該 脆 弱 性 の 理 解 や 対 策 の 参 考 となれば 幸 いである 本 書 の 対 象 読 者 本 書 の 対 象 読 者 は ウェブサイトの 構 築 や 運 営 に 携 わる 方 および JavaScript による 動 的 な HTML 操 作 をするアプリの 開 発 者 を 想 定 している 基 本 的 な XSS の 脆 弱 性 を 知 らない 方 は まず は 下 記 コンテンツの XSS の 項 を 一 読 することをお 薦 めする 知 っていますか? 脆 弱 性 (ぜいじゃくせい) http://www.ipa.go.jp/security/vuln/vuln_contents/index.html 安 全 なウェブサイトの 作 り 方 http://www.ipa.go.jp/security/vuln/websecurity.html 本 書 の 構 成 本 書 は 4 つの 章 およびコラムで 構 成 している 最 初 に DOM Based XSS の 対 策 方 法 を 把 握 さ れたい 方 は P.3 の 本 書 における 用 語 を 確 認 した 上 で 4 章 を 参 照 いただきたい 構 成 要 素 内 容 XSS の 種 類 1. DOM Based XSS の 概 要 DOM および DOM Based XSS の 説 明 2. DOM Based XSS の 届 出 状 況 IPA に 届 け 出 られた DOM Based XSS の 傾 向 3. DOM Based XSS の 事 例 DOM Based XSS が 作 り 込 まれてしまったコード 例 4. DOM Based XSS の 対 策 方 法 対 策 の 考 え 方 対 策 方 法 の 例 同 一 生 成 元 ポリシー(Same Origin Policy)の 概 要 コラム 脆 弱 性 体 験 学 習 ツール AppGoat の 紹 介 2
本 書 における 用 語 JavaScript ウェブブラウザ 上 で 実 行 されるスクリプト 言 語 本 書 において 断 りなく スクリプト と 表 現 し ている 箇 所 は JavaScript のことを 指 す DOM Document Object Model の 略 DOM は HTML ドキュメントや XML ドキュメントをアプリ ケーションから 操 作 するためのアプリケーションプログラミングインターフェース(API)である DOM は ドキュメントの 内 容 をツリー 構 造 ( 以 降 DOM ツリーと 呼 ぶ)で 表 現 する JavaScript から DOM ツリーを 編 集 することにより ウェブブラウザ 上 に 表 示 している HTML や XML のド キュメントの 内 容 を 動 的 に 操 作 できる 図 解 を 交 えた 説 明 は 1.2 DOM とは の 項 を 参 照 いただ きたい XSS クロスサイト スクリプティング(Cross Site Scripting)の 略 リクエストや HTTP ヘッダな どに 含 まれる 情 報 をウェブページへ 出 力 する 処 理 に 問 題 がある 場 合 そのウェブページに 第 三 者 が 用 意 したスクリプト 等 を 埋 め 込 まれてしまう この 問 題 を クロスサイト スクリプティングの 脆 弱 性 と 呼 び この 問 題 を 悪 用 した 攻 撃 手 法 を クロスサイト スクリプティング 攻 撃 と 呼 ぶ XSS フィルタ 一 部 のブラウザに 備 わっている XSS 攻 撃 を 検 知 して 防 御 する 機 能 ブラウザによって 機 能 の 名 称 は 異 なる XSS フィルタにより ウェブアプリケーションに XSS の 脆 弱 性 があったとしても 一 部 の 攻 撃 は 防 ぐことが 可 能 ただし すべての 攻 撃 が 防 げる 訳 ではないため 根 本 的 には 脆 弱 性 を 修 正 する 必 要 がある WAF Web Application Firewall の 略 ウェブアプリケーションの 脆 弱 性 を 悪 用 した 攻 撃 などからウェ ブアプリケーションを 保 護 するソフトウェア またはハードウェアを 指 す WAF は 脆 弱 性 を 修 正 するといったウェブアプリケーションの 実 装 面 での 根 本 的 な 対 策 ではなく 攻 撃 による 影 響 を 低 減 する 対 策 の 一 つである 3
1. DOM Based XSS の 概 要 本 章 では XSS の 種 類 や DOM の 概 念 について 整 理 説 明 し DOM Based XSS とはどのよう な 脆 弱 性 なのかを 解 説 する なお コードを 交 えた 具 体 的 な 事 例 については 3 章 の DOM Based XSS の 事 例 で 紹 介 する 1.1. XSS の 種 類 DOM Based XSS は XSS(クロスサイト スクリプティング)の 脆 弱 性 の 一 種 である 脆 弱 性 の 種 類 をリスト 化 している CWE 1 では XSS の 脆 弱 性 は 下 記 3 種 類 に 分 類 されている Type1: Reflected XSS (or Non-Persistent) Type2: Stored XSS (or Persistent) Type0: DOM Based XSS Type1: Reflected XSS (or Non-Persistent) Type1 は ユーザからのリクエストに 含 まれるスクリプトに 相 当 する 文 字 列 を ウェブアプリケ ーションが 当 該 リクエストへのレスポンス(ウェブページ) 内 にスクリプトとして 出 力 してしまう タイプである( 図 1) スクリプトはリクエストの 送 信 者 へ 返 ることから 反 射 型 クロスサイト スクリプティング(Reflected XSS)と 呼 ばれる 脆 弱 性 のあるウェブアプリの 挙 動 攻 撃 シナリオ スクリプト 反 射!! 攻 撃 者 スクリプト 実 行 攻 撃 者 ポイント サイトA スクリプトはリクエストの 送 信 者 へ 返 る 脆 弱 性 の 原 因 箇 所 はウェブアプリの ウェブページ 出 力 処 理 スクリプト 実 行 攻 撃 対 象 者 Click サイトA 図 1: Reflected XSS の 攻 撃 イメージ Type2: Stored XSS (or Persistent) Type2 は ユーザからのリクエストに 含 まれるスクリプトに 相 当 する 文 字 列 を ウェブアプリケ ーション 内 部 に 永 続 的 に 保 存 し 保 存 した 文 字 列 をスクリプトとしてウェブページに 出 力 してしま うタイプである( 図 2) ユーザが 当 該 ページを 閲 覧 するたびに 保 存 した 文 字 列 がスクリプトと して 実 行 されることから 格 納 型 クロスサイト スクリプティング(Stored XSS)と 呼 ばれる 1 情 報 処 理 推 進 機 構 : 情 報 セキュリティ: 共 通 脆 弱 性 タイプ 一 覧 CWE 概 説 http://www.ipa.go.jp/security/vuln/cwe.html 4
脆 弱 性 のあるウェブアプリの 挙 動 攻 撃 シナリオ スクリプト 格 納!! スクリプト 格 納!! 攻 撃 者 サイトB 攻 撃 者 サイトB ポイント スクリプトはサーバに 一 旦 格 納 される 脆 弱 性 の 原 因 箇 所 はウェブアプリの ウェブページ 出 力 処 理 スクリプト 実 行 攻 撃 対 象 者 サイトB 図 2: Stored XSS の 攻 撃 イメージ Type0: DOM Based XSS Type0 は ウェブページに 含 まれる 正 規 のスクリプトにより 動 的 にウェブページを 操 作 した 結 果 意 図 しないスクリプトをウェブページに 出 力 してしまうタイプである( 図 3 ) ウェブページ を 操 作 する 際 の 仕 組 みを DOM と 呼 ぶことから このタイプの XSS は DOM ベースのクロスサイ ト スクリプティング(DOM Based XSS)と 呼 ばれている DOM については 次 項 を 参 照 いただ きたい 脆 弱 性 のあるアプリの 挙 動 攻 撃 シナリオ( 攻 撃 者 省 略 ) スクリプト(JavaScript 等 )により 動 的 にウェブページを 出 力 する 際 に 意 図 せずスクリプトタグを 生 成!! Click ポイント 正 規 のスクリプトにより 動 的 にページを 操 作 ( 出 力 )する 際 に 意 図 しないスクリプトが 生 成 される 脆 弱 性 の 原 因 箇 所 は 上 記 ス クリプトによる 処 理 攻 撃 対 象 者 スクリプト 実 行 サイトC 図 3: DOM Based XSS の 攻 撃 イメージ Type1 Type2 のいずれも ウェブアプリケーションが リクエストに 含 まれるスクリプトに 相 当 する 文 字 列 を 基 にウェブページを 出 力 することにより ユーザのウェブブラウザ 上 で 不 正 なスク リプトが 実 行 される これは ウェブアプリケーションによるウェブページ 出 力 処 理 に 問 題 がある ため 作 り 込 まれてしまう 脆 弱 性 と 言 える 5
対 して Type0 は ウェブブラウザなどのクライアント 上 で 実 行 される 正 規 のスクリプトによる ウェブページ 操 作 の 結 果 不 正 なスクリプトが 実 行 される これは スクリプトによるウェブペー ジ 出 力 処 理 (DOM 操 作 )に 問 題 があるため 作 り 込 まれてしまう 脆 弱 性 と 言 えるだろう なお ウェブページ 出 力 処 理 はスクリプトのみで 実 現 しているため 該 当 するスクリプトが 存 在 すれば サーバとの 通 信 が 発 生 しないプログラムであったとしても Type0(DOM Based XSS)の 脆 弱 性 が 作 り 込 まれてしまう 可 能 性 がある DOM 操 作 を 実 装 しているプログラムの 開 発 者 は 注 意 いただきたい 1.2. DOM とは DOM(Document Object Model)は HTML ドキュメントや XML ドキュメントをアプリケー ションから 操 作 するための API である W3C が 標 準 化 2しており 様 々なプログラミング 言 語 やラ イブラリが DOM をサポートしている ここでは 本 書 のテーマにあわせ JavaScript から HTML を 操 作 する 際 の DOM を 説 明 する HTML と DOM ツリー HTML(HyperText Markup Language)では 次 のように HTML タグを 使 用 して head や title などの 要 素 を 記 述 できる 1 <html> 2 <head> 3 <meta http-equiv="content-type" content="text/html; charset=utf-8"> 4 <title>サンプルページ</title> 5 </head> 6 <body> 7 <p id="p1">このページはサンプルです </p> 8 </body> 9 </html> 要 素 は 入 れ 子 にして 記 述 できるので 要 素 と 要 素 の 間 には 親 子 関 係 や 兄 弟 関 係 がある 上 記 の HTML ドキュメントの 場 合 head 要 素 は html 要 素 の 子 であり title 要 素 と meta 要 素 とは 兄 弟 関 係 にある このような 関 係 を DOM は 以 下 のようなノードのツリー 構 造 で 提 供 する このよう なツリーを DOM ツリーと 呼 ぶことがある なお ツリー 構 造 のルートはドキュメント 全 体 を 表 す Document ノードである Document html ノード / Node ドキュメントノード / Document Node 要 素 ノード / Element Node head body テキストノード / Text Node meta title p サンプ このペ 図 4: DOM が 提 供 する HTML ドキュメントのツリー 構 造 (DOM ツリー) 2 W3C Document Object Model http://www.w3.org/dom/ 6
DOM を 使 った HTML の 操 作 DOM には 対 象 のドキュメントを 操 作 するためのメソッドやプロパティが 定 義 されている こ こでは JavaScript から DOM を 通 じて HTML ドキュメントを 操 作 する 例 を 示 す 先 に 示 した HTML ドキュメントに JavaScript コードを 追 加 して 次 のようにする 1 <html> 2 <head> 3 <meta http-equiv="content-type" content="text/html; charset=utf-8"> 4 <title>サンプルページ</title> 5 </head> 6 <body> 7 <p id="p1">このページはサンプルです </p> 8 <script type="text/javascript"> 9 settimeout( function() { 10 var p1_textnode = document.getelementbyid('p1').firstchild; 11 p1_textnode.data = 'このページはサンプルでした '; 12 }, 5000 ); 13 </script> 14 </body> 15 </html> 赤 字 が 追 記 箇 所 この HTML ドキュメントの DOM ツリーは 以 下 のように script 要 素 が 追 加 されたものなる Document html ノード / Node ドキュメントノード / Document Node 要 素 ノード / Element Node head body テキストノード / Text Node meta title p script サンプ このペ 図 5: JavaScript コードを 追 加 した HTML ドキュメントの DOM ツリー これをウェブブラウザで 表 示 した 場 合 このページはサンプルです との 表 示 がされ 5 秒 後 には このページはサンプルでした に 書 き 換 えられる 5 秒 後 に 書 換 えられる 表 示 直 後 5 秒 後 以 降 図 6: JavaScript コードによるコンテンツの 書 き 換 え 7
この 書 き 換 えは HTML ドキュメントに 含 まれる JavaScript コードから DOM を 通 じて 行 わ れている(10~11 行 目 ) 10 行 目 は 書 き 換 え 対 象 となる 要 素 を 選 択 する 処 理 である ここでは 7 行 目 の p 要 素 の 子 のテ キストノードを 選 択 している p 要 素 には id 属 性 を 設 定 しているので getelementbyid メソッ ドを 用 いて id 属 性 の 値 p1 から 取 得 することができる その 子 ノードを 選 択 するために firstchild プロパティを 用 い 最 終 的 に 目 的 のテキストノードを 選 択 している 要 素 を 選 択 する 処 理 はこの 他 に 名 前 から 選 択 する getelementsbyname メソッドや タグ 名 か ら 選 択 する getelementsbytagname メソッドがある また 親 子 関 係 や 兄 弟 関 係 を 辿 るプロパテ ィも 他 に 様 々なものが 存 在 する 11 行 目 は 書 き 換 えの 処 理 だ ここでは data プロパティに 値 を 設 定 する 方 法 で プレーンテ キストとしてテキスト このページはサンプルでした を 設 定 している プレーンテキストとし て 扱 われるようにすれば 万 一 HTML タグがテキスト 中 に 含 まれた 場 合 でも HTML タグとして 解 釈 されることがないため 安 全 な 方 法 だ このように HTML ドキュメント 中 の 要 素 を 選 択 し 選 択 した 要 素 を 書 き 換 えるのが DOM を 使 った HTML ドキュメント 操 作 の 基 本 となる このような 操 作 と JavaScript が 持 っている 別 の 機 能 を 組 み 合 わせることで 様 々な 機 能 が 実 現 されている 以 下 はその 例 である ページ 遷 移 することなく 新 たなデータを 読 み 込 み 表 示 する たとえば 地 図 を 表 示 した 際 同 一 ページ 内 でスクロールさせたり 縮 尺 を 変 更 したりする ユーザのマウス 操 作 に 応 じて 動 的 にページの 内 容 を 書 き 換 える ウェブブラウザの 機 能 を 拡 張 する 書 き 換 えの 際 に 生 じる DOM Based XSS 前 項 で 紹 介 した 書 き 換 えの 他 の 方 法 として 要 素 の innerhtml プロパティに 値 を 設 定 する 方 法 がある innerhtml プロパティの 場 合 設 定 したテキストはプレーンテキストではなく HTML として 解 釈 展 開 されるので 表 現 力 が 高 い ただし HTML として 扱 われる 以 上 意 図 しない 値 が 設 定 されないよう 配 慮 する 必 要 がある もし 配 慮 が 行 き 届 かず 意 図 しない HTML が 展 開 された 場 合 意 図 しないスクリプトの 実 行 に 繋 がる 恐 れがある このような DOM を 通 じた HTML 操 作 の 結 果 として 意 図 しないスクリ プトが 実 行 されることや それを 許 す 脆 弱 性 を 指 して DOM Based XSS という 8
2. IPA に 報 告 された DOM Based XSS の 脆 弱 性 IPA は 情 報 セキュリティ 早 期 警 戒 パートナーシップ において 脆 弱 性 関 連 情 報 の 届 出 を 受 け 付 ける 機 関 として 活 動 している 本 章 では IPA に 届 け 出 られた DOM Based XSS の 脆 弱 性 の 傾 向 を 踏 まえ 脆 弱 性 が 作 り 込 まれてしまった 原 因 を 考 察 する 2.1. 届 出 の 傾 向 2012 年 に IPA に 届 け 出 られた DOM Based XSS の 脆 弱 性 は 累 計 130 件 であった( 図 2-1) これはウェブサイトおよびソフトウェア 製 品 の 届 出 の 合 計 件 数 である IPA への 届 出 は 発 見 者 の 善 意 で 成 り 立 っており 必 ずしも 世 の 中 のウェブサイトの 脆 弱 性 の 傾 向 が 反 映 されている 訳 ではない が DOM Based XSS の 脆 弱 性 が 一 定 数 存 在 していることは 確 認 できる DOM Based XSSの 届 出 件 数 (2012 年 ) 100 80 92 届 出 件 数 60 40 20 0 15 第 1 四 半 期 (1 月 ~3 月 ) 2 第 2 四 半 期 (4 月 ~6 月 ) 21 第 3 四 半 期 (7 月 ~9 月 ) 第 4 四 半 期 (10 月 ~12 月 ) 図 2-1: IPA に 届 け 出 られた DOM Based XSS の 届 出 件 数 累 計 130 件 中 ウェブアプリケーションに 関 連 する 届 出 は 125 件 あり 最 も 多 くの 届 出 られた ものは アクセス 解 析 アプリの 設 置 方 法 に 問 題 があるという 内 容 であった これは ウェブアプリ ケーションに 関 連 する 届 出 のうち 68%(85 件 )を 占 める 件 数 である その 他 PC 上 で 使 用 するアプリケーションに 関 する 届 出 は 5 件 であった これらは ウェブブ ラウザのプラグインやデスクトップアプリのヘルプページなどのサーバを 介 さない 箇 所 に 存 在 す る DOM Based XSS の 脆 弱 性 の 届 出 であった 2.2. 脆 弱 性 が 作 り 込 まれた 原 因 の 考 察 と 簡 易 調 査 の 結 果 2012 年 に IPA に 届 け 出 られた DOM Based XSS の 脆 弱 性 について 調 査 した 結 果 脆 弱 性 が 作 り 込 まれた 原 因 はJavaScript によるウェブページへの 出 力 処 理 に 不 備 があるためとIPAでは 考 えた また 調 査 結 果 から 問 題 の 出 力 処 理 は 独 自 開 発 部 分 だけでなく JavaScript ライブラリに 存 在 している 場 合 があることがわかった 9
届 出 の 脆 弱 性 が 作 り 込 まれた 原 因 の 調 査 届 出 の 脆 弱 性 において JavaScript によるウェブページへの 出 力 処 理 に 焦 点 をあて スクリプト に 相 当 する 文 字 列 が 入 り 込 む 箇 所 JavaScript による 該 当 情 報 の 取 得 方 法 JavaScript によ るウェブページへの 出 力 方 法 を 調 査 したところ 表 2-1 のような 結 果 になった 表 2-1 届 出 にみられた 脆 弱 性 関 連 箇 所 スクリプトに 相 当 する 文 字 列 が 入 り 込 む 箇 所 JavaScript による 該 当 情 報 の 取 得 方 法 URL document.location.href document.url URL のクエリストリング document.location.search URL のフラグメント 識 別 子 document.location.hash リファラ document.referrer input 要 素 の value 値 getelementsbytagname("input") title 要 素 のテキストノード Chrome 拡 張 機 能 の API 3 JavaScript による ウェブページへの 出 力 方 法 innerhtml document.write() jquery の html() jquery の append() JavaScript によるウェブページへの 出 力 方 法 において 表 2-1 に 掲 載 したように innerhtml や document.write()などのプロパティやメソッドが 使 われていることがわかった これらはウェブ ページの 構 造 (DOM ツリー)を 意 図 せず 変 更 してしまう 可 能 性 があるため 例 えば 引 数 として 渡 した 文 字 列 に HTML タグに 相 当 する 文 字 列 が 含 まれていれば それをタグとして 解 釈 し DOM ツリーを 変 更 してしまう 以 上 の 調 査 結 果 より innerhtml や document.write()などを 使 用 してウェブページに 情 報 を 出 力 する 処 理 に 不 備 があり 意 図 せず DOM ツリーを 変 更 してしまうことが DOM Based XSS の 脆 弱 性 を 作 り 込 む 原 因 になっていると IPA では 考 える ウェブページへの 出 力 処 理 に 関 するコード 記 述 箇 所 の 調 査 次 に JavaScript によるウェブページへの 出 力 処 理 がどこに 記 述 されているのかを 調 査 した そ の 結 果 問 題 の 出 力 処 理 が JavaScript ライブラリに 記 述 されている 届 出 が 23%(30 件 )あること がわかった JavaScript によるウェブページ 操 作 は jquery などの JavaScript ライブラリを 使 用 することがあるが そのライブラリの 古 いバージョンに 含 まれる 既 知 の 脆 弱 性 が 原 因 であった 問 題 のコードの 所 在 独 自 開 発 77% ライブ ラリ 23% 届 出 の 脆 弱 性 が 作 り 込 まれた 原 因 は JavaScript によるウェブ ページへの 出 力 処 理 の 不 備 と 言 えるが その 出 力 処 理 は 独 自 開 発 とは 限 らないという 結 果 が 出 た 2 割 以 上 の DOM Based XSS の 届 出 がライブラリに 起 因 して いることから JavaScript ライブラリのアップデートが 見 落 と されがちだと IPA では 推 測 する 3 chrome.* APIs - Google Chrome http://developer.chrome.com/extensions/api_index.html 10
3. DOM Based XSS の 事 例 本 章 では IPA に 届 け 出 られた DOM Based XSS の 脆 弱 性 関 連 情 報 を 基 に 脆 弱 性 が 作 り 込 ま れてしまった 例 を 紹 介 する どのような JavaScript のコードが 脆 弱 性 を 作 り 込 んでしまうのか 見 ていこう 3.1. 脆 弱 性 があるコード 例 の 紹 介 動 作 環 境 について JavaScript による DOM 操 作 は 特 定 ブラウザのみ 動 作 する または 動 作 はするが 挙 動 が 異 な るなどの 互 換 性 の 問 題 が 発 生 しやすい それ 故 にブラウザ 依 存 をする 攻 撃 も 存 在 する 本 項 で 紹 介 する 脆 弱 なコードについては Windows OS 上 で 動 作 する 下 記 の 主 要 ブラウザでどのような 挙 動 に なるのかを 確 認 し その 結 果 を 記 載 している なお 脆 弱 なコードは example.jp に 設 置 している ものと 仮 定 する Internet Explorer 8 Firefox 17.0.1 Opera 12.11 Internet Explorer 9 Chrome 24.0.1312.56 m Safari 5.1.7 ブラウザの XSS フィルタはデフォルトの 設 定 のまま 届 出 をもとにした 脆 弱 性 の 例 (1) リンク 情 報 を 動 的 に 出 力 する 処 理 に 問 題 がある ぼやきを 共 有 する 架 空 の 外 部 サービスがあるとする ここでは その 外 部 サービスと 連 携 する JavaScript コードに 問 題 がある 例 を 紹 介 する 問 題 のコード( 一 部 抜 粋 ) 1 2 3 4 5 6 7 8 <div id="q"></div> <script> var url = decodeuricomponent(location.href); var div = document.getelementbyid('q'); div.innerhtml = '<a href="http://(ぼやきサービスの 提 供 元 )/hoge?url=' + url + '" target="_blank">この 記 事 についてぼやく</a>'; </script> ブラウザ 毎 の 挙 動 http://example.jp/?"><img onerror='alert(document.domain)' src=x></img>にアクセスした 際 のブラウザの 挙 動 は 下 記 の 通 りである 対 象 ブラウザすべてでスクリプトが 実 行 されてしま った Internet Explorer 8 [ ] Firefox 17.0.1 [ ] Opera 12.11 [ ] Internet Explorer 9 [ ] Chrome 24.0.1312.56 m [ ] Safari 5.1.7 [ ] [ ]:スクリプトが 実 行 された [ ]:スクリプトが 実 行 されなかった 11
(2) アクセス 解 析 用 のタグの 設 置 方 法 に 問 題 がある 次 に ブラウザのリファラ 情 報 をアクセス 解 析 CGI に 送 信 する JavaScript コードに 問 題 がある 例 を 紹 介 する 問 題 のコード( 一 部 抜 粋 ) 1 <script> 2 3 4 document.write('<img src="http://example.jp/accesslog.cgi?ref=' + document.referrer + '" width="1" height="1">'); 5 </script> ブラウザ 毎 の 挙 動 http://example.com/?"><script>alert(document.domain);</script>にアクセスし そのページ から 脆 弱 なコードが 設 置 された http://example.jp/にアクセスした 際 のブラウザの 挙 動 は 下 記 の 通 りである Internet Explorer 8 [ ] Firefox 17.0.1 [ ] Opera 12.11 [ ] Internet Explorer 9 [ ] Chrome 24.0.1312.56 m [ ] Safari 5.1.7 [ ] [ ]:スクリプトが 実 行 された [ ]:スクリプトが 実 行 されなかった なお Internet Explorer 8 および 9 以 外 のウェブブラウザは リファラの 値 がパーセントエ ンコード 4 されているため 上 記 のスクリプトは 実 行 されなかった (3) JavaScript ライブラリに 問 題 がある JavaScript により 動 的 にウェブページを 操 作 する 場 合 jquery や Dojo Toolkit 5 などの JavaScript ライブラリを 使 用 することがあるが これらの JavaScript ライブラリに DOM Based XSS の 原 因 になり 得 る 問 題 が 見 つかることがあるため ウェブサイト 運 営 者 は 注 意 が 必 要 である 実 際 に IPA へ jquery Mobile というライブラリの 古 いバージョンに 起 因 する XSS の 届 出 もあっ た jquery Mobile の 古 いバージョンには ドメインが 異 なるサイトの HTML を 読 み 込 み 表 示 中 のページに 展 開 してしまう 問 題 があったため 攻 撃 者 が 用 意 したスクリプトを 表 示 中 のページで 実 行 させることも 可 能 であった 6 この 問 題 は jquery Mobile Beta 2 で 修 正 されたというアナウン スがなされている 7 なお 実 際 に DOM Based XSS の 脆 弱 性 が 作 り 込 まれるかどうかは ライブラリの 問 題 箇 所 や ウェブサイトの 作 りにも 依 存 する 4 RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax http://tools.ietf.org/html/rfc3986#section-2.1 5 Unbeatable JavaScript Tools - The Dojo Toolkit http://dojotoolkit.org/ 6 XSS with XHR level2 cross domain request Issue #1990 jquery/jquery-mobile GitHub https://github.com/jquery/jquery-mobile/issues/1990 7 jquery Mobile Beta 2 Released! jquery Mobile http://jquerymobile.com/blog/2011/08/03/jquery-mobile-beta-2-released/ 12
(4) ウェブブラウザのプラグインに 問 題 がある ウェブブラウザの 中 には 追 加 でプラグインをインストールすることにより 機 能 拡 張 が 可 能 なも のが 存 在 する ブラウザによって 呼 称 が 異 なり Firefox はアドオン Chrome は 拡 張 機 能 などと 呼 ばれる 例 えば Chrome の 拡 張 機 能 は HTML や JavaScript を 用 いて 作 成 できるが JavaScript のコードの 内 容 によっては DOM Based XSS の 脆 弱 性 を 作 り 込 んでしまう 問 題 のコード manifest.json 1 { 2 "name": "XSS-TEST", 3 "version": "1", 4 "manifest_version": 2, 5 "description": "DOM Based XSS PoC", 6 "content_scripts": [ { "matches": ["http://*/*"],"js": ["ipa.js"] } ] 7 } ipa.js 1 document.body.innerhtml += '<p>このページは' + location.href + 'です</p>'; ブラウザの 挙 動 上 記 の 拡 張 機 能 を Chrome にインストールした 状 態 で http://( 任 意 のサイト)/#<img src=x onerror=alert(document.domain)>にアクセスすると 当 該 サイトでスクリプトが 実 行 される Chrome 拡 張 機 能 の 注 意 点 とセキュリティ 機 構 注 意 点 Chrome のアドオンは 下 記 の URL 形 式 でアドオン 内 のファイルにアクセスできる 8 例 えば アドオン 内 に 開 発 者 が 用 意 した html ファイルを 設 置 し その html 内 に DOM Based XSS の 脆 弱 性 が 存 在 した 場 合 chrome-extension://<extensionid>/ipa.html#<img src=x onerror=alert(document.domain)>のような URL にユーザを 誘 導 すると 攻 撃 が 成 立 する さらに 当 該 拡 張 機 能 において 機 微 な 情 報 を localstorage 9 内 に 保 存 していた 場 合 は 攻 撃 者 が 用 意 したスクリプト 経 由 で 情 報 を 窃 取 改 ざん 削 除 される 可 能 性 がある セキュリティ 機 構 chrome-extension://<extensionid>/<pathtofile> Chrome 拡 張 機 能 では 意 図 しないスクリプト 実 行 を 回 避 するために Content Security Policy (CSP)と 呼 ばれるセキュリティ 機 構 を 実 装 し 始 めたようである この 機 構 が 動 作 すれば 特 定 の JavaScript の 実 行 を 制 限 し XSS の 脆 弱 性 の 影 響 を 軽 減 することができる 10 下 記 は CSP により Chrome がスクリプトの 実 行 を 拒 否 した 際 に Chrome の Developer Tools のコンソー ルに 出 力 されたメッセージである Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src 'self' chrome-extension-resource:". 8 Overview - Google Chrome http://developer.chrome.com/extensions/overview.html#relative-urls 9 Web Storage API の 構 成 要 素 の 一 つ ウェブブラウザに 比 較 的 大 きなデータを 永 続 的 に 保 存 できる 通 常 は 同 一 生 成 元 ポリシーの 制 限 があるため 同 一 生 成 元 からのみデータの 取 得 が 可 能 詳 しくはコラム 参 照 10 Content Security Policy (CSP) - Google Chrome http://developer.chrome.com/extensions/contentsecuritypolicy.html 13
4. DOM Based XSS の 対 策 方 法 本 章 では DOM Based XSS の 脆 弱 性 に 関 する 対 策 方 法 の 例 を 3 つ 紹 介 する DOM Based XSS の 脆 弱 性 は JavaScript によるウェブページへの 出 力 方 法 に 原 因 があるといえる ウェブページ へ 出 力 する 内 容 を 第 三 者 が 操 作 可 能 な 情 報 をもとにする 場 合 意 図 しないスクリプトの 埋 め 込 みや HTML タグが 挿 入 されないように 対 策 していただきたい 対 策 方 法 (1) DOM 操 作 用 のメソッドやプロパティを 使 用 する DOM 操 作 用 のメソッドやプロパティを 使 用 する これらは 意 図 しない DOM ツリーの 変 更 が 起 こりにくいため 結 果 的 に DOM Based XSS の 脆 弱 性 を 作 り 込 みにくくなる DOM 操 作 用 のメ ソッドの 一 部 を 下 記 に 示 す メソッド 名 createelement() createtextnode() appendchild() insertbefore() setattribute() 用 途 新 たに 要 素 ノードを 作 成 する 新 たにテキストノードを 作 成 する 指 定 したノードの 最 後 に 指 定 したノードを 挿 入 する 指 定 したノードの 直 前 に 指 定 したノードを 挿 入 する 指 定 した 属 性 に 指 定 した 値 を 設 定 する 3.1.(1)リンク 情 報 を 動 的 に 出 力 する 処 理 に 問 題 がある のコードを DOM 操 作 用 のメソ ッドを 使 うように 修 正 した 例 を 示 す コードの 修 正 例 1 <div id="q"></div> 2 <script> 3 var url = decodeuricomponent(location.href); 4 var div = document.getelementbyid('q'); 5 var a = document.createelement('a'); 6 a.setattribute('href','http://(ぼやきサービス)/hoge?url=' 7 + encodeuricomponent(url)); 8 a.setattribute('target','_blank'); 9 var newtext = document.createtextnode('この 記 事 についてぼやく'); 10 a.appendchild(newtext); 11 div.appendchild(a); 12 </script> 赤 字 が 修 正 箇 所 jquery 等 のライブラリを 使 用 している 場 合 は そのライブラリに DOM 操 作 用 のメソッドが 用 意 されていることがあるため そちらを 使 用 しても 同 様 の 効 果 が 見 込 める 14
(2) 文 脈 に 応 じてエスケープ 処 理 を 施 す innerhtml や document.write()などは DOM ツリーを 意 図 せず 変 更 してしまう 恐 れがある こ れらを 使 用 する 場 合 は 出 力 箇 所 の 文 脈 に 応 じてエスケープ 処 理 を 実 施 する 例 えば href 属 性 や src 属 性 の 値 の 一 部 として 出 力 する 際 は 値 は URI 形 式 であることが 想 定 されるため URI として 使 用 できない 文 字 をエンコード(パーセントエンコーディング)する 必 要 がある 下 記 に 3.1.(2)アクセス 解 析 用 のタグの 設 置 方 法 に 問 題 がある のコードの 修 正 例 を 示 す コードの 修 正 例 1 <script> 2 document.write('<img src="http://example.jp/accesslog.cgi?ref=' 3 + encodeuricomponent(document.referrer) 4 + '" width="1" height="1">'); 5 </script> 赤 字 が 修 正 箇 所 上 記 例 では encodeuricomponent()によりパーセントエンコーディングした 後 に ウェブペー ジに img 要 素 を 出 力 している 厳 密 には 下 記 のように 文 脈 に 応 じた 2 段 階 のエスケープ 処 理 が 必 要 だが パーセントエンコード 後 の URL には HTML エンコードが 必 要 な 記 号 は 現 れないはず なので 上 記 修 正 例 では HTML エンコードはしていない 1. URL(URI)を 組 み 立 てるために Referer をパーセントエンコードする 2. 組 み 立 てた URL を 属 性 値 に 埋 め 込 むために HTML エンコードする なお 基 本 ではあるが 属 性 値 の 始 まりと 終 わりをダブルクォート"で 明 示 するようにしよう 明 示 しない 場 合 属 性 値 の 終 端 の 解 釈 がブラウザにより 異 なる 可 能 性 が 出 てくる さらに 解 釈 の 差 異 が 意 図 しない 属 性 の 追 加 につながる 可 能 性 がある (3) JavaScript ライブラリの 問 題 の 場 合 は ライブラリをアップデートする JavaScript ライブラリに 問 題 があり DOM Based XSS の 脆 弱 性 が 作 り 込 まれてしまう 場 合 が ある ライブラリの 問 題 の 場 合 は 対 策 済 みのバージョンにアップデートする 必 要 がある ライブ ラリに 問 題 があるかどうかは 公 式 サイトの 情 報 を 確 認 いただきたい なお Google などが CDN(Content Delivery Network)で JavaScript ライブラリを 提 供 してい るが 使 用 方 法 によっては 常 に 最 新 版 のライブラリが 使 用 できる コード 例 Google の CDN から jquery 1 系 の 最 新 版 を 読 み 込 む 場 合 1 <script 2 src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"> 3 </script> 15
jquery.com の CDN から jquery の 最 新 版 を 読 み 込 む 場 合 1 <script 2 src="http://code.jquery.com/jquery-latest.min.js"> 3 </script> ただし CDN によるバージョンの 自 動 更 新 を 実 現 するためには ライブラリの 互 換 性 問 題 外 部 サービスの 利 用 可 否 などの 運 用 ポリシー 上 の 問 題 キャッシュによる 高 速 化 の 恩 恵 が 受 けにくく なる 点 についての 検 討 が 必 要 だろう 対 策 における 注 意 点 DOM Based XSS は 下 記 のような 特 徴 を 持 つため 攻 撃 を 防 ぐためには 問 題 箇 所 を 修 正 するとい う 根 本 的 な 対 策 が 他 の XSS の 脆 弱 性 と 比 べてより 重 要 となる ウェブサーバが 存 在 しなくとも DOM Based XSS の 脆 弱 性 が 作 り 込 まれる 可 能 性 がある DOM Based XSS は ウェブブラウザなどのクライアント 上 で 実 行 される JavaScript のコー ドに 問 題 があるため 作 り 込 まれてしまう 脆 弱 性 である そのため HTML+JavaScript で 構 成 されたブラウザのアドオンなどにも 当 該 脆 弱 性 が 作 り 込 まれてしまう 可 能 性 がある WAF(Web Application Firewall)や XSS フィルタで 防 ぐことが 困 難 である 上 述 したように 脆 弱 性 の 箇 所 によってはウェブサーバが 存 在 しなくとも DOM Based XSS が 作 り 込 まれる 場 合 がある また URL のフラグメント 識 別 子 の 値 を 使 った 攻 撃 の 場 合 は スクリプトに 相 当 する 文 字 列 はウェブサーバへ 送 信 されない 故 に WAF による 防 御 が 期 待 できない その 他 ウェブブラウザによっては XSS 攻 撃 を 検 知 して 防 御 する XSS フィルタ が 備 わっているが 現 状 の XSS フィルタでは DOM Based XSS の 攻 撃 を 検 知 しないケース が 多 いようだ 11 さらに JavaScript の 標 準 関 数 には HTML エスケープの 機 能 は 用 意 されていない 点 も 注 意 した い そのため HTML の 文 脈 でエスケープ 処 理 を 施 す 際 には 該 当 する 機 能 を JavaScript ライブ ラリを 使 用 して 実 装 する または 自 前 で 実 装 する 必 要 がある 11 Issue 142189 - chromium - Security: URL based DOM XSS bypass on XSS Auditor - An open-source browser project to help move the web forward. - Google Project Hosting http://code.google.com/p/chromium/issues/detail?id=142189 16
コラム 同 一 生 成 元 ポリシー(Same Origin Policy)について JavaScript から 動 的 にウェブページを 操 作 可 能 だが ウェブブラウザのセキュリティ 上 の 制 限 により 操 作 可 能 な 範 囲 を 同 一 生 成 元 (Same Origin)に 制 限 されている RFC 6454 によると 下 記 3 つが 一 致 しているリソースを 同 一 生 成 元 と 呼 んでいる スキーム://ホスト:ポート 番 号 URL のホスト( 例 :www.example.jp, trap.example.jp) スキーム( 例 :http, https, ftp) ポート 番 号 ( 例 :80, 8080, 443) JavaScript から 異 なる 生 成 元 の 情 報 は 操 作 できないため 攻 撃 者 は XSS の 脆 弱 性 を 悪 用 し 攻 撃 対 象 のウェブページで JavaScript を 実 行 させ 同 一 生 成 元 ポリシーの 制 限 を 迂 回 する 利 用 者 は 2つのサイトを 同 時 に 閲 覧 このスクリプトは trap.example.com( 同 一 生 成 元 )の 情 報 しか 操 作 できない www.example.jp 利 用 者 攻 撃 者 trap.example.com 脆 弱 性 体 験 学 習 ツール AppGoat について IPA では 脆 弱 性 が 作 り 込 まれる 原 理 や 対 策 方 法 を 学 習 するツール AppGoat を 無 償 で 公 開 し ている AppGoat のウェブアプリケーション 版 には 故 意 に 脆 弱 性 を 作 り 込 んだウェブアプリ が 内 在 しているため 実 習 形 式 で 脆 弱 性 の 学 習 が 可 能 である DOM Based XSS の 学 習 テーマも 含 まれているため 興 味 がある 方 は 下 記 からダウンロードいただきたい 脆 弱 性 体 験 学 習 ツール AppGoat http://www.ipa.go.jp/security/vuln/appgoat/index.html 17
おわりに DOM Based XSS の 脆 弱 性 について IPA への 届 出 件 数 は 増 加 傾 向 にあります しかし ウェブ サイト 運 営 者 やソフトウェア 開 発 者 の 方 々に DOM Based XSS の 脆 弱 性 を 理 解 していただくため に 提 示 する 資 料 がないという 状 況 でした そのため 本 資 料 を 執 筆 しました 執 筆 のきっかけとな る 届 出 をしていただいた 発 見 者 の 方 々に 感 謝 します 今 後 も IPA は セキュリティに 関 する 有 用 な 情 報 を 発 信 できるよう 活 動 を 続 けていきます 18
IPA テクニカルウォッチ DOM Based XSS に 関 するレポート [ 発 行 ] 2013 年 1 月 29 日 [ 著 作 制 作 ] 独 立 行 政 法 人 情 報 処 理 推 進 機 構 セキュリティセンター 編 集 責 任 小 林 偉 昭 執 筆 者 谷 口 隼 祐 永 安 佑 希 允 協 力 者 徳 丸 浩 ( 非 常 勤 研 究 員 )