自己紹介 長谷川陽介 ( はせがわようすけ ( 株 ) セキュアスカイ テクノロジー常勤技術顧問 セキュリティキャンプ講師 (2008 年 ~) OWASP Kansai チャプターリーダー OWASP Japan ボードメンバー CODE BLUE カンファレ

Similar documents
長谷川陽介 ( はせがわようすけ OWASP Kansai チャプターリーダー OWASP Japan アドバイザリボードメンバー 株式会社セキュアスカイ テクノロジー CTO セキュリティキャンプ講師 (2008~) CODE BLUE カンファレンスレビュー

自己紹介 はせがわようすけ ネットエージェント株式会社 株式会社セキュアスカイ テクノロジー技術顧問 OWASP Kansai Chapter Leader OWASP Japan Chapter Advisory Board member

自己紹介 はせがわようすけ ネットエージェント株式会社 株式会社セキュアスカイ テクノロジー技術顧問 OWASP Kansai Chapter Leader OWASP Japan Chapter Advisory Board member

WEBシステムのセキュリティ技術

はせがわようすけ OWASP Kansai チャプターリーダー OWASP Japan アドバイザリボードメンバー 株 式 会 社 セキュアスカイ テクノロジー 常 勤 技 術 顧 問 CODE BLUE Security Conference Review board member セキュリティキ

自 己 紹 介 ( 株 )セキュアスカイ テクノロジー 常 勤 技 術 顧 問 OWASP Kansaiチャプターリーダー OWASP Japanボードメンバー http//utf-8.jp/

自己紹介 はせがわようすけ ネットエージェント株式会社 株式会社セキュアスカイ テクノロジー技術顧問 Microsoft MVP for Consumer Security Oct

Yosuke Secure Sky Technology Inc. Technical Advisor OWASP Kansai Chapter Leader OWASP Japan Chapter board member CODE BLUE Re

自己紹介 XSS のほうから来ました author of jjencode, aaencode

自己紹介 はせがわようすけ ネットエージェント株式会社 株式会社セキュアスカイ テクノロジー技術顧問 セキュリティ キャンプ Webセキュリティクラス OWASP Kansai Chapter Leader OWASP Japan board member

Microsoft Word 基_シラバス.doc

— intra-martで運用する場合のセキュリティの考え方    

今から始めるHTML5セキュリティ

SQL インジェクションの脆弱性

別添 2 SQL インジェクション ぜい弱性診断で最低限行うべき項目 1 ( ' ( 検索キー )''-- ( 検索キー ) and 'a'='a ( 検索キー ) and 1=1 は最低限 行うこと ) OS コマンドインジェクション 2 (../../../../../../../bin/sle


Webプログラミング演習

JavaScript 演習 2 1

第 8 回の内容 クライアントサイド処理 JavaScript の基礎

Microsoft PowerPoint _2b-DOM.pptx

9 WEB監視

内容 ( 演習 1) 脆弱性の原理解説 基礎知識 脆弱性の発見方法 演習 1: 意図しない命令の実行 演習解説 2

PowerPoint プレゼンテーション

SOC Report

自己紹介 はせがわようすけ OWASP Kansai チャプターリーダー OWASP Japan アドバイザリボードメンバー 株式会社セキュアスカイ テクノロジー常勤技術顧問 CODE BLUE Security Conference Review board member セキュリティキャンプ講師

Web のしくみと応用 ('15) 回テーマ 1 身近なWeb 2 Webの基礎 3 ハイパーメディアとHTML 4 HTMLとCSS 5 HTTP (1) 6 HTTP (2) 7 動的なWebサイト 8 クライアントサイドの技術 回 テーマ 9 リレーショナルデータベース 10 SQL とデータ

SOC Report

PowerPoint プレゼンテーション

SOC Report

SOC Report

Webプログラミング演習

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

Web データ管理 JavaScript (1) (4 章 ) 2011/12/7( 水 ) 湘南工科大学講義資料 Web データ管理 (2011) 阿倍 1/21

2.2 Reflected XSS 攻撃攻撃者の用意した悪意のあるリンクとターゲットサーバが同じホストである場合の Reflected XSS 攻撃を, 本稿では Reflected XSS 攻撃と呼ぶ. 例えば, サーバ A の target.php に Reflected XSS 脆弱性があった

SmartBrowser_document_build30_update.pptx

20th Embarcadero Developer Camp

JPCERT/CCとは 一 般 社 団 法 人 JPCERTコーディネーションセンター (JPCERT/CC (ジェーピーサート コーディネーションセンター)) Japan Computer Emergency Response Team Coordination Center

SQLインジェクション・ワームに関する現状と推奨する対策案

自己紹介 名前 : 一ノ瀬太樹 所属 : HASH コンサルティング株式会社 OWASP Japan プロモーションチーム OWASP ZAP ユーザーグループ脆弱性診断研究会 ( 管理者その 3) Perl 入学式 ( サポーター ) HASH Consult

安全な Web サイトの作り方 7 版 と Android アプリの脆弱性対策 独立行政法人情報処理推進機構 (IPA) 技術本部セキュリティセンター Copyright 2015 独立行政法人情報処理推進機構

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成

改訂履歴 改訂日 バージョン 作成者 2014/1/1 Ver VALTES 初版作成 改訂内容及び理由

PowerPoint プレゼンテーション

ウェブデザイン技能検定 1 級実技 平成 28 年度 第 4 回 ウェブデザイン技能検定 1 級 実技試験概要 試験にあたっての注意事項 試験者は本試験の留意事項 注意事項に留意して作業を行うこと ペーパー実技試験は 課題 1 から 5 までの 5 課題を 60 分間で行うこと 作業実技試験は 課題

べきでない悪意のあるSQL 文が攻撃者から入力された場合 データベースで実行される前にSQL 文として処理されないよう無効化する必要がありますが ( 図 1 1) 無効化されずにデータベースで実行された場合 データベースの操作が可能となります ( 図 1 2) 本脆弱性を悪用するとデータベース接続ユ

演習室の PC のハードディスクには演習で作成したデータは保管できません 各 PC の ネットワーク接続 ショートカットからメディア情報センターのサーバーにアクセスしてください (Z ドライブとして使用できます ) 演習名 使用するフォルダ 演習 1 Z: Web データ管理 演習

目次〜.indd

Oracle Web CacheによるOracle WebCenter Spacesパフォーマンスの向上

メディプロ1 Javaサーブレット補足資料.ppt

Microsoft Word - Webシステム/Webアプリケーション セキュリティ要件書 docx

ロイロノートスクールクラウド版表 クラウド サービス利 弊社が 意しているクラウドサービスへ接続し利 するシンプルなプランです サービスだけで利 することができます プラン 保存可能な容量 / ユーザー 額の場合 / ユーザー 年額の場合 / ユーザー 共 タブレット向け 1 0.8GB 40 円

SOC Report

SiteLock操作マニュアル

目次 1 はじめに 本資料について 用語の説明 サービス概要 シマンテッククラウド型 WAF について ウェブアプリケーションファイアウォール機能 ブロック モニタリング機能

Rmenuフレームワーク

多言語ドメイン名の実装 mdnkit 石曽根信 ( 株 ) SRA 2001/12/04 日本語ドメイン名解説 / mdnkit 1 mdnkit 多言語ドメイン名を扱うためのツールキット 正規化 エンコード変換等を提供するライブラリとコマンド 既存アプリケーシ

ログを活用したActive Directoryに対する攻撃の検知と対策

PowerPoint プレゼンテーション

Web Gateway資料(EWS比較付)

SOC Report

AJAXを使用した高い対話性を誇るポートレットの構築

自己紹介とお約束

第 7 回の内容 動的な Web サイト フォーム Web システムの構成

目次

5-5_arai_JPNICSecSemi_XssCsrf_CM_ PDF

Mobile Access簡易設定ガイド

スライド 1

第7回 Javascript入門

目的 概要 全体像 概念図 用語の定義 用語 説明 用語 説明 用語 説明 用語 説明 参考資料

2. 動的コンテンツとは動的コンテンツとは Web ブラウザからの要求に応じて動的に Web ページや画像などを生成する Web コンテンツのことをいいます Web で利用するサーチエンジンやアクセスカウンタ等は この仕組みを用いています 動的コンテンツは大きく次の二つに分類されます (1) Web

セキュリティ診断サービスのご紹介

アジェンダ 0. 導入 1. Web API(Web サービス ) 2. マッシュアップの構図 3. ブラウザオブジェクト < 休憩 > 4. クライアント側コードに起因するスクリプト注入 5. 同一源泉 と 他源泉 6. 他のマッシュアップ論点の学習方法 2

1. SQL インジェクションの問題と脅威 2

SOC Report

なぜIDSIPSは必要なのか?(v1.1).ppt

SmallTown 日付オブジェクト 日付オブジェクトを使ってページ内にいろいろな仕掛けをつくってみよう 1. 日付オブジェクトとは JavaScriptではいろいろなオブジェクトを扱えますが 日付オブジェクトもその一つです 手順としては 1 日付オブジェクトを作成する2そのオブジェクトから日にちや

PowerPoint プレゼンテーション

html5_ver2_kai.pdf

HTTP 404 への対処

安全なウェブサイトの作り方 7 版 の内容と資料活用例 2

Web プログラミング 1 JavaScript (3) (4 章 ) 2013/7/3( 水 ) 日時 講義内容 4/10 ( 水 ) ガイダンス Web (1 章 ) 4/17 ( 水 ) HTML+CSS (1) (2 章 ) 4/24 ( 水 ) HTML+CSS (2) (2 章 ) 5/

-調達要求番号:

コンテンツメディアプログラミング実習2

JavaScript 1.! DOM Ajax Shelley Powers,, JavaScript David Flanagan, JavaScript 2

2015 年 4 月 15 日に発表された HTTP.sys の脆弱性 ( ) へ の対応について 製品名 : バージョン : 対象プラットフォーム : カテゴリ : iautolaymagic すべてすべて Web アプリ この度 マイクロソフト社製品において緊急度の高い脆弱性 (CV

延命セキュリティ製品 製品名お客様の想定対象 OS McAfee Embedded Control 特定の業務で利用する物理 PC 仮想 PC や Server 2003 Server 2003 ホワイトリスト型 Trend Micro Safe Lock 特定の業務で利用するスタンドアロン PC

◎phpapi.indd

Oracle Un お問合せ : Oracle Data Integrator 11g: データ統合設定と管理 期間 ( 標準日数 ):5 コースの概要 Oracle Data Integratorは すべてのデータ統合要件 ( 大量の高パフォーマンス バッチ ローブンの統合プロセスおよ

Adobe AIR のセキュリティ

Nagios XI Webサイトの改ざん監視

WSMGR for Web External V7.2 L50 ご紹介

PowerPoint プレゼンテーション

Web プログラミング 1 JavaScript (4) (4 章 ) 2013/7/17( 水 ) 日時 講義内容 4/10 ( 水 ) ガイダンス Web (1 章 ) 4/17 ( 水 ) HTML+CSS (1) (2 章 ) 4/24 ( 水 ) HTML+CSS (2) (2 章 ) 5

PowerPoint Presentation

IBM FormWave for WebSphere 公開技術文書 #FWTEC0012 リッチ ユーザーインターフェースのクライア ント操作画面サンプルでブランク伝票が一覧に すべて表示されない問題の対処方法 最終更新日 :2009/11/20 Copyright International Bu

2011 年第 3 四半期脆弱性対策情報データベース JVN ipedia の登録状況 ( 詳細 ) 1. 脆弱性対策情報の登録状況 1.1 今四半期に登録した脆弱性の種類別件数 す 別紙 2 共通脆弱性タイプ一覧 CWE ( *12) は 脆弱性の種類を識別するための共通の脆弱性タイプの一覧で C

目次 1. 概要 2. サーバーへの設置 3. 設定 4. ユーザーアクセス記録の収集 5. 利用規定 6. 更新履歴

クイックマニュアル(利用者編)

Oracleセキュア・エンタープライズ・サーチ

情報システム設計論II ユーザインタフェース(1)

Transcription:

PHP デベロッパーのための JavaScript セキュリティ入門 ( 株 ) セキュアスカイ テクノロジー 常勤技術顧問 長谷川陽介 PHP カンファレンス福岡 2016

自己紹介 長谷川陽介 ( はせがわようすけ / @hasegawayosuke) ( 株 ) セキュアスカイ テクノロジー常勤技術顧問 セキュリティキャンプ講師 (2008 年 ~) OWASP Kansai チャプターリーダー OWASP Japan ボードメンバー CODE BLUE カンファレンスレビューボード http//utf-8.jp/ jjencode とか aaencode とか

宣伝 : 本が出ました!!

ブラウザハック Wade Alcorn Christian Frichot Michele Orrù 著 園田道夫 西村宗晃 はせがわようすけ監修 http://www.shoeisha.co.jp/ book/detail/9784798143439

ブラウザハック 書籍内 日本人で唯一のバイネームな記述

ブラウザハック 書籍内 日本人で唯一のバイネームな記述 監修者まえがき 特に原稿が遅いはせがわようすけさんにはハラハラさせられました ( Д`;) まじすみません

ブラウザハック 書籍内 日本人で唯一のバイネームな記述 監修者まえがき 特に原稿が遅いはせがわようすけさんにはハラハラさせられました 2009 年に日本のセキュリティ研究家のはせがわようすけが ( Д`;) [],$_+:~{} まじすみませんとその他わずかの のみで JavaScriptコードを jjencode!! v(*'ω'*)v

なぜ JavaScript なのか おれは PHP デベロッパーだ! いまさら JS なんて

なぜ JavaScript なのか ブラウザの高機能化 HTML5 による表現力の向上 JavaScript の処理速度の向上 JavaScript プログラミング効率の向上 言語仕様の充実化 プログラミング環境の改善 実行コードのブラウザ上へのシフト ネイティブアプリから Web アプリへ 従来サーバ側で行っていた処理がクライアントの JavaScript 上へ

セキュリティ対策もフロントエンドへ 脆弱性もフロントエンドで増加 JavaScript コード量や扱うデータが増加 比例して脆弱性も増加 XSS や CSRF などの比重が増加 Web 開発者であるからにはフロントエンドの知識も要求されて普通という時代へ 今だからこその JavaScript 当然 セキュリティに関連する技術も必要 サーバサイドでもセキュアな API のデザインなど

フロントエンドでのセキュリティ問題 ブラウザ上で発生する脆弱性 オープンリダイレクタ DOM-based XSS CSRF Ajax データの漏えい クライアントサイドでの不適切なデータ保存 DOM API の不適切な使用 などなど サイトを訪問することによって発生 すなわち受動的攻撃

フロントエンドのセキュリティ対策 攻撃側は新しい Web 技術をもっとも活用できる 新しいブラウザの機能 新しい HTML 要素 新しい JS API クロスブラウザ対応は不要 誰に遠慮する必要もなく 使いたい技術を選んで使える 多少不安定な技術でも構わない 残念ながら 銀の弾丸 は存在しない これさえやっておけば という効果的な対応方法は存在しない 地道な努力 地道な対応あるのみ

今日の話 フロントエンドの比重が高まるなかで 最低限の JavaScript のセキュリティ対策の話に限定 JavaScript に関するセキュリティ問題 オープンリダイレクタ DOM-based XSS PHP デベロッパーでもこれくらいは対応しておいてほしいという思いで話します!

っと その前に 脆弱性 ってなんだっけ

クロスサイトスクリプティング 書式文字列攻撃 SQL インジェクション パストラバーサル CSRF LDAP インジェクション 強制ブラウズリモートファイルインクルード バッファオーバーフロー セッションハイジャック そもそも 脆弱性 って何? OS コマンドインジェクション セッション固定攻撃 HTTPレスポンス分割メモリリーク オープンリダイレクタ DoS XPath インジェクション HTTP ヘッダインジェクション

そもそも 脆弱性 って何? 脆弱性 という言葉を使ったことは? 脆弱性 を見つけたことは? 脆弱性 を説明できる人 挙手!

脆弱性 の定義 経済産業省告示第 235 号 ソフトウエア等において コンピュータウイルス コンピュータ不正アクセス等の攻撃によりその機能や性能を損なう原因となり得る安全性上の問題箇所ウェブアプリケーションにあっては ウェブサイト運営者がアクセス制御機能により保護すべき情報等に誰もがアクセスできるような 安全性が欠如している状態を含む http://www.meti.go.jp/policy/netsecurity/downloadfiles/vulhandlingg.pdf

脆弱性 の定義 IPA による定義 脆弱性とは ソフトウエア製品やウェブアプリケーション等におけるセキュリティ上の問題箇所です コンピュータ不正アクセスやコンピュータウイルス等により この問題の箇所が攻撃されることで そのソフトウエア製品やウェブアプリケーションの本来の機能や性能を損なう原因となり得るものをいいます また 個人情報等が適切なアクセス制御の下に管理されていないなど ウェブサイト運営者の不適切な運用により ウェブアプリケーションのセキュリティが維持できなくなっている状態も含みます http://www.ipa.go.jp/security/vuln/report/index.html

脆弱性 の定義 Microsoft による定義 セキュリティの脆弱性とは 攻撃者が製品の完全性 可用性 または機密性を侵害する可能性のある製品の弱点です http://technet.microsoft.com/ja-jp/library/gg983510.aspx

脆弱性 の定義 脆弱性はただのバグ 脆弱性はバグの一種です 一般的なバグは できるはずのことができない というものですが 脆弱性は できないはずのことができる というバグです もっと言うと できてはいけないことができる ということです HASH コンサルティング徳丸浩さん

脆弱性はただのバグ バグの少ないプログラム = 脆弱性も少ない 脆弱性を減らすにはバグを減らせばいい バグは少ないのに脆弱性が多い バグは多いのに脆弱性が少ない という例はほとんどない まずはプログラムの品質をあげよう!

本題 : JavaScript のセキュリティ

JavaScript に関するセキュリティ問題 ブラウザ上で発生する問題 - 受動的攻撃 攻撃者のしかけた罠をトリガに ユーザーのブラウザ上で問題が発生する 能動的攻撃 Web サーバー 受動的攻撃 Web サーバー

JavaScript に関するセキュリティ問題 主なセキュリティ上の問題 JavaScript によるオープンリダイレクタ DOM-based XSS XHR を用いた CSRF Ajax データの漏えい クライアントサイドでの不適切なデータ保存 その他 DOM API の不適切な使用

JavaScript に関するセキュリティ問題 主なセキュリティ上の問題 JavaScriptによるオープンリダイレクタ今日話す DOM-based XSS 内容 XHRを用いたCSRF Ajaxデータの漏えい クライアントサイドでの不適切なデータ保存 その他 DOM APIの不適切な使用

JavaScript に関するセキュリティ問題 主なセキュリティ上の問題 JavaScriptによるオープンリダイレクタ今日話す DOM-based XSS 内容 XHRを用いたCSRF Ajaxデータの漏えい クライアントサイドでの不適切なデータ保存 その他 DOM APIの不適切な使用 JPCERT/CC HTML5 を利用した Web アプリケーションのセキュリティ問題に関する調査報告書 を参照 http://www.jpcert.or.jp/research/html5.html

JS によるオープンリダイレクタ

JS によるオープンリダイレクタ JavaScript によるリダイレクト ( ページ移動 ) location.href = url; location.assign( url ); 遷移先ページが攻撃者によってコントロール可能な場合 オープンリダイレクタとなる // bad code. URL 中の # より後ろを次の URL として表示する // http://example.jp/#next など var url = "/" + location.hash.substr(1); // /next に移動 location.href = url; 攻撃者は http://example.jp/#/evil.utf-8.jp/ などにユーザーを誘導 location.href = "//evil.utf-8.jp/"

JS によるオープンリダイレクタ オープンリダイレクタ 任意のサイトにリダイレクトされてしまう それ自体は実質的に大きな問題があるわけではない 間接的な影響 元サイト内のコンテンツのように見せかけてユーザーを誘導 フィッシングサイトへの誘導 ドメインを信頼して訪問したユーザーを裏切ることにもなる

JS によるオープンリダイレクタ オープンリダイレクタとならないために 遷移先を固定リストで持つ // URL 中の # より後ろを次の URL として表示する // http://example.jp/#next など const pages = { next:"/next", foo:"/foo", bar:"/bar" }; const url = pages[ location.hash.substr(1) ] "/notfound"; location.href = url; 遷移先 URL として自サイトのドメイン名を先頭に付与する const url = location.origin + "/" + location.hash.substr(1); location.href = url;

JS によるオープンリダイレクタ オープンリダイレクタとならないために ( 続き ) Chrome,Firefox では URL オブジェクトを利用してオリジンを確認 // 相対 URL 等を絶対 URL の URL オブジェクトに変換 const url = new URL( text, location.href ); if( url.origin === "http://example.jp" ){ location.href = url; } IE では a 要素を使って同種のことが実現可能コードは割愛 http://d.hatena.ne.jp/hasegawayosuke/20151204/p1

DOM-based XSS

DOM-based XSS JavaScript が引き起こす XSS サーバ上での HTML 生成には問題なし JavaScript によるレンダリング時にブラウザ上で問題が発生する // bad code // http://example.jp/#<img src=0 onerror=alert(1)> <html> <script> document.write( location.hash.substring(1) ); </script> </html>

DOM-based XSS JavaScript が実行されるまで XSS の存在がわからない 既存の検査ツールでは検出不可な場合も 生成される HTML 自体には問題はない リクエスト / レスポンスの監視だけでは見つからない 検査ツール <xss> Web サーバー ブラウザ <xss> <xss>

DOM-based XSS 静的コンテンツのみでも XSS する可能性 動的に HTML を生成する Web アプリケーション ではなく *.html しか提供してなくても XSS のある可能性がある <html> <script> document.write( location.hash.substring(1) ); </script> </html> 静的コンテンツのみの Web サーバー ブラウザ

DOM-based XSS 攻撃者は JavaScript を読むことができる じっくり読んで脆弱性を探すことが可能 脆弱性の有無を確認するための試行リクエストは不要 一撃必殺 で XSS を成功させる

DOM-based XSS IE10, XSS フィルターを通過

DOM-based XSS 圧倒的に不利な状況 JavaScript コード量の大幅な増加 XSS フィルタを通過することがある サーバのログに残らないことがある これまでの検査方法では見つからない 静的コンテンツでも XSS する 攻撃者は時間をかけて XSS を探す 開発時点で作りこまない必要性

DOM-based XSS 原因と対策 原因 攻撃者の与えた文字列が JavaScript 上のコードのどこかで 文字列から HTML を生成あるいは JavaScript コードとして実行される //http://example.jp/#<img src=0 onerror=alert(1)> <html> <script> document.write( location.hash.substring(1) ); </script> </html>

DOM-based XSS 原因と対策 原因 攻撃者の与えた文字列が JavaScript 上のコードのどこかで 文字列から HTML を生成あるいは JavaScript コードとして実行される //http://example.jp/#<img src=0 onerror=alert(1)> <html> <script> document.write( location.hash.substring(1) ); </script> </html>

DOM-based XSS 原因と対策 原因 攻撃者の与えた文字列が JavaScript 上のコードのどこかで 文字列から HTML を生成あるいは JavaScript コードとして実行される //http://example.jp/#<img src=0 onerror=alert(1)> <html> <script> document.write( location.hash.substring(1) ); </script> </html>

DOM-based XSS 原因と対策 原因 攻撃者の与えた文字列が JavaScript 上のコードのどこかで 文字列から HTML を生成あるいは JavaScript コードとして実行される //http://example.jp/#<img src=0 onerror=alert(1)> <html> <script> document.write( location.hash.substring(1) ); </script> </html> シンク ソース

DOM-based XSS 原因と対策 ソース 攻撃者の与えた文字列の含まれる箇所 シンク 文字列から HTML を生成したりコードとして実行する部分 ソース 処理 シンク

DOM-based XSS 原因と対策 ソース 攻撃者の与えた文字列の含まれる箇所 シンク 文字列から HTML を生成したりコードとして実行する部分 location. hash document. referrer location. search ソース 処理 シンク XHR etc...

DOM-based XSS 原因と対策 ソース 攻撃者の与えた文字列の含まれる箇所 シンク 文字列から HTML を生成したりコードとして実行する部分 location. hash document. referrer location. href document. write location. search ソース 処理 シンク etc... XHR etc... eval innerhtml

DOM-based XSS 原因と対策 対策 HTML 生成時にエスケープ / 適切な DOM 操作 URL の生成時は http(s) に限定 使用しているライブラリの更新 サーバ側での XSS 対策と同じ これまでサーバ上で行っていたことを JavaScript 上で行う

DOM-based XSS 原因と対策 対策 HTML 生成時にエスケープ / 適切な DOM 操作 URL の生成時は http(s) に限定 使用しているライブラリの更新 サーバ側での XSS 対策と同じ これまでサーバ上で行っていたことを JavaScript 上で行う

DOM-based XSS 原因と対策 HTML 生成時に適切な DOM 操作 JavaScript でレンダリングされる直前 エスケープ ではなく適切な DOM 操作関数 // bad code document.write( location.hash.substring( 1 ) ); const text = document.createtextnode( location.hash.substr( 1 ) ); document.body.appendchild( text );

DOM-based XSS 原因と対策 テキストノードだけでなく属性値も // bad code var text = "..."; // 変数 textは攻撃者がコントロール可能 form.innerhtml = '<input type="text" name="key" value="' + text + '">'; <input... value=""><script>...</script ""> const text = "..."; // 変数 text は攻撃者がコントロール可能 const elm = document.createelement( "input" ); elm.setattribute( "type", "text" ); elm.setattribute( "name", "key" ); elm.setattribute( "value", text ); // 属性値を設定する form.appendchild( elm );

DOM-based XSS 原因と対策 HTML 生成時に適切な DOM 操作関数 テキストノードの生成 createtextnode, innertext, textcontent 属性の設定 setattribute シンクとなる API を不用意に使用しない innerhtml, document.write,...

DOM-based XSS 原因と対策 とはいえ innerhtml を使わざるを得ないケースもある サーバから HTML 断片を XHR で取得し HTML 内に挿入する等 // bad code // http://example.jp/#news のような URL でアクセスすると // /news の内容を XHR で取得して HTML として挿入 var url = "/" + location.hash.substr(1); var xhr = new XMLHttpRequest(); xhr.open( "GET", url, true ); xhr.onload = function(){ document.getelementbyid( "news-list" ).innerhtml = xhr.responsetext } xhr.send( null );

XMLHttpRequest 経由での XSS 攻撃者が http://example.jp/#/attacker.example.com/ のような URL に誘導することで本来とは異なるサーバから HTML 断片がロードされてしまう // bad code // http://example.jp/#news のようなURLでアクセスすると // /news の内容をXHRで取得してHTMLとして挿入 var url = "/" + location.hash.substr(1); var xhr = new XMLHttpRequest(); xhr.open( "GET", url, true ); url = " //attacker.example.com/ " xhr.onload = function(){ document.getelementbyid( "news-list" ).innerhtml = xhr.responsetext } xhr.send( null );

XMLHttpRequest 経由での XSS サーバ側で生成済みの HTML 断片をブラウザ内に流し込みたい HTML 断片なのでテキストノードとして扱えない innerhtml を使うしかない 対策 : 自身のサーバ以外とは接続できないよう URL を限定する オープンリダイレクタ対策と同様 URL を固定リストで持つ 自サイトのドメイン名を先頭に付与する URL オブジェクトを使って絶対 URL を生成

XMLHttpRequest 経由での XSS 対策 - 自身のサーバ以外とは接続できないようにする URL を固定リストで持つ // URL 中の # より後ろを次の URL として表示する // http://example.jp/#next など const pages = { news:"/news", info:"/info", foo:"/foo" }; const url = pages[ location.hash.substr(1) ]; if( url ){ xhr = new XMLHttpRequest(); xhr.open( "GET", url, true ); xhr.onload = function(){ elm.innerhtml = xhr.responsetext; } xhr.send( null ); }

XMLHttpRequest 経由での XSS 対策 - 自身のサーバ以外とは接続できないようにする URL 先頭に自身のホスト名を付与する方法はオープンリダイレクタが存在していると攻撃者に回避されてしまうのであまり勧められない // あまりよくないコード const url = location.origin + "/" + location.hash.substr(1); if( url ){ xhr = new XMLHttpRequest(); xhr.open( "GET", url, true );... http://example.jp/redir?url=http://utf-8.jp/ のようなオープンリダイレクタが存在していると http://example.jp/#redir?url=http://utf-8.jp/ のような指定で他サイトから XHR で取得してしまう

DOM-based XSS 原因と対策 対策 HTML 生成時にエスケープ / 適切な DOM 操作 URL の生成時は http(s) に限定 使用しているライブラリの更新 サーバ側での XSS 対策と同じ これまでサーバ上で行っていたことを JavaScript 上で行う

DOM-based XSS 原因と対策 URL の生成時は http(s) に限定 //bad code // <a id="link"> リンク </a> var url = "..."; // 変数 urlは攻撃者がコントロール可能 var elm = document.getelementbyid( "link" ); elm.setattribute( "href", url ); <a id="link" href=" javascript:alert(1) "> リンク </a> // url が http:// https:// で始まる場合のみに限定 if( url.match( /^https?: / // ) ){ const elm = document.getelementbyid( "link" ); elm.setattribute( "href", url ); }

DOM-based XSS 原因と対策 URL の生成時は http(s) に限定 他のスキームが入り込まないように javascript:, vbscript:, data:, <a> 要素だけでなく location オブジェクトの操作時にも注意 // bad code var url = "javascript:alert(1)"; location.href = url; // XSS location.assign( url ); // XSS if( url.match( /^https?: / // ) ){ locatoin.href = url; }

DOM-based XSS 原因と対策 Chrome,Firefox であれば URL オブジェクトも利用可能 const url = new URL( text, location.href ); if( url.protocol.match( /^https?/ ) ){ // http or https } IE では a 要素を使って同種のことが実現可能 コードは割愛 http://d.hatena.ne.jp/hasegawayosuke/20141030/p1

DOM-based XSS 原因と対策 対策 HTML 生成時にエスケープ / 適切な DOM 操作 URL の生成時は http(s) に限定 使用しているライブラリの更新 サーバ側での XSS 対策と同じ これまでサーバ上で行っていたことを JavaScript 上で行う

DOM-based XSS 原因と対策 使用してるライブラリの更新 JavaScript ライブラリの脆弱性対応 使用している JS ライブラリの更新を把握すること Masato Kinugawa Security Blog: jquery Mobile 1.2 Beta 未満は読み込んでいるだけで XSS 脆弱性を作ります http://masatokinugawa.l0.cm/2012/09/jquery-mobile-location.href-xss.html サーバ側のミドルウェア等の運用と同じ

DOM-based XSS 原因と対策 対策 HTML 生成時にエスケープ / 適切な DOM 操作 URL の生成時は http(s) に限定 使用しているライブラリの更新 サーバ側での XSS 対策と同じ これまでサーバ上で行っていたことを JavaScript 上で行う

まとめ ブラウザ上 JavaScript 上の脆弱性が増加 JS コード量 処理量の増加 脆弱性はただのバグ バグを減らす = 脆弱性が減る 攻撃者有利な状況 脆弱性を作りこまない必要性

質問? hasegawa@utf-8.jp hasegawa@securesky-tech.com @hasegawayosuke http://utf-8.jp/