ひげで学ぶ Webアプリケーションに潜むリスク OSC2016 Hokkaido 2016/06/18 担当:北海道情報セキュリティ勉強会(せきゅぽろ) 岸谷 隆久 使用させて頂いたスライドテンプレート:AZUSA 2号 ( https ://wslash.com/?p=5888 )
ひげで学ぶWebアプリケーションに潜むリスク
OSC2016 Hokkaido 2016/06/18担当:北海道情報セキュリティ勉強会(せきゅぽろ)
岸谷 隆久
使用させて頂いたスライドテンプレート:AZUSA 2号( https://wslash.com/?p=5888 )
自己紹介
• 北海道札幌市在住
• せきゅぽろの方から来ました
• 普段は主にWebアプリケーションなどの
脆弱性診断をしている者です
活用範囲が広がり続けるWeb系技術
• Webアプリケーション(当然)
• スマートフォンや各種デバイス向けのア
プリやサーバサイドAPI(これも自然な流
れ)
• サーバソフトウェア(Node.js 等)
• デスクトップアプリケーション
(Electron、Adobe AIR 等)
不正アクセス対策を怠ると思わぬ事態に…
• 最近Webアプリケーションへの不正アクセスとして発表された事例– 日テレ
– J-WAVE
– avex
• ECサイト開発を受注した会社がSQLインジェクション対策を怠ったとして2,262万円の損害賠償を命じられる判決も…
SQLインジェクション対策もれの責任を開発会社に問う判決 | 徳丸浩の日記 http://blog.tokumaru.org/2015/01/sql.html
何はなくとも
安全なウェブサイトの作り方:IPA 独立行政法人 情報処理推進機構https://www.ipa.go.jp/security/vuln/websecurity.html
入力値の処理に起因する問題
• OSコマンドインジェクション
• SQLインジェクション
etc…
細々と生き残る、OSコマンド実行につながる脆弱性
• 脆弱性が存在すれば最大級に危険(サービス利用者にシェルアクセスを提供してしまう)
• コード内でのシェル(など)の呼び出しに起因する旧来の典型的なタイプはほとんど見られなくなったが、多少異なる形で遭遇することがある
※本日お話するのは「スクリプトインジェクション」や「テンプレートインジェクション」と呼べるタイプの問題ですが、ここでは細かく区別しません
典型的なOSコマンドインジェクション脆弱性の例※「安全なウェブサイトの作り方」より引用
※詳細や対策については「安全なウェブサイトの作り方」をご覧になることをお勧めします
$from =~ s/"|;|'|<|>|\|| //ig;
open(MAIL, "|/usr/sbin/sendmail -t -i -f $from");
• Perl の open 関数で Sendmail にパラメータを渡して実行する
• 1行目で $from から危険そうな文字を除去しているようだが…?
• バッククォート文字が使用できるため「`touch[0x09]/tmp/foo`」(ここ
で「[0x09]」は水平タブを表す)でコマンドが実行される例
テストしておきたい入力値は?
クォート文字?( ’ や “ や `)
セミコロン?( ; )
ひげ
( :-{|
curly brackets
{ }
Templating
• { something }• {{ something }}• ${ something }• #{ something }etc…• テンプレートエンジン等のメタ文字としてよ
く使用され、中の文字列を式として評価する記法に用いられるケースが多い
• “mustache”(口ひげ)というそのものずばりな名前のテンプレートエンジンも
例:Swig (Node.js)
<html><head>
<title>{{ title }}</title></head><body>
<ul>{% for user in users -%}<li>氏名:{{ user.name }}、年齢:{{ user.age }}
</li>{%- endfor %}
</ul></body>
</html>
<html><head>
<title>会員情報</title></head><body>
<ul><li>氏名:山田太郎、年齢:20</li><li>氏名:佐藤次郎、年齢:30</li><li>氏名:鈴木三郎、年齢:40</li>
</ul></body>
</html>
テンプレートファイル 処理結果
ビューとロジックの分離
ご注意ください
• 本資料で紹介する内容を他者の管理するコンピュータに対し許可なく行うと不正アクセス行為(違法)となる可能性があります。絶対に行わないでください。
• 自分が管理するコンピュータ上で実験する場合、他人がアクセス可能な状態にならないようご注意ください。
脆弱性について見る前に
• 新しい攻撃手法というわけではありません
• 特定のテンプレートエンジンやフレームワーク、言語等に脆弱性があるというお話ではありません。
DEMO 1Swig / Express (Node.js)
原因
router.get('/', function(req, res, next) {
users.find().toArray(function(err, users) {
// format
var tmpl = '{# some templates #}';
users.forEach(function(user){
tmpl += escapeHTML(user.name) + '{# some templates #}';
});
res.send(swig.render(tmpl));
});
});
脆弱なコードの例
原因
router.get('/', function(req, res, next) {
users.find().toArray(function(err, users) {
// format
var tmpl = '{# some templates #}';
users.forEach(function(user){
tmpl += escapeHTML(user.name) + '{# some templates #}';
});
res.send(swig.render(tmpl));
});
});
コード内での文字列連結によるテンプレート生成user.name が {{ javascript code }} という値だったら
脆弱なコードの例
そんなコード書く?
ない訳ではないようです。以下は想像した発生原因です。
• ちょっとフォーマットする程度だしコード内で完結したい
• データ内の文字列加工や合成のような処理が必要な流れで
• エスケープ処理等により実際には問題のない箇所からの部分的流用
対策router.get('/', function(req, res, next) {
users.find().toArray(function(err, users) {
res.render('tmpl', { title:'Hello World!', users:users });
});
});
本来はテンプレートにオブジェクトを渡してレンダーすればよく、{{ }} が入ってきても問題なし
<html><head><title>{{ title }}</title>
</head><body><ul>{% for user in users -%}<li>氏名:{{ user.name }}、年齢:{{ user.age }}
</li>{%- endfor %}
</ul></body>
</html>
テンプレート名 テンプレートに渡すオブジェクト
テンプレートファイル
DEMO 2Haml / Ruby on Rails
原因
文字列連結によるテンプレート生成
(関連)レンダーオプションに関係する脆弱性の話題
• Ruby on Railsの潜在的なリモートスクリプトインジェクション脆弱性CVE-2016-2098 | 徳丸浩の日記http://blog.tokumaru.org/2016/06/ruby-on-railscve-2016-2098.html
• Ruby on Rails 脆弱性解説 - CVE-2016-2098 - DARK MATTERhttp://io.cyberdefense.jp/entry/2016/06/09/Ruby_on_Rails_%E8%84%86%E5%BC%B1%E6%80%A7%E8%A7%A3%E8%AA%AC_-_CVE-2016-2098
class TestController < ApplicationController
def index
@tmpl = "-# some templates \r\n" \
+ CGI.escapeHTML(params[:str]) \
+ "\r\n-# some templates"
render :inline => @tmpl, :type => 'haml'
end
end
脆弱なコードの例
DEMO (OMAKE)AngularJS
公式見解
• https://docs.angularjs.org/guide/secu
rity
• “Do not mix client and server
templates” といったようなことが推奨さ
れている
補足
• curly brackets に着目しましたが、テンプレー
トエンジン等に応じ他にも様々な文字(列)が
メタ文字として使用されています。ご利用のプ
ロダクトに合わせてご確認ください。
まとめ
• 利用するものの使い方を理解して、お作法に従い安全に使用しましょう
• ライブラリ等は適宜安全なバージョンに更新しましょう
• 情報セキュリティに興味のある方はぜひせきゅぽろへ
http://secpolo.techtalk.jp/