『セキュア・プログラミング講座(Webアプリケーション編)』第2弾:マッシュアップ(12/13)
http://topse.or.jp/2013/10/2068
に行ってきた!その内容をメモメモ
従来のWebアプリケーション
・紙芝居的な画面遷移
わりとゆっくりとした動き
AJAX流アプリケーション
・滑らかな画面変化
反応速度はやい
構図の変化
従来は、サーバー側が動的
AJAXは、ブラウザで動き、サーバーはデータを与える
1.WebAPI
Webアプリケーションとなに違う?
→ユーザーの会話を想定しない
クライアントへデータや演算結果
・REST
Representational State Transfer
HTTPリクエストと対応付ける
特徴4つ
・ステートレスな通信プロトコル
・リソースでステートを表現
・簡素化されたオペレーション
・URIのパス部分でリソースを識別
RPC,SOAPはソフト複雑になる
→REST風
Ruby on Railのresourcesタイプルーティング
2.マッシュアップの構図
・マッシュアップ
音楽DJの世界におけるマッシュアップ
→Webにおける「マッシュアップ」
複数の既存WebAPIを組み合わせ
新たなWebアプリケーションを作成
2種類のマッシュアップ
クライアント側マッシュアップ
サーバー側マッシュアップ
マッシュアップに対する侵害パターン
悪意のAPI→ゆーざー
悪意のAPI→API
無関係のサイト→API
無関係のクライアント→API
今回はブラウザが侵害される「悪意のAPI→ゆーざー」を考える
Javascript
インタプリタ言語
Javaに似た構造(似て非なる言語)
動的型言語(実行時に型が決まる)
オブジェクト指向(プロトタイプを使う)
リテラル表記の表現力
関数型プログラミング
制御構造
分岐
ループ
ループから脱出
コンストラクタとプロトタイプ
コンストラクタ関数/new Foo() 新しいオブジェクト
→プロトタイプオブジェクト
→プロパティ
コンストラクタはオブジェクトに振る舞いを与える
プロトタイプがチェーンにより、継承に相当することができる
ブラウザのJavascript実行環境
・ECMAスクリプトオブジェクト
・ブラウザオブジェクト
・DOM
・Javascriptアプリケーションコード
windowとグローバルオブジェクト
・グローバルオブジェクト:
すべてを収容するトップレベルオブジェクト
・ブラウザのグローバルオブジェクト=window
document = window.document
4.クライアント側コードに起因するスクリプト注入
・innerHTML
スクリプト注入攻撃できる
→ID,パスワードを入れるようにさせる&のっとりできる
→imgタグで src=/でかならず、失敗させ、
onerrorの先に、実行したいことを記述する。
病理メカニズム
・スクリプトはどこにある
head,bodyのscriptタグ
イベントハンドラ
・スクリプトはいつ実行されるか?
(1)HTMLが読み込まれたとき
(2)イベントハンドラ:イベント起きたとき
(3)動的に:動的についたとき
(4)くっつけたときにイベントが起きればすぐに
→onerror
・スクリプト注入
外から来た値
HTTPリクエスト
クッキー
WebAPI
別のクライアント
DOM,eval関数→スクリプト動く
・攻撃パターンの入口
location
クッキー
XMLhttpRequest
WebSocket:第三者
postMessage()
Window.name
WebStorage
・どこに行くと危ない
eval系
eval
function→文字列から関数
settimer
scriptタグ
IFRAMEタグ→サンドボックス属性,
イベントハンドラ
innerHTML
document.write
対策
・インラインスクリプトを避ける
→スクリプトを分離する
サーバー側コードでスクリプトを出力せず、別ファイルで
・入力を警戒する:仕様を決めて、入力チェックする
・正規表現のバグに注意する
.+,.*は貪欲なので、工夫する
.は改行文字にはマッチしない
ユニコード2028攻撃
^と$を忘れない
(\A,\zはjavascriptではサポートされていない)
・タグではなく、テキストとして出力する
・JQueryで$(検索式)→検索式のところで、タグが生成されることも
→findを使う
・html()は危ない→innerHTMLと同じ
→text()で書く
・$.parseHTML()の使用も避ける
5.同一源泉と他源泉
・これまでの脅威の構図
クライアントから脅威
最近は
サーバーが脅威
源泉:Webコンテンツの出所
スキーム、ホスト、ポートの3つ組み
これが違うと、源泉が違うかも
例:ポート80、ポート8080
セキュリティ確保のための源泉
・同一源泉ポリシー
かつての制約
→マッシュアップにとっては不便
抜け道
・JSONP
・iframeの3重
・iframe+postMessage
・webワーカー+importScript
→XMLHttpRequest level2 XHR2
→IEではXDomainRequest
Originリクエストヘッダー→Access-Control-Allow-Origin
→サーバーには拒否権がある
→ブラウザには、歯止めがない
:スクリプト注入攻撃
対策にはCSP
・ContentSecurityPolicy
アクセスできる源泉のホワイトリスト
実装:FireFoxから
W3CではCSP1.1がドラフト、Androidでもサポート予定
他のマッシュアップ論点
・CSP
・クライアント側マッシュアップにおける
リクエスト強要(CSRF)
・HTML5の新機能
・javascript向けフレームワーク
・サーバー側マッシュアップ
・IE固有
パーフェクトJavaScript
JQuery 9521
古いバージョン(1.6)などは危ない
でも、前のバージョンも修正されている
HTML5でタグ増えた
onの着かない属性:危ない属性
脆弱性をチェックする仕組み
有償の検査ツール:出始めてはいる
性能、負荷テストのかわりに
セキュリティ用のテストがあっていいはず。