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

12 Case Studies for the Access Controls of Web ...

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for OWASP Japan OWASP Japan
March 19, 2014
1.7k

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

Avatar for OWASP Japan

OWASP Japan

March 19, 2014
Tweet

More Decks by OWASP Japan

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