Top Banner
ひげで学ぶ Webアプリケーションに潜むリスク OSC2016 Hokkaido 2016/06/18 担当:北海道情報セキュリティ勉強会(せきゅぽろ) 岸谷 隆久 使用させて頂いたスライドテンプレート:AZUSA 2号 ( https ://wslash.com/?p=5888 )
25

osc2016do ひげで学ぶWebアプリケーションに潜むリスク

Jan 21, 2018

Download

Internet

Ierae Security
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

ひげで学ぶWebアプリケーションに潜むリスク

OSC2016 Hokkaido 2016/06/18担当:北海道情報セキュリティ勉強会(せきゅぽろ)

岸谷 隆久

使用させて頂いたスライドテンプレート:AZUSA 2号( https://wslash.com/?p=5888 )

Page 2: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

自己紹介

• 北海道札幌市在住

• せきゅぽろの方から来ました

• 普段は主にWebアプリケーションなどの

脆弱性診断をしている者です

Page 3: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

活用範囲が広がり続けるWeb系技術

• Webアプリケーション(当然)

• スマートフォンや各種デバイス向けのア

プリやサーバサイドAPI(これも自然な流

れ)

• サーバソフトウェア(Node.js 等)

• デスクトップアプリケーション

(Electron、Adobe AIR 等)

Page 4: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

不正アクセス対策を怠ると思わぬ事態に…

• 最近Webアプリケーションへの不正アクセスとして発表された事例– 日テレ

– J-WAVE

– avex

• ECサイト開発を受注した会社がSQLインジェクション対策を怠ったとして2,262万円の損害賠償を命じられる判決も…

SQLインジェクション対策もれの責任を開発会社に問う判決 | 徳丸浩の日記 http://blog.tokumaru.org/2015/01/sql.html

Page 5: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

何はなくとも

安全なウェブサイトの作り方:IPA 独立行政法人 情報処理推進機構https://www.ipa.go.jp/security/vuln/websecurity.html

Page 6: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

入力値の処理に起因する問題

• OSコマンドインジェクション

• SQLインジェクション

etc…

Page 7: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

細々と生き残る、OSコマンド実行につながる脆弱性

• 脆弱性が存在すれば最大級に危険(サービス利用者にシェルアクセスを提供してしまう)

• コード内でのシェル(など)の呼び出しに起因する旧来の典型的なタイプはほとんど見られなくなったが、多少異なる形で遭遇することがある

※本日お話するのは「スクリプトインジェクション」や「テンプレートインジェクション」と呼べるタイプの問題ですが、ここでは細かく区別しません

Page 8: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

典型的なOSコマンドインジェクション脆弱性の例※「安全なウェブサイトの作り方」より引用

※詳細や対策については「安全なウェブサイトの作り方」をご覧になることをお勧めします

$from =~ s/"|;|'|<|>|\|| //ig;

open(MAIL, "|/usr/sbin/sendmail -t -i -f $from");

• Perl の open 関数で Sendmail にパラメータを渡して実行する

• 1行目で $from から危険そうな文字を除去しているようだが…?

• バッククォート文字が使用できるため「`touch[0x09]/tmp/foo`」(ここ

で「[0x09]」は水平タブを表す)でコマンドが実行される例

Page 9: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

テストしておきたい入力値は?

クォート文字?( ’ や “ や `)

セミコロン?( ; )

Page 10: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

ひげ

( :-{|

curly brackets

{ }

Page 11: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

Templating

• { something }• {{ something }}• ${ something }• #{ something }etc…• テンプレートエンジン等のメタ文字としてよ

く使用され、中の文字列を式として評価する記法に用いられるケースが多い

• “mustache”(口ひげ)というそのものずばりな名前のテンプレートエンジンも

Page 12: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

例: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>

テンプレートファイル 処理結果

ビューとロジックの分離

Page 13: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

ご注意ください

• 本資料で紹介する内容を他者の管理するコンピュータに対し許可なく行うと不正アクセス行為(違法)となる可能性があります。絶対に行わないでください。

• 自分が管理するコンピュータ上で実験する場合、他人がアクセス可能な状態にならないようご注意ください。

Page 14: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

脆弱性について見る前に

• 新しい攻撃手法というわけではありません

• 特定のテンプレートエンジンやフレームワーク、言語等に脆弱性があるというお話ではありません。

Page 15: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

DEMO 1Swig / Express (Node.js)

Page 16: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

原因

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));

});

});

脆弱なコードの例

Page 17: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

原因

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 }} という値だったら

脆弱なコードの例

Page 18: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

そんなコード書く?

ない訳ではないようです。以下は想像した発生原因です。

• ちょっとフォーマットする程度だしコード内で完結したい

• データ内の文字列加工や合成のような処理が必要な流れで

• エスケープ処理等により実際には問題のない箇所からの部分的流用

Page 19: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

対策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>

テンプレート名 テンプレートに渡すオブジェクト

テンプレートファイル

Page 20: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

DEMO 2Haml / Ruby on Rails

Page 21: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

原因

文字列連結によるテンプレート生成

(関連)レンダーオプションに関係する脆弱性の話題

• 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

脆弱なコードの例

Page 22: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

DEMO (OMAKE)AngularJS

Page 23: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

公式見解

• https://docs.angularjs.org/guide/secu

rity

• “Do not mix client and server

templates” といったようなことが推奨さ

れている

Page 24: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

補足

• curly brackets に着目しましたが、テンプレー

トエンジン等に応じ他にも様々な文字(列)が

メタ文字として使用されています。ご利用のプ

ロダクトに合わせてご確認ください。

Page 25: osc2016do ひげで学ぶWebアプリケーションに潜むリスク

まとめ

• 利用するものの使い方を理解して、お作法に従い安全に使用しましょう

• ライブラリ等は適宜安全なバージョンに更新しましょう

• 情報セキュリティに興味のある方はぜひせきゅぽろへ

http://secpolo.techtalk.jp/