Upload
Download free for 30 days
Login
Submit search
そろそろ押さえておきたい AngularJSのセキュリティ
74 likes
25,908 views
Muneaki Nishimura
ng-mtg#6 AngularJS勉強会の発表資料です。
Technology
Read more
1 of 34
Download now
Downloaded 80 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
More Related Content
PPTX
WkWebViewのキャッシュについて調べた
firewood
PDF
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
貴志 上坂
PPTX
Angular
sridhiya
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
PPTX
OWASP ZAP Workshop for QA Testers
Javan Rasokat
PDF
負荷テストを行う際に知っておきたいこと 初心者編
まべ☆てっく運営
PDF
文字コードに起因する脆弱性とその対策
Hiroshi Tokumaru
PDF
Gaming on aws 〜ゲームにおけるAWS最新活用術〜
Amazon Web Services Japan
WkWebViewのキャッシュについて調べた
firewood
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
貴志 上坂
Angular
sridhiya
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
OWASP ZAP Workshop for QA Testers
Javan Rasokat
負荷テストを行う際に知っておきたいこと 初心者編
まべ☆てっく運営
文字コードに起因する脆弱性とその対策
Hiroshi Tokumaru
Gaming on aws 〜ゲームにおけるAWS最新活用術〜
Amazon Web Services Japan
What's hot
(20)
PPTX
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe
PDF
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
Google Cloud Platform - Japan
PPTX
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
Yuki Hirano
PDF
Robot framework 을 이용한 기능 테스트 자동화
Jaehoon Oh
PDF
AWS Black Belt Online Seminar Amazon Aurora
Amazon Web Services Japan
PDF
React(TypeScript) + Go + Auth0 で実現する管理画面
KentaEndoh
PDF
文字コードに起因する脆弱性とその対策(増補版)
Hiroshi Tokumaru
PPTX
Metaspace
Yasumasa Suenaga
PDF
外部キー制約に伴うロックの小話
ichirin2501
PDF
Pacemaker 操作方法メモ
Masayuki Ozawa
PDF
クラスローダーについて
Suguru ARAKAWA
PDF
Embulk - 進化するバルクデータローダ
Sadayuki Furuhashi
PDF
その ionice、ほんとに効いてますか?
Narimichi Takamura
ODP
SPAのルーティングの話
ushiboy
PDF
Technical Introduction to PostgreSQL and PPAS
Ashnikbiz
PPT
JavaScript Event Loop
Thomas Hunter II
PDF
MongoDB Configパラメータ解説
Shoken Fujisaki
PPTX
CloudFront経由でのCORS利用
Yuta Imai
PDF
Using ngx_lua / lua-nginx-module in pixiv
Shunsuke Michii
PDF
Vacuum徹底解説
Masahiko Sawada
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
Google Cloud Platform - Japan
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
Yuki Hirano
Robot framework 을 이용한 기능 테스트 자동화
Jaehoon Oh
AWS Black Belt Online Seminar Amazon Aurora
Amazon Web Services Japan
React(TypeScript) + Go + Auth0 で実現する管理画面
KentaEndoh
文字コードに起因する脆弱性とその対策(増補版)
Hiroshi Tokumaru
Metaspace
Yasumasa Suenaga
外部キー制約に伴うロックの小話
ichirin2501
Pacemaker 操作方法メモ
Masayuki Ozawa
クラスローダーについて
Suguru ARAKAWA
Embulk - 進化するバルクデータローダ
Sadayuki Furuhashi
その ionice、ほんとに効いてますか?
Narimichi Takamura
SPAのルーティングの話
ushiboy
Technical Introduction to PostgreSQL and PPAS
Ashnikbiz
JavaScript Event Loop
Thomas Hunter II
MongoDB Configパラメータ解説
Shoken Fujisaki
CloudFront経由でのCORS利用
Yuta Imai
Using ngx_lua / lua-nginx-module in pixiv
Shunsuke Michii
Vacuum徹底解説
Masahiko Sawada
Ad
Viewers also liked
(20)
PDF
Directiveで実現できたこと
Kon Yuichi
PDF
ng-mtg#6 AngularJS ディレクティブ・パターン
Hayashi Yuichi
PDF
受託開発でのAngularJS - 第1回AngularJS 勉強会 at LIG
Hayashi Yuichi
KEY
Composer による依存管理 と Packagist によるライブラリの公開
Shogo Kawahara
PDF
AngularJS入門の巻
Toshio Ehara
PDF
開発ライフサイクルから見たAngularJS
Mizuho Sakamaki
PDF
Enterprise x AngularJS
Kenichi Kanai
PDF
イマドキのフロントエンドエンジニアの道具箱
Fumio SAGAWA
PDF
Future of Web Security Opened up by CSP
Muneaki Nishimura
PDF
Welcome to the Black Hole of Bug Bounty Program Rebooted
Muneaki Nishimura
PDF
AngularJSのDirectiveで俺俺タグつくっちゃお
Toshio Ehara
PDF
CSS Nite LP26 CodeKitで始める次世代Web制作
Maboroshi.inc
PPTX
Spring Security 4.1 の新機能
正和 井岡
PDF
Introducing Sencha Space
久司 中村
PDF
Firefox/Thunderbirdを組織内でより良く使う
Hiroshi Yuki
PDF
実務導入に向けたAngularの始め方@Angular入門者の会
Hayashi Yuichi
PDF
Angular.jsについてちょっとしゃべる
Masashi Haga
PPTX
とある脆弱性の永い議論
Mtikutea
PDF
AngularJSについて
昌生 高橋
ODP
AngularJSとの危険な関係 by Mario Heiderich - CODE BLUE 2015
CODE BLUE
Directiveで実現できたこと
Kon Yuichi
ng-mtg#6 AngularJS ディレクティブ・パターン
Hayashi Yuichi
受託開発でのAngularJS - 第1回AngularJS 勉強会 at LIG
Hayashi Yuichi
Composer による依存管理 と Packagist によるライブラリの公開
Shogo Kawahara
AngularJS入門の巻
Toshio Ehara
開発ライフサイクルから見たAngularJS
Mizuho Sakamaki
Enterprise x AngularJS
Kenichi Kanai
イマドキのフロントエンドエンジニアの道具箱
Fumio SAGAWA
Future of Web Security Opened up by CSP
Muneaki Nishimura
Welcome to the Black Hole of Bug Bounty Program Rebooted
Muneaki Nishimura
AngularJSのDirectiveで俺俺タグつくっちゃお
Toshio Ehara
CSS Nite LP26 CodeKitで始める次世代Web制作
Maboroshi.inc
Spring Security 4.1 の新機能
正和 井岡
Introducing Sencha Space
久司 中村
Firefox/Thunderbirdを組織内でより良く使う
Hiroshi Yuki
実務導入に向けたAngularの始め方@Angular入門者の会
Hayashi Yuichi
Angular.jsについてちょっとしゃべる
Masashi Haga
とある脆弱性の永い議論
Mtikutea
AngularJSについて
昌生 高橋
AngularJSとの危険な関係 by Mario Heiderich - CODE BLUE 2015
CODE BLUE
Ad
Similar to そろそろ押さえておきたい AngularJSのセキュリティ
(20)
PDF
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
normalian
PDF
Mvc conf session_5_isami
Hiroshi Okunushi
PPTX
【eLV勉強会】AngularJSでのモバイルフロントエンド開発
Hiroyuki Kusu
PPTX
パララックスでレスポンシブでJ query mobileなサイトのつくりかた
Shumpei Shiraishi
PDF
サーバサイドエンジニアが 1年間まじめにSPAやってみた
Itaru Kitagawa
PPTX
~初心者がこれから Web アプリの開発をするために~
Oda Shinsuke
PDF
Om Next ~React.jsを超えて
Kazuki Tsutsumi
PPTX
AngularJSを浅めに紹介します
nkazuki
PDF
Angular js or_backbonejs
Omasa Yusaku
PDF
Angular2
Kenichi Kanai
PPTX
キャッチアップJavaScriptビルド -ビルドから見るJSの今/2016春
Kondo Hitoshi
PDF
angular X designer - デザイナからみたAngularJS #ten1club
silvers ofsilvers
PDF
次世代プラットフォームのセキュリティモデル考察(前編)
Yosuke HASEGAWA
PPTX
簡単AngularJS(関西AngularJS勉強会)
Takahiro Maki
PDF
「html5 boilerplate」から考える、これからのマークアップ
Yasuhito Yabe
PDF
Dep005 azure ネットワーク設計
Tech Summit 2016
PDF
Alt01-LT
Yuta Hiroto
PDF
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Toshiaki Maki
PDF
多分モダンなWebアプリ開発
tak-nakamura
PPTX
サービスリリースから安定軌道に乗せるまでに行った開発施策
Keiichi Hagiwara
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
normalian
Mvc conf session_5_isami
Hiroshi Okunushi
【eLV勉強会】AngularJSでのモバイルフロントエンド開発
Hiroyuki Kusu
パララックスでレスポンシブでJ query mobileなサイトのつくりかた
Shumpei Shiraishi
サーバサイドエンジニアが 1年間まじめにSPAやってみた
Itaru Kitagawa
~初心者がこれから Web アプリの開発をするために~
Oda Shinsuke
Om Next ~React.jsを超えて
Kazuki Tsutsumi
AngularJSを浅めに紹介します
nkazuki
Angular js or_backbonejs
Omasa Yusaku
Angular2
Kenichi Kanai
キャッチアップJavaScriptビルド -ビルドから見るJSの今/2016春
Kondo Hitoshi
angular X designer - デザイナからみたAngularJS #ten1club
silvers ofsilvers
次世代プラットフォームのセキュリティモデル考察(前編)
Yosuke HASEGAWA
簡単AngularJS(関西AngularJS勉強会)
Takahiro Maki
「html5 boilerplate」から考える、これからのマークアップ
Yasuhito Yabe
Dep005 azure ネットワーク設計
Tech Summit 2016
Alt01-LT
Yuta Hiroto
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Toshiaki Maki
多分モダンなWebアプリ開発
tak-nakamura
サービスリリースから安定軌道に乗せるまでに行った開発施策
Keiichi Hagiwara
More from Muneaki Nishimura
(13)
PDF
Find Blue Oceans - Through the Competitive World of Bug Bounty
Muneaki Nishimura
PDF
OWASP Testing Guide からはじめよう - セキュリティ診断技術の共有、そして横展開
Muneaki Nishimura
PDF
Firefoxの倒し方
Muneaki Nishimura
PDF
Webプラットフォームのセキュリティ
Muneaki Nishimura
PDF
Firefoxの日和見暗号がカジュアルに無効化された話
Muneaki Nishimura
PDF
Mozillaの報奨金制度で200万円ほど稼いだ話
Muneaki Nishimura
PDF
HPKP Supercookies (公開鍵ピンニングによるユーザ追跡)
Muneaki Nishimura
PDF
Mozillaの報奨金制度で100万円ほど稼いだ話
Muneaki Nishimura
PDF
Welcome to the Black Hole of Bug Bounty Program
Muneaki Nishimura
PDF
Webアプリ開発者のためのHTML5セキュリティ入門
Muneaki Nishimura
PDF
GeckoのLocal Storageについて調べてみた
Muneaki Nishimura
PDF
Firefox OS パッケージ型アプリ インストールの仕組みを調べてみた
Muneaki Nishimura
PDF
Firefox OS 起動の仕組みを調べてみた
Muneaki Nishimura
Find Blue Oceans - Through the Competitive World of Bug Bounty
Muneaki Nishimura
OWASP Testing Guide からはじめよう - セキュリティ診断技術の共有、そして横展開
Muneaki Nishimura
Firefoxの倒し方
Muneaki Nishimura
Webプラットフォームのセキュリティ
Muneaki Nishimura
Firefoxの日和見暗号がカジュアルに無効化された話
Muneaki Nishimura
Mozillaの報奨金制度で200万円ほど稼いだ話
Muneaki Nishimura
HPKP Supercookies (公開鍵ピンニングによるユーザ追跡)
Muneaki Nishimura
Mozillaの報奨金制度で100万円ほど稼いだ話
Muneaki Nishimura
Welcome to the Black Hole of Bug Bounty Program
Muneaki Nishimura
Webアプリ開発者のためのHTML5セキュリティ入門
Muneaki Nishimura
GeckoのLocal Storageについて調べてみた
Muneaki Nishimura
Firefox OS パッケージ型アプリ インストールの仕組みを調べてみた
Muneaki Nishimura
Firefox OS 起動の仕組みを調べてみた
Muneaki Nishimura
Recently uploaded
(8)
PDF
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
Takuya Minagawa
PDF
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
Masaki Yamakawa
PPTX
Vibe Codingを触って感じた現実について.pptx .
iPride Co., Ltd.
PDF
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
池田 直哉
PDF
20250823_IoTLT_vol126_kitazaki_v1___.pdf
Ayachika Kitazaki
PDF
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
Kannabi1
PPTX
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
Akira Tanaka
PPTX
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
Ko Jikawa
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
Takuya Minagawa
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
Masaki Yamakawa
Vibe Codingを触って感じた現実について.pptx .
iPride Co., Ltd.
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
池田 直哉
20250823_IoTLT_vol126_kitazaki_v1___.pdf
Ayachika Kitazaki
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
Kannabi1
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
Akira Tanaka
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
Ko Jikawa
そろそろ押さえておきたい AngularJSのセキュリティ
1.
そろそろ押さえておきたい AngularJSのセキュリティ ng-mtg#6 AngularJS勉強会 2014年7月25日 (1.3.0-beta.16対応版)
2.
西村 宗晃 a.k.a.
nishimunea html5j Webプラットフォーム部 部員 HTML5 Experts.jp コントリビューター セキュリティキャンプ全国大会 2014 講師 FxOS コードリーディング 部員 1
3.
2
4.
3
5.
4 ノウハウを共有して、様々なプラットフォームで 動かすための知識を培おうではないか! WebはPCの世界を抜け出し 様々なプラットフォームで動き始めています by めこ部長
6.
本日お話する内容 5 AngularJSで対策できる脆弱性とその実装方法 • DOM Based
XSS • Cross-Site Request Forgery (CSRF) AngularJSでは対策できない脆弱性 (スコープ外) • サーバ側での対策が必要となる脆弱性 • ブラウザやプロトコル由来の脆弱性 ※CSRFはサーバ側での対策を要しますが今回の発表ではスコープ外とします
7.
DOM Based XSS
8.
XSSの種類 • サーバ側で発生するXSS - 反射型XSS -
HTTPのリクエストに含まれるスクリプトが、 レスポンスのHTMLにそのまま埋め込まれることで発生 - 持続型XSS - HTTPのリクエストに含まれるスクリプトが一旦サーバに保存され、 そのデータを元にHTMLを出力する際にスクリプトが埋め込まれることで発生 • クライアント側で発生するXSS - DOM based XSS - 外部から取得したデータを元にJSでHTMLを動的生成する際に、 データに含まれるスクリプトがDOMツリーへ出力されることで発生 7 ※DOM based XSSも反射型と持続型に分類すべきという意見もあります https://www.owasp.org/images/f/f4/ASDC12-Unraveling_some_of_the_Mysteries_around_DOMbased_XSS.pdf
9.
参考:angularjs.orgにあった反射型XSS 8 ※撮影のためIEのXSSフィルターを無効化しています。本件はGoogleに報告し、既に修正済みです そのままレスポンスとして出力される URLに仕込んだスクリプトが… <script>alert(‘XSS’)</script>
10.
DOM Based XSS発生のメカニズム 9 Web
Messaging $location Referrer Web Socket $cookies $http, $resource ngModel Web Storage ngBindHtml ngInclude element.innerHTML document.write jQLite.html jQLite.append window.eval new Function XSS スクリプトを 含むデータ データバインドで DOMを生成 攻撃者 被害者 データの入力経路 DOMツリーへの出力経路 ※図中の入力経路、出力経路は一例です
11.
DOM Based XSSの対策 10 •
動的にDOMを生成する際は信頼できるデータのみを使用する - そのままDOMに挿入しても安全だと開発者が保証できるデータのみを使用する • それ以外の場合は、データを出力するコンテキストに応じた対策を施す - HTMLの要素内容としてデータを出力する場合 - createTextNodeでテキストノードとして出力する(またはHTMLエスケープ) - HTMLマークアップとして出力する際は、スクリプトが実行される 恐れの無い要素と属性のみを許可する - HTML要素の属性値としてデータを出力する場合 - setAttributeで属性値として出力する(またはHTMLエスケープ) - イベントハンドラ属性などのスクリプトが実行可能な属性値は動的に生成しない - URLを出力する際は安全なURLであることを検証する - http(s)://で始まるURLかホワイトリストに該当するオリジンのみを許可する
12.
Strict Contextual Escaping
(SCE) 11 • コンテキストに応じたエスケープ機能を提供するAngularJSの機能 • AngularJS v1.2以降ではデフォルトで有効 利用可能なコンテキスト コンテキストの適用例 HTML <div ng-bind-html=" HTML "></div> CSS <div style=" CSS "> URL <a href=" URL ">Link</a> リソースURL <script src=" リソースURL "> JS <div onclick=" JS "> ※ここで言うエスケープとは指定されたコンテキストでデータが適切に 表示されるように文字列を変換する処理の総称を意味します。 詳細は https://docs.angularjs.org/api/ng/service/$sceを参照
13.
明示的な信頼に基づくエスケープ処理 12 • 安全が保証できる値に明示的な信頼を与えることができる - 信頼されていない値は自動的にエスケープして出力される -
逆に言えば、安全が保証できない値に信頼を与えることは脆弱性につながる var input = '<a href="javascript:alert(1)">Link</a>'; console.log($sce.getTrusted($sce.HTML, input)); var trustedData = $sce.trustAs($sce.HTML, input); console.log($sce.getTrusted($sce.HTML, trusted)); エスケープして出力される <a>Link</a> 信頼を与えた値はそのまま出力される <a href="javascript:alert(1)">Click</a> 値に明示的な信頼を与える
14.
データバインド時にコンテキストを自動判別 • $sceを中心に複数のモジュールが連携してデータのコンテキストを自動判別 13 $compile • テンプレートを解析してexpression 展開箇所のコンテキストを判別。判 別したコンテキストに応じたエス ケープ処理を$interpolateに指示 •
各ディレクティブのtemplateURLを $sceでエスケープ • ディレクティブの属性値に含まれる URLを$$sanitizeUriでエスケープ • イベントハンドラ属性のexpression 展開を検出&回避 $parse • expressionを解析して危険なオブ ジェクトの参照を検出&回避 $$sanitizeUri • URLのエスケープ機能を提供 $interpolate • コンテキストに応じたexpressionの 解析機能を提供 • expressionで展開されるデータを $sceでエスケープ $sce • リソースURLとHTMLのエスケープ 機能を提供 $sanitize • リソースURLとHTMLのエスケープ 機能を提供 • HTMLの属性値に含まれるURLを $$sanitizeUriでエスケープ $sceDelegate • $sceの主要機能を実装 プロバイダ使用関係
15.
• AngularJSではデータをHTMLとして出力する手段が制限されている - HTMLを出力できるのはng-bind-htmlと<iframe
srcdoc>のみ - その他のデータバインドはデータをテキスト値として出力する - 例:ng-bind, <div>{{expression}}</div> HTMLに対するデータバインド 14 • スクリプトの実行可能なHTML要素や属性は除去される(サニタイズ) - 内部処理に$sanitizeを使うのでngSanitizeモジュールをDIする必要がある - スクリプトが実行される危険性のあるHTML要素や属性は削除される - 例:<script>alert(‘XSS’);</script><b>Hello</b> World 危険な要素は除去される var app = angular.module('myApp', ['ngSanitize'] ); ※ngSanitizeモジュールをDIしないとunsafeエラーが発生します https://docs.angularjs.org/#!/error/$sce/unsafe
16.
HTMLに対するデータバインド 15 • サニタイズにはngSanitizeのホワイトリストが使用される - ホワイトリストに無いHTML要素や属性は削除される -
安全な要素でもホワイトリストに含まれていないものがある - <video>などはリストに無いので削除対象となる - 属性値に不正なURLが含まれる場合は属性ごと削除される - 全てのURLが検査対象ではない - background, cite, href, longdesc, src, usemap属性のみが検査対象 - つまり<html manifest>, <video poster>などのURLは検査対象とならない - 例:<a href="javascript:alert('XSS');" >Link</a> ※ホワイトリストの詳細は$sanitizeのスクリプトコードを参照 https://github.com/angular/angular.js/blob/master/src/ngSanitize/sanitize.js href属性はホワイトリストで許可されているが 不正なURLが含まれているので削除される
17.
HTMLに対するデータバインド 16 • HTMLのバインド時はexpressionによる文字列の結合が禁止される - expressionの解析処理が複雑化することによりミスが生じ、 XSSを許容するケースが生じる可能性があるため -
expressionの解析ミスによりJSが実行できてしまう問題が実際にあった <form ng-attr-action="{{'javascript:'}}alert(1)"><button>XSS</button> ※攻撃方法および攻撃可能バージョンの詳細は以下のサイトを参照 http://code.google.com/p/mustache-security/wiki/AngularJS 結合すると javascript:alert(1) となるので本来は無害化されるべき
18.
• AngularJSはCSSのエスケープをサポートしていない - style要素やstyle属性に挿入したデータはそのままCSSの構文として出力される -
最近のブラウザではCSSの構文でスクリプトを実行できないためと思われる CSSに対するデータバインド 17 • IEのQuirksモードではAngularJSの実行が禁止される - CSS expressionsによるJSの実行が可能であるため <style>body {color:expression(alert(1));}</style> QuirksモードではCSSの宣言で JSを実行することができる ※以前はCSS expressions以外にもOperaの-o-linkプロパティで JSを実行する方法がありましたが現在は使えません http://html5sec.org/#9
19.
• ホワイトリストに合致しないURLは無効化される(サニタイズ) - aHrefSanitizationWhiteList -
<a href>に指定可能なURLのホワイトリスト - http:, https:, ftp:, mailto:, tel:, file:で開始するURLのみを許可 - imgSrcSanitizationWhiteList - <img src>に指定可能なURLのホワイトリスト - http:, https:, file:, blob:, data:image/ で開始するURLのみを許可 - 上記のホワイトリストに合致しないURLは頭にunsafe:を付けて無効化される - 例:javascript:alert(1) unsafe:javascript:alert(1) URLに対するデータバインド 18 • ホワイトリストは変更可能 - $compileProviderがホワイトリストを参照/変更する関数を提供している ※Firefox OSアプリで使う場合は「app:」を、Chromeアプリで使う場合は「chrome-extension:」を ホワイトリストに追加する必要があります
20.
• ホワイトリストとブラックリストに基づいてサニタイズされる - ページを構成するリソースを取得する際に適用される -
img以外のsrc属性、<form action>、SVGのxlink:href、ng-include、 $httpや$resourceの取得先URL、ディレクティブのtemplateUrlプロパティ - ホワイトリストとブラックリストを用いてサニタイズする - デフォルトではページと同一オリジン('self')のみを許容 - URLコンテキストより厳しい制限がかかる リソースURLに対するデータバインド 19 • ホワイトリストとブラックリストは変更可能 - $sceDelegateProviderが両リストを参照/変更する関数を提供している
21.
• ホワイトリストにはワイルドカードを指定できる - リストには「*」と「**」という2種類のワイルドカードが指定できる -
** は全ての文字にマッチする - ** はURLの末尾のみで使用する - 安全な例 http://example.com/templates/** - 危険な例 http://**.example.com/ リソースURLに対するデータバインド 20 ※両リストに指定可能なパターンの詳細は以下のURLを参照 https://docs.angularjs.org/api/ng/service/$sce http://evil.com/q=.example.com も許可されてしまう
22.
• JSの動的生成は禁止される - <script>の要素内容や、イベントハンドラ属性に対するexpressionの展開は禁止される -
onで始まる属性、もしくはformaction属性へのデータバインドが禁止される - 代わりにng-clickなどのイベントハンドラディレクティブが使用できる - scope外の関数にはアクセスできないのでXSSの被害を軽減できる JSに対するデータバインド 21 • 任意のコードを実行可能なオブジェクトはexpressionで参照できない - constructor, window, element, Objectなどはexpressionから参照できない - Functionコンストラクタを用いて任意のJSが実行する方法が以前指摘されたため {{constructor.constructor('alert(1)')()}} ※最新版では__proto__の参照や、call, apply, bind関数も実行が禁止されています 以前はFunctionコンストラクタを 参照することでscope外の関数が実行できた
23.
• XSS対策を自分で行う必要がある - SCEによる保護は期待できない -
SCEはビルトインのディレクティブに最適化されている - カスタムディレクティブが出力するHTML要素や属性には コンテキストの自動判別も適用されない - 例:<a href>のコードを流用して<video poster>ディレクティブを作成する場合 カスタムディレクティブを作る際の注意点 22 var htmlAnchorDirective = valueFn({ compile: function(element, attr) { if (!attr.href && !attr.name) { attr.$set('href', ''); } $setはposter属性をURLとして判別 しないので自分でURLをケアする
24.
• コンテキスト毎にデータの取扱い方針を決めておく カスタムディレクティブを作る際の注意点 23 コンテキスト データの取扱い方針(例) HTML •
原則として要素内容はjQLite.text()で出力 • HTMLとして出力する際は$sce.getTrustedHtml()でサニタイズ • 属性値を出力する際はjQLite.attr()かjQLite.prop() を使用 • イベントハンドラと<iframe srcdoc>に対するデータバインドを禁止 CSS • style要素やstyle属性はテンプレートに対するデータバインドで出力 (styleタグを組み立ててHTMLとして出力しない) URL • $$sanitizeUriで無害化したURLを出力 リソースURL • $sce.getTrustedResourceUri()でサニタイズ JS • 信頼できるデータのみを出力
25.
• HTMLとURLを出力する場合 カスタムディレクティブの実装例 24 .directive(‘myDirective’,[‘$sce’,‘$$sanitizeUri’, function($sce, $$sanitizeUri)
{ return function (scope, element, attrs) { //HTML Content element.html($sce.parseAsHtml(attrs.inputExpression)(scope)); //URL Attribute element.attr('src', $$sanitizeUri(attrs.inputUri)); } }]); expressionを安全な HTMLにしてからDOMへ出力 URLをサニタイズして から属性値として出力
26.
• ディレクティブにSCEが適用されていることを確認する - 例:angular-translateはデフォルトでHTMLをエスケープせずそのまま出力する -
$translateProvider.useSanitizeValueStrategyでエスケープを有効にする必要がある カスタムディレクティブを使う際の注意点 25 デフォルトでは HTMLエスケープ無効
27.
• SCEの無効化 - $sceProvider.enabled(false)でSCEを無効化できる -
無効化するとHTMLとリソースURLがサニタイズされなくなるので注意 SCEに関するその他のこと 26 • Content Security Policy(CSP)の利用 - CSPとは、XSSをはじめとする一般的な脆弱性のリスクを軽減するブラウザの保護機能 - CSPを適用する場合、AngularJSのHTMLテンプレートに以下の変更が必要 - ng-appの指定箇所にng-cspを併記する - https://code.angularjs.org/snapshot/angular-csp.css をロードする - CSPを有効にすると実行速度が30%低下するそうなので速度が求められる場合は注意
28.
Cross-Site Request Forgery (CSRF)
29.
CSRF発生のメカニズム 28 • 退会APIを例とする。このAPIは退会画面で利用されることを想定している 退会する 本当に退会するの? 退会はこちら 退会処理中です 退会しました 退会APIを実行 CookieでセッションIDが通知される
30.
退会する 本当に退会するの? 退会はこちら CSRF発生のメカニズム 29 • 退会APIを例とする。このAPIは退会画面で利用されることを想定している • 罠サイトがAPIを実行した場合、ユーザを意図せず退会させることができる 秘密の画像 ♡罠サイト♡ 退会APIを実行 CookieでセッションIDが通知される 退会処理中です 退会しました 被害者
31.
AngularJSのCSRF対策 30 • 正規のページからのリクエストであることを示すトークンをXHRに付加する 退会する 本当に退会するの? 退会はこちら 退会処理中です 退会しました サーバはXSRF-TOKENという トークン(乱数値)をCookieにセット AngularJSはトークンをX-XSRF-TOKENという リクエストヘッダに付けて退会API(XHR)を実行 サーバは受信したトークンが 正しい場合のみ退会処理を許可
32.
AngularJSのCSRF対策 31 • 正規のページからのリクエストであることを示すトークンをXHRに付加する • 有効なトークンが付いていなければ、サーバ側でリクエストを拒否する 不正なリクエスト を検出しました 乱数値が不正なので 退会リクエストを拒否 退会する 本当に退会するの? 退会はこちら 秘密の画像 ♡罠サイト♡
罠サイトはリクエストに正しい 乱数値を付けることができない 被害者
33.
AngularJSでCSRF対策する際の注意点 32 • クロスオリジンのXHRにはX-XSRF-TOKENヘッダが付かない - $httpや$resourceのリクエストを送信する際に自分でヘッダを付ける -
CORSに基づいてヘッダを受信するための実装がサーバ側にも必要 $scope.method = 'POST'; $scope.url = 'https://api.example.com/resign.php'; $scope.headers = {'X-XSRF-TOKEN': $scope.token }; $http({method: $scope.method, url: $scope.url, headers:$scope.headers}); リクエストヘッダに有効な トークン値をセットする ※恐らくカスタムヘッダ付きのCORSリクエストはプリフライトを発行してしまうためだと思われます https://github.com/angular/angular.js/issues/1004
34.
謝辞 本資料は竹迫良範様(サイボウズ・ラボ)、佐藤鉄平様(サイボウズ)、 国分裕様(MBSD)に技術レビューをして頂きました。 心より感謝いたします。 お問い合わせはこちら 33
Download