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

Description
オープンソースカンファレンス2016 Hokkaido で使用した資料です。 https://www.ospn.jp/osc2016-do/modules/eguide/event.php?eid=40

Please download to get full document.

View again

of 25
All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
Information
Category:

Internet

Publish on:

Views: 4 | Pages: 25

Extension: PDF | Download: 0

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

    Thanks to everyone for your continued support.

    No, Thanks