Upgrade to Pro — share decks privately, control downloads, hide ads and more …

12 Case Studies for the Access Controls of Web Application #appsecapac2014

OWASP Japan
March 19, 2014
1.4k

12 Case Studies for the Access Controls of Web Application #appsecapac2014

OWASP Japan

March 19, 2014
Tweet

Transcript

  1. !  Takashi Honda 本田 崇(ほんだ たかし) ◦  セキュリティも開発もやる兼業エンジニアです。 !  Business -

    ◦  C/Sアプリ開発 5年 ◦  Webアプリ開発 5年 ◦  Webアプリ脆弱性検査 7年 !  Private - ◦  『脆弱性はどこにある?』をテーマに
 Webアプリケーションのセキュリティ
 についてつぶやいています。
 (twitter @hagurese) ◦  C#でFiddlerアドオンを作ったり、
 JavaでAndroidアプリを作ったり
 しています。
  2. !  検査~報告~評価~対策計画~対策実施~再検査 クロスサイト スクリプティング (XSS) SQLインジェクション (その他のインジェクション) 開発者 (XSS) 意外と箇所が多いけど対策はちゃんと分かる。

    個別に対策ではなく全体で対策できないものか・・・。 (SQL) 急いで対策しないと・・・。 一旦は個別に対策するけど、ホントは 全体で対策した方がいいな・・・。 クロスサイト リクエストフォージェリ (CSRF / XSRF) (CSRF) 攻撃方法がトリッキーで分かりにくい けど対策はシンプルで分かりやすい。 システム全体に影響するので 対策した後のテストが大変そうだ・・・。 検査員 これなら大丈夫ww
  3. !  混沌、混乱、誤解、不平不満… 検査員 開発者 (検査前) アクセス制御はちゃんと作ってあります。 バッチリ問題ないはずですよ~。 ネットワークでもしっかり防いでいます し・・・。 (報告)

    怖さが伝わらないかも・・・。 直し方もお伝えするのが難しいな・・・。 システム全体に展開していただける だろうか・・・。 アクセス 制御の問題 (再検査) ああ、やっぱり直ってない・・・orz (検査) アクセス制御の定義を確認でき ないと事象の判断が難しい・・・。 検査環境によって検出できたり、 できなかったりします。 ツールでは見つけられないこと が多いです。 (評価) ちゃんと作ったはずなのに指摘されるなんて・・・。 フレームワークがやってくれてるのではないの? こんなの大した問題ではないのでは・・・。 (対策) どう対策したらいいのかさっぱり分からないよ・・・。 この対策でちゃんとできているだろうか・・・。 何だか他の場所にもあるような気がしてきた・・・。
  4. !  JVN iPedia 脆弱性対策情報データベース
 (http://jvndb.jvn.jp/index.html) ◦  CVSSによる深刻度 !  CVSS(共通脆弱性評価システム:Common Vulnerability

    Scoring System) ◦  IPA/情報セキュリティ/共通脆弱性評価システムCVSS概説
 (http://www.ipa.go.jp/security/vuln/CVSS.html) 深刻度 CVSS基本値 レベルⅢ (危険) 7.0~10.0 レベルⅡ (警告) 4.0~6.9 レベルⅠ (注意) 0.0~3.9 アクセス制御の問題は 大変危険!!!
  5. !  OWASP 「OWASP TOP 10 – 2013 日本語版」 ◦  OWASP

    / OWASP Top 10 – 2013 日本語版
 (https://www.owasp.org/images/7/79/ OWASP_Top_10_2013_JPN.pdf) 「A4 - 安全でない    オブジェクト直接参照」 「A7 - 機能レベル    アクセス制御の欠落」
  6. !  「あるサブジェクト(能動体、人間やプロセス)が、どのオブ ジェクト(受動体、システムやファイル)に対して、どのアク セス(読み/書き/実行)ができるかを許可したり拒否し たりする機能を指す。」 !  Wikipedia / アクセス制御 /

    コンピュータセキュリティのアクセス制御 (http://ja.wikipedia.org/wiki/アクセス制御) !  「システム内のリソースに対するアクセス要求に対し、その 可否を制御することによって、セキュリティの目的を達成す るための技術である。 」 !  IPA 2004 情財第 736 号 / アクセス制御に関するセキュリティポリ シーモデルの調査 報告書 / 2.1.2 アクセス制御(http:// www.ipa.go.jp/security/fy16/reports/access_control/ documents/PolicyModelSurvey.pdf)
  7. !  何を見て判定するのか?(xは何か?) ◦  要求のコンテキスト 機能(Verb)に 対する要求の コンテキスト その他 (Else) 主体

    (Subject) 対象 (Object) 判定式 result = ACF(S,V,O,E)
           = ACFV (S,O,E) コンテキストの組み合わせは7通り
 [S], [O], [E], [S-O], [S-E], [O-E], [S-O-E] その他(E:else)の要素 (システム日付、通信経路など) 要求の対象(O:object)とその 属性(所有者、状態、期間など) 要求の主体(S:subject)と その属性(権限、ロールなど) 要求されている 機能(V:verb)
  8. !  どのように判定するか? ◦  判定論理 → プログラムコード ◦  判定基準(アクセス制御ポリシー)  → マスタデータ 判定論理 コンテキスト 判定基準

    判定結果 コンテキストを評価 コンテキスト間の関連、整合性を評価 コンテキストを基準に対して照会 判定論理の挙動を パラメータ化
  9. !  どうやってアクセス制御を実装したらよいのか? !  IPA 「セキュアプログラミング講座」 / Webアプリケーション編
 / 第2章 アクセス制御

    / アクセス認可
 (http://www.ipa.go.jp/security/awareness/vendor/ programmingv2/contents/102.html) 詳しく書いてあります!? 必読です!!
  10. 1.  操作無効のボタン・リンクを有効化 2.  URLを直接指定 3.  リクエストを直接指定 4.  後続処理のURL・リクエストを直接指定 5.  検索結果一覧表示から詳細表示にてオブジェクトIDを指定

    6.  ニュース機能の詳細表示にてオブジェクトIDを指定 7.  削除済みのオブジェクトIDを指定 8.  リスト選択でリストにない項目IDを指定 9.  ダウンロードコンテンツのURLを直接指定 10.  ブラウザから渡される制御パラメータを改ざん 11.  データ項目の参照・更新制御 12.  不完全なエラー処理
  11. !  攻撃者は、任意のHTTPリクエストを作成して、サーバーに送 信することが可能です。 POST https://appsecapac.org/2014/page/ HTTP/1.1 Referer: https://appsecapac.org/2014/ Content-Type: application/x-www-form-urlencoded

    Host: appsecapac.org Content-Length: 10 Cookie: wfvt_3032309459=52e3b9f192d… func=admin HTTPリクエスト ※クッキーは一般ユーザーでログインしたときに設定されたもの
  12. !  攻撃者は、管理者用機能のリクエスト(ダウンロード処理)を直 接指定します。 ◦  システムには「メニュー」 → 「検索」 → 「一覧表示」 →

    「入力」 → 「確 認」 → 「完了」 といった処理フローがあります。 ◦  処理フローの先頭でチェックした後はアクセス制御をチェックしていませ ん。 POST https://appsecapac.org/2014/page/ HTTP/1.1 Content-Type: application/x-www-form-urlencoded Host: appsecapac.org Content-Length: 17 Cookie: wfvt_3032309459=52e3b9f192d… func=admin.export HTTPリクエスト
  13. !  攻撃者は、詳細表示のリクエストに含まれる購入履歴IDの値 を改ざんします。 ◦  事前に購入履歴IDを知っている必要があります。 !  推測可能なオブジェクトID(日付や連番など) GET http://acshopping.test/orderdetails/5 HTTP/1.1

    Host: acshopping.test Referer: http://acshopping.test/customer/orders Cookie: ASP.NET_SessionId=o0ijy1o5hky4yeta033s0i3w;… HTTPリクエスト GET http://acshopping.test/orderdetails/3 HTTP/1.1 Host: acshopping.test Referer: http://acshopping.test/customer/orders Cookie: ASP.NET_SessionId=o0ijy1o5hky4yeta033s0i3w;…
  14. !  攻撃者は、「詳細表示」のリクエストに含まれるニュースIDを 改ざんします。 ◦  事前にニュースIDを知っている必要があります。 GET http://acshopping.test/20140201 HTTP/1.1 Host: acshopping.test

    Referer: http://acshopping.test/ Cookie: ASP.NET_SessionId=idtbjidawiwgmwrv02cwn54t;… HTTPリクエスト GET http://acshopping.test/20140321 HTTP/1.1 Host: acshopping.test Referer: http://acshopping.test/ Cookie: ASP.NET_SessionId=idtbjidawiwgmwrv02cwn54t; …
  15. !  攻撃者は、フォーラム投稿IDを改ざんします。 ◦  事前にフォーラム投稿IDを知っている必要があります。 GET http://acshopping.test/boards/topic/5 HTTP/1.1 Host: acshopping.test Referer:

    http://acshopping.test/customer/orders Cookie: ASP.NET_SessionId=o0ijy1o5hky4yeta033s0i3w;… HTTPリクエスト GET http://acshopping.test/boards/topic/4 HTTP/1.1 Host: acshopping.test Referer: http://acshopping.test/customer/orders Cookie: ASP.NET_SessionId=o0ijy1o5hky4yeta033s0i3w;…
  16. !  攻撃者は、リクエストに含まれる店舗IDを改ざんします。 ◦  他社の店舗IDを事前に知っている必要があります。 HTTPリクエスト POST http://acshopping.test/Admin HTTP/1.1 Host: acshopping.test

    Content-Type: application/x-www-form-urlencoded Content-Length: 17 Cookie: ASP.NET_SessionId=o0ijy1o5hky4yeta033s0i3w;… shopId=C0050S0001 POST http://acshopping.test/Admin HTTP/1.1 Host: acshopping.test Content-Type: application/x-www-form-urlencoded Content-Length: 17 Cookie: ASP.NET_SessionId=o0ijy1o5hky4yeta033s0i3w;… shopId=C0121S0002 HTMLソースに記述された自社店舗一覧 <select> <option value="C0121S0001">Tokyo</option> <option value="C0121S0002">Osaka</option> <option value="C0121S0003">London</option> <option value="C0121S0004">Paris</option> <option value="C0121S0005">NewYork</option> </select>
  17. !  攻撃者は、コンテンツのURLを直接指定します。 ◦  事前にコンテンツのURLを知っている必要があります。 GET http://acshopping.test/images/iphone.jpg HTTP/1.1 Host: acshopping.test Connection:

    keep-alive Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9 ,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit /537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537 .36 Accept-Encoding: gzip,deflate,sdch Accept-Language: ja,en-US;q=0.8,en;q=0.6 Pragma: no-cache HTTPリクエスト
  18. !  攻撃者は、「クッキー」で渡される「権限レベル」の値を改ざん します。 ◦  「権限レベル」 = { 0: 一般ユーザー、9: 管理者ユーザー

    } GET http://acshopping.test/ HTTP/1.1 Host: acshopping.test Referer: http://acshopping.test/ Cookie: ASP.NET_SessionId=riy0n2ir3vm410abeuu3cael; aclv=0… HTTPリクエスト GET http://acshopping.test/ HTTP/1.1 Host: acshopping.test Referer: http://acshopping.test/ Cookie: ASP.NET_SessionId=riy0n2ir3vm410abeuu3cael; aclv=9…
  19. !  攻撃者は、更新処理のリクエストを改ざんします。 POST http://acshopping.test/Admin/ProductReview/Edit/2 HTTP/1.1 Host: acshopping.test Cookie: ASP.NET_SessionId=0diwftbjzf5sxlhs20td3yzm; ...

    save=save-continue&Id=2&Title=%E3%81…%80%82&IsApproved=true HTTPリクエスト POST http://acshopping.test/Admin/ProductReview/Edit/2 HTTP/1.1 Host: acshopping.test Cookie: ASP.NET_SessionId=0diwftbjzf5sxlhs20td3yzm; ... save=save-continue&Id=2&Title=%E3%81…%80%82&IsApproved=true &Rating=1
  20. !  データ項目「レーティング」が更新されます。 検査員 データ項目レベルのアクセス制御にも注意する必要があります。 ・参照すべきでないデータ項目をレスポンスしないこと  「画面に表示しない」だけではダメ!! ・更新すべきでないデータ項目がリクエストに渡されても  更新しないこと 開発者 でも、この事例そんなに怖くないのでは???

    今までの中にもさほど怖くないものもあったような・・・ 検査員 ですよね~。 アクセス制御がないのは確かですが、そもそも必要か どうかを明確に定義しなければ判断できません。 ところで、アクセス制御の定義書はございますか?
  21. HTTPリクエスト GET http://acshopping.test/orderdetails/3 HTTP/1.1 Host: acshopping.test Referer: http://acshopping.test/customer/orders Cookie: ASP.NET_SessionId=o0ijy1o5hky4yeta033s0i3w;…

    HTTP/1.1 301 Moved Permanently Content-Type: text/html; charset=UTF-8 Location: http://acshopping.test/error_accessdenied Server: Microsoft-IIS/7.5 Content-Length: 0 HTTPレスポンス HTTPリクエスト GET http://acshopping.test/error_accessdenied HTTP/1.1 Host: acshopping.test Referer: http://acshopping.test/customer/orderdetails/3 Cookie: ASP.NET_SessionId=o0ijy1o5hky4yeta033s0i3w;…
  22. [システム設計~実装テスト工程] !  ブラウザ側のアクセス制御には頼らないこと !  ブラウザ側の制御はユーザビリティ向上が目的だと認識する。 !  全てのリクエストにてサーバ側でアクセスの可否を判定
 すること !  「A4

    –安全でないオブジェクト直接参照」 !  「A7 – 機能レベルアクセス制御の欠落」 !  制御パラメータをブラウザから渡さないこと !  セッション管理を行い、サーバ側で保持すること !  データ項目の参照・更新制御に注意すること !  アクセス制御エラー時の処理に注意すること
  23. [システム設計工程] !  従来のC/SアプリとWebアプリは違うと認識すること ◦  ブラウザからやってくるリクエストは信用できない。 ◦  HTTPはオープンなプロトコル、HTML、CSS、JavaScriptは解析可能 !  フレームワークに隠蔽されたHTTPを意識すること ◦ 

    全てのHTTPリクエストでアクセス制御できているのが望ましい。 [要件定義~システム分析工程] !  アクセス制御を漏れ抜けなく洗い出し、誤りなく定義すること ◦  あるべき仕様が定義されなければ、あるべき実装は期待できない。 ◦  定義されていなければ、検査時にも判断がつかない場合がある。