Spacewalkにおけるクロスサイトフォージェリ(CSRF)の脆弱性

Similar documents
Apache Tomcatにおけるクロスサイトリクエストフォージェリ(CSRF)保護メカニズム回避の脆弱性

JBoss Application Server におけるディレクトリトラバーサルの脆弱性

Apache ActiveMQ における認証処理不備の脆弱性

MySQL Connector/J における SQL インジェクションの脆弱性

Apache Axis2 におけるXML署名検証不備

内容 ( 演習 1) 脆弱性の原理解説 基礎知識 脆弱性の発見方法 演習 1: 意図しない命令の実行 演習解説 2

Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

Blojsom におけるクロスサイトスクリプティングの脆弱性

Oracle Java 標準ライブラリ AtomicReferenceArray クラスにおけるデシリアライズに関する脆弱性

ログを活用したActive Directoryに対する攻撃の検知と対策

第 7 回の内容 動的な Web サイト フォーム Web システムの構成

JEB Plugin 開発チュートリアル 第4回

はじめての暗号化メール(Thunderbird編)

WTM2019SingleSignOn

SpringSecurity

WebOTXマニュアル

Microsoft PowerPoint - Lecture_3

JEB Plugin 開発チュートリアル 第3回

メディプロ1 Javaサーブレット補足資料.ppt

Webプログラミング演習

SOC Report

PowerPoint プレゼンテーション

制御システムセキュリティアセスメントサービス

ビジネスサーバ設定マニュアル_Standard応用編

SQL インジェクションの脆弱性

WEBシステムのセキュリティ技術

Javaセキュアコーディングセミナー東京 第4回 メソッドとセキュリティ 演習解説

JPCERT/CC インターネット定点観測レポート[2014年7月1日~9月30日]

第2回_416.ppt

Microsoft PowerPoint - Lecture_2

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

SOC Report

プレポスト【問題】

はじめに インフォマート API の呼び出しには OAuth2.0 による認証を受ける必要があります OAuth2.0 を使うことで インフォマート API を利用するサービスは インフォマートプラットフォーム ID( 1 以下 PFID) とパスワードを保存したり処理したりすることなく PFID

PowerPoint プレゼンテーション

PowerPoint Presentation

べきでない悪意のあるSQL 文が攻撃者から入力された場合 データベースで実行される前にSQL 文として処理されないよう無効化する必要がありますが ( 図 1 1) 無効化されずにデータベースで実行された場合 データベースの操作が可能となります ( 図 1 2) 本脆弱性を悪用するとデータベース接続ユ

2015 年 4 月 15 日に発表された HTTP.sys の脆弱性 ( ) へ の対応について 製品名 : バージョン : 対象プラットフォーム : カテゴリ : iautolaymagic すべてすべて Web アプリ この度 マイクロソフト社製品において緊急度の高い脆弱性 (CV

OSSTechドキュメント


スライド タイトルなし

intra-mart Accel Platform — Slack連携モジュール 利用ガイド   初版  

J-Payment クレジットカード 決済システム接続仕様書

ご利用のコンピュータを設定する方法 このラボの作業を行うには 事前設定された dcloud ラボを使用するか 自身のコンピュータをセットアップします 詳細については イベントの事前準備 [ 英語 ] とラボの設定 [ 英語 ] の両方のモジュールを参照してください Python を使用した Spar

1 ユーザ認証を受けた権限で アプリケーションを利用するために ログインプロキシにアクセスします 2 ログインプロキシにより Shibboleth SP から Shibboleth IdP の認証画面にリダイレクトされます 3 ブラウザに認証画面を表示します 4 認証画面にユーザ / パスワードを入

安全な Web サイトの作り方 7 版 と Android アプリの脆弱性対策 独立行政法人情報処理推進機構 (IPA) 技術本部セキュリティセンター Copyright 2015 独立行政法人情報処理推進機構

— intra-martで運用する場合のセキュリティの考え方    

ArcGIS for Server での Web マップの作成方法

<< 目次 >> 1 PDF コンバータのインストール ライセンスコードの入力 PDF にフォントを埋め込みたい場合の設定 PDF オートコンバータ EX で使用しない場合 PDF コンバータ単体で使用する場合の説明 PDF コンバータのアン

基本情報STEP UP演習Java対策

5-5_arai_JPNICSecSemi_XssCsrf_CM_ PDF

Apache Commons の HttpClient におけるSSLサーバ証明書検証不備

ステップ 1:Cisco Spark にサインアップして試してみよう 1. Spark のホームページ ( で電子メールアドレスを入力し 指示に従って Spark アカウントを作成します 注 : 自身の電子メールアカウントにアクセスして Spar

PowerPoint Presentation

(8) [ 全般 ] タブをクリックします (9) [ インターネット一時ファイル ] の [ 設定 ] ボタンをクリックします (10) [ 保存しているページの新しいバージョンの確認 ] から [ ページを表示するごとに確認する ] をクリックします (11) [OK] ボタンをクリックしていき

デジタル表現論・第6回

Prog2_12th

9 WEB監視

intra-mart WebPlatform/AppFramework

Microsoft Word - XOOPS インストールマニュアルv12.doc

実験 5 CGI プログラミング 1 目的 動的にWebページを作成する手法の一つであるCGIについてプログラミングを通じて基本的な仕組みを学ぶ 2 実験 実験 1 Webサーバの設定確認と起動 (1)/etc/httpd/conf にある httpd.conf ファイルの cgi-bin に関する

◎phpapi.indd

CA Federation ご紹介資料

JPCERT/CCインシデント報告対応レポート[2015年4月1日 ~ 2015年6月30日]

Webデザイン論

Prog1_6th

intra-mart Accel Platform — IM-BloomMaker プログラミングガイド   初版  

HDC-EDI Manager Ver レベルアップ詳細情報 < 製品一覧 > 製品名バージョン HDC-EDI Manager < 対応 JavaVM> Java 2 Software Development Kit, Standard Edition 1.4 Java 2

SAMBA Stunnel(Windows) 編 1. インストール 1 セキュア SAMBA の URL にアクセスし ログインを行います xxx 部分は会社様によって異なります xxxxx 2 Windows 版ダウンロード ボ

セットアップの流れ Graphtec Pro Studio を使用する SAi Cloud へのユーザー登録 1-1 SAi Cloud へのユーザー登録 Graphtec Pro Studio のインストール 1-2 Graphtec Pro Studio のインストール Cutting Mast

spsafety_manual_sp_start_

allows attackers to steal the username-password pair saved in the password manager if the login page or other pages in the same domain are vulnerable

DB STREET 設置マニュアル

動作環境 ( 閲覧パソコン ) 新規でご利用いただく場合 : 項目条件対応 OS Windows 7 / 10 対応 Web ブラウザ Internet Explorer 11 / Google Chrome / Mozilla Firefox 但し Google Chrome のリビジョンによって

Microsoft Word - tutorial3-dbreverse.docx

Servlet/JSP ( 作成中 ) 2010 年 x 月 x 日作成 Firebird 日本ユーザー会 Naoyuki Sano 1

Microsoft PowerPoint - Userguide-SyoninMail-v1.0.ppt

JavaScript 演習 2 1

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成

前ページからの続き // テキストボックス02 id 属性で取得 // id 属性で取得する場合は一意に決まるので 何番目かの指定は不要 var textbox02elem = document.getelementbyid("text_box02_id"); if ("001" == statee

機能性表示食品制度届出データベース届出マニュアル ( 食品関連事業者向け ) 4-6. パスワードを変更する 画面の遷移 処理メニューより パスワード変更 を選択すると パスワード変更 画面が表示されます パスワード変更 画面において パスワード変更 をクリックすると パスワード変更詳細 画面が表示

アカウント管理者 操作ドキュメント

Simple Violet

平成 30 年度 プログラミング研修講座 岩手県立総合教育センター

ご利用のブラウザのバージョンによっては 若干項目名が異なる場合があります 予めご了承ください Windows をお使いの場合 [ 表示 ] [ エンコード ] [ 日本語 ( 自動選択 )] を選択 [ 表示 ] [ エンコード ] [Unicode(UTF-8)] を選択 Firefox をご利用

コンテンツメディアプログラミング実習2


Microsoft PowerPoint - Tutorial_6.ppt

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

平成30年度 パソコン・ネットワークの設定について

PowerPoint プレゼンテーション

7 PIN 番号入力後 以下のアプレットエラーが表示されます 署名検証が失敗しました 署名検証が行なわれませんでした 8 PIN 番号入力後 以下のアプレットエラーが表示されます APPLET-ERROR APPLET-ERROR APPL

在学生向けメールサービス

はじめに (1) フィッシング詐欺 ( フィッシング攻撃 ) とは フィッシング詐欺とは インターネットバンキング ショッピングサイト等の利用者のアカウント情報 (ID パスワード等 ) や クレジットカードの情報等を騙し取る攻撃です 典型的な手口としては 攻撃者が本物のウェブサイトと似た偽のウェブ

Himawari の異常な暗号

ファイルの内容本プログラムのファイルの内容は 以下の通りです form.cgi フォームプログラム ( パーミッション 755) form.html 入力及び確認画面用 html ファイル ( パーミッション 644) error.html エラー画面用 html ( パーミッション 644) fi

Brekeke PBX - Version 2.1 ARSプラグイン開発ガイド

Microsoft PowerPoint - Userguide-keitai-douga-v1.1.ppt

PowerPoint プレゼンテーション

Transcription:

Japan Computer Emergency Response Team Coordination Center 電子署名者 : Japan Computer Emergency Response Team Coordination Center DN : c=jp, st=tokyo, l=chiyoda-ku, email=office@jpcert.or.jp, o=japan Computer Emergency Response Team Coordination Center, cn=japan Computer Emergency Response Team Coordination Center 日付 : 2013.09.30 16:18:17 +09'00' Javaアプリケーション脆弱性事例調査資料 について この資料は Javaプログラマである皆様に 脆弱性を身 近な問題として感じてもらい セキュアコーディングの 重要性を認識していただくことを目指して作成していま す Javaセキュアコーディングスタンダード CERT/Oracle版 と合わせて セキュアコーディングに 関する理解を深めるためにご利用ください JPCERTコーディネーションセンター セキュアコーディングプロジェクト secure-coding@jpcert.or.jp 1

Spacewalk におけるクロスサイトリクエストフォージェリ (CSRF) の脆弱性 CVE-2009-4139 JVNDB-2011-003800 2

Spacewalk とは Spacewalk は Web ベースの Linux システムの統合管理ツール Red Hat 社がリリースしている Red Hat Network Satellite のオープンソース版 3

Spacewalkとは統合管理ツールとして以下が実施可能 ハードウエア ソフトウエアのインベントリ管理 ソフトウェアのインストールやアップデート 設定ファイルの管理と展開 システムのモニタリング 4

脆弱性の概要 Spacewalk には クロスサイトリクエストフォージェリの脆弱性が存在する 脆弱性を悪用されることで 被害者が意図しない操作を実行させられる可能性がある Spacewalk ではシステムの管理機能を提供しているため 被害者が意図しない設定変更等が行われてしまう 5

クロスサイトリクエストフォージェリとは 攻撃者の罠サイトにアクセスさせ ログインしている Web サービスの機能を 意図せず実行させる攻撃 2 ユーザを攻撃者の web サイトに誘導 3 攻撃者の web サイトにアクセス 4 攻撃コードを含むレスポンス 5 セッション ID + 処理実行のリクエスト 6 処理確定のレスポンス 1 ログイン解像度 UP 攻撃対象の Web アプリケーション 6

脆弱性が悪用された場合のリスク ユーザの意図しない機能の実行 Web サイトが提供している機能により リスクは異なる 例えば 掲示板に投稿する機能があった場合 攻撃者によって意図しない投稿をさせられるかも 商品を購入する機能があった場合 攻撃者によって意図しない商品購入をさせられるかも 意図しない機能の実行 犯行予告!! xxxxxxxx 被害者 掲示板書き込み 決済の実行 7

Spacewalk の処理フロー アカウント停止機能を実行する場合の処理フローを解説する 画面遷移にしたがってユーザが操作を行い 処理が行われる アカウント停止機能を実行する際のSpacewalkの処理フロー 1 ユーザがSpacewalkにログインする 2 ユーザがアカウント停止機能を実行しリクエストが送信される 3 Spacewalkがリクエストを受信し 処理を実行する 4 結果を含むレスポンスがユーザへ送信される 8

1 ユーザが Spacewalk にログインする ユーザがログインし セッションを取得する (Cookie を発行する ) ログイン画面 セッションに紐付いた Cookie を作成 / 発行 ログイン セッションオブジェクト Cookie セッション (Cookie) 発行 9

2 ユーザがアカウント停止機能を実行しリクエストが送信される 管理画面にログインし アカウント停止画面にアクセスする アカウント停止画面 このボタンをクリックすることで機能が実行され アカウントが停止 ( 無効 ) となる 10

3Spacewalk がリクエストを受信し 処理を実行する Spacewalk はリクエストを受信して アカウント停止機能を実行する アカウントの停止 HTTP リクエスト POST /rhn/account/accountdeactivationconfirm.do HTTP/1.1 : Host: www.example.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98; pxt-session-cookie=29x6ad3ed33446e2669c5e60a4b3080713a submitted=true 11

4 結果を含むレスポンスがユーザへ送信される アカウント停止処理が終了し 結果をレスポンスとしてユーザへ送信する アカウントが無効となり ログイン画面に戻る Success!! 12

機能実行時詳細 アカウント停止機能実行時の処理フローにおける 2 の処理を詳しく見てみよう アカウント停止機能を実行する際の Spacewalk の処理フロー 1 ユーザが Spacewalk にログインする 2 ユーザがアカウント停止機能を実行しリクエストが送信される 3 Spacewalk がリクエストを受信し 処理を実行する 4 結果を含むレスポンスがユーザへ送信される POST /rhn/account/accountdeactivationconfirm.do HTTP/1.1 : Host: www.example.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98; pxt-session-cookie=29x6ad3ed33446e2669c5e60a4b3080713a submitted=true HTTP リクエスト 13

機能実行時詳細 2 ユーザがアカウント停止機能を実行しリクエストが送信される アカウント停止画面の Form 要素 (HTML) と 機能実行時の HTTP リクエスト HTML ソース ( 抜粋 ) You will be logged out immediately after pressing the Deactivate Account button below, and <b>will be unable to log back in</b>. </p> </div> <hr /> <form method="post" name="rhn_list" action="/rhn/account/accountdeactivationconfirm.do"> <div align="right"> <input type="submit" value="deactivate Account" /> </div> <input type="hidden" name="submitted" value="true" /> </form> Deactivate ボタンを押したときに送信される HTTP リクエスト POST /rhn/account/accountdeactivationconfirm.do HTTP/1.1 送信されるデータにForm 要素固有 : の値は含まれておらず 毎回同じ Host: www.example.com データとなっている Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98; pxt-sessioncookie=29x6ad3ed33446e2669c5e60a4b3080713a submitted=true Deactivate Account のクリックで送信される Form 要素 14

問題点 Spacewalk がユーザからのリクエストを処理する際に 正しい画面遷移でリクエストが送信されてきたかを検証していなかった 参考 CWE(Common Weakness Enumeration) CWE-352 クロスサイトリクエストフォージェリ http://cwe.mitre.org/data/definitions/352.html 15

攻撃実行時の処理フロー 通常の処理フロー アカウント停止機能を実行する際の処理フロー 1 ユーザが Spacewalk にログインする 2 ユーザがアカウント停止機能を実行しリクエストが送信される 3 Spacewalk がリクエストを受信し 処理を実行する 4 結果を含むレスポンスがユーザへ送信される 攻撃実行時は 2 の前にユーザが攻撃者サイトへ誘導され 以下のようなフローとなる 攻撃実行時の処理フロー アカウント停止機能を実行する際の Spacewalk の処理フロー 1 ユーザが Spacewalk にログインする 2-1 ユーザが何らかの方法で攻撃者のサイトに誘導され 攻撃コードを実行するコンテンツにアクセスする 2-2 アカウント停止機能を実行するためのリクエストがユーザのブラウザから Spacewalk に対して送信される 3 Spacewalk がリクエストを受信し 処理を実行する 4 結果を含むレスポンスがユーザへ送信される 16

誘導先の攻撃者サイト上のコンテンツ ( 攻撃コード ) 攻撃者は以下のようなコンテンツを用意し Spacewalk にログイン中のユーザを誘導する 攻撃コードの HTTP リクエストを送信するためのコンテンツ (HTML) <html> <body onload="document.atkform.submit()"> コンテンツにアクセスすると以下の Form 要素が自動送信される <form method="post" name="atkform action="https://www.spacewalkserver.com/rhn/account/accountdeactivationconfirm.do"> <input type="hidden" name="submitted" value="true" /> </form> </body> </html> アカウント停止機能を実行する Form 要素 HTML 17

攻撃コードから送信されるリクエスト コンテンツにアクセスすると送信される HTTP リクエスト POST /rhn/account/accountdeactivationconfirm.do HTTP/1.1 : Host: www.victim.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98; pxt-session-cookie=29x6ad3ed33446e2669c5e60a4b3080713a 1 submitted=true 攻撃コードのポイント ユーザは Spacewalk にログイン中であるため Cookie ヘッダの値は Spacewalk から発行された Cookie が自動的に送信される (1 部分 ) このリクエストを受信した Spacewalk は ログイン中のユーザーからのリクエストとして処理する 通常の処理で送信されるリクエストと全く内容が一緒であり Spacewalk にはリクエストが正常なものか ( サイト内の正常な遷移で送信されたものかどうか ) 区別できない 18

通常時 / 攻撃実行時のフロー比較 通常の処理フロー HTTP リクエスト POST /rhn/account/accountdeactivationconfirm.do HTTP/1.1 : Host: www.example.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98; pxt-session-cookie=29x6ad3ed33446e2669c5e60a4b3080713a submitted=true 機能の実行アカウントの停止 攻撃者のサイトへ誘導された際の処理フロー 実行!! 誘導 攻撃コード HTML HTTP リクエスト POST /rhn/account/accountdeactivationconfirm.do HTTP/1.1 : Host: www.example.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98; pxt-session-cookie=29x6ad3ed33446e2669c5e60a4b3080713a アプリケーションにとっては全く同じリクエストであり 区別がつかない!! submitted=true 攻撃者のサイト 19

対策 機能実行の際は 正しい画面遷移からの実行であることを確認するべき 一般的な CSRF 対策 : トークンを生成し セッションに格納する 同時にリクエストの Form 要素にもトークンを含める 機能実行時にセッションとリクエストのトークンが一致することを検証する 攻撃者がその値を予測したり総当たりで探索したりする可能性をふまえ トークンの値は乱数を使って生成し 十分な長さを持った値にする必要がある 20

修正版コード 脆弱性はバージョン1.2.39-85にて修正が適用されている アカウント停止機能を実行する際のSpacewalkの処理フロー 1 ユーザがSpacewalkにログインする 2 ユーザがアカウント停止画面にアクセス時に Spacewalk は トークンを発行しForm 要素に埋め込む さらにセッション変数にトークンを格納する 2 ユーザがアカウント停止機能を実行しリクエストが送信される 2 前処理 後処理 Spacewalk は送信されてきたトークンとセッション変数に格納 されているトークンが同一であることを確認する ` 3 Spacewalkがリクエストを受信し 処理を実行する 4 結果を含むレスポンスがユーザへ送信される 2 前処理 と 2 後処理 が追加されている 21

修正版コード 2 Form 要素へのトークン発行とセッション変数への格納 ユーザがアカウント停止画面にアクセスした際に トークンを生成しアクセスしたユーザのセッションに格納する ユーザ アカウント停止画面 (disableselfconfirm.jsp).jsp サーバ (Spacewalk) トークン 1 トークンを生成 セッションオブジェクト トークン HTTP レスポンス HTTP/1.1 200 OK : <form method="post" name="rhn_list" action="/rhn/account/accountdeactivationconfirm.do"> <input type="hidden" name="csrf_token value="-5813750909365530134" /> <div align="right"> <input type="submit" value="deactivate Account" /> </div> <input type="hidden" name="submitted" value="true" /> </form> トークン 2 トークンをセッション変数に格納 3 さらにトークンを HTTP レスポンスの Form 要素内の hidden 属性に格納 22

修正前 / 修正後のソース比較 2 Form 要素へのトークン発行とセッション変数への格納 disableselfconfirm.jsp ( 修正前 ) <form method="post" name="rhn_list" action="/rhn/account/accountdeactivationsubmit.do"> <div align="right"> <html:submit> <bean:message key="disableself.jsp.deactivate"/> </html:submit> </div> </form> disableselfconfirm.jsp ( 修正後 ) <form method="post" name="rhn_list" action="/rhn/account/accountdeactivationsubmit.do"> <rhn:csrf /> <div align="right"> カスタムタグ rhn:csrf が追加されている <html:submit> <bean:message key="disableself.jsp.deactivate"/> </html:submit> </div> </form> 23

修正版コード 2 Form 要素へのトークン発行とセッション変数への格納 disableselfconfirm.jsp <rhn:csrf /> カスタムタグにより CsrfTag クラスの dostarttag メソッドが呼び出される (JSP の機能 ) CsrfTag.java public class CsrfTag extends HiddenTag { : public int dostarttag() throws JspException { HttpServletRequest request = (HttpServletRequest) pagecontext.getrequest(); HttpSession session = request.getsession(true); this.setproperty("csrf_token"); this.setvalue(csrftokenvalidator.gettoken(session)); セッションを取得 } super.dostarttag(); return SKIP_BODY; トークンを生成し セッションに格納する 24

修正版コード 2 Form 要素へのトークン発行とセッション変数への格納 参考 CSRFTokenValidator クラスの gettoken メソッド public final class CSRFTokenValidator { : public static String gettoken(httpsession session) { String tokenvalue = (String) session.getattribute(token_key); if (tokenvalue == null) { // Create new token if necessary tokenvalue = createnewtoken(default_algorithm); session.setattribute(token_key, tokenvalue); } return tokenvalue; } セッションへの格納 トークンの生成 25

修正版コード 2 Form 要素へのトークン発行とセッション変数への格納 disableselfconfirm.jsp <rhn:csrf /> CsrfTag クラスは HiddenTag クラスを継承しており setproperty メソッドや setvalue メソッドで指定された値は Form 要素内の hidden 属性で出力される CsrfTag.java public class CsrfTag extends HiddenTag { : public int dostarttag() throws JspException { HttpServletRequest request = (HttpServletRequest) pagecontext.getrequest(); HttpSession session = request.getsession(true); this.setproperty("csrf_token"); this.setvalue(csrftokenvalidator.gettoken(session)); } super.dostarttag(); return SKIP_BODY; プロパティをセットすることで HTML の Form 要素内に以下のような形で出力される <input type= hidden name= csrf_token value= <gettoken() で作成されたトークン >" /> 26

修正版コード 3 ユーザがアカウント停止機能を実行しリクエストが送信される ユーザ アプリケーション側ではセッションに関連付けされたトークンを保持している JSESSIONID= 81099D8047CF94FEA3FB447C3C24AF98 セッションオブジェクト csrf_token -58137 送信される HTTP リクエスト POST /rhn/account/accountdeactivationconfirm.do HTTP/1.1 : Host: www.example.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98 csrf_token = -5813750909365530134&submitted=true Form 要素内の hidden 属性に出力されたトークンの値が送信される 27

修正版コード 4 アプリケーションによるトークンの検証 Spacewalk は送信されてきたリクエスト内のトークンとセッション内のトークンが同じものであるかを検証する JSESSIONID= 81099D8047CF94FEA3FB447C3C24AF98 セッションオブジェクト csrf_token -58137 トークン 検証!! トークン 送信される HTTP リクエスト POST /rhn/account/accountdeactivationconfirm.do HTTP/1.1 : Host: www.example.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98 csrf_token = -5813750909365530134&submitted=true 28

修正版コード 4 アプリケーションによるトークンの検証 リクエスト受信時に CSRFTokenValidator クラスの validate メソッドが呼び出され トークンの検証を行う ( 本クラスは修正版コードに追加されたもの ) CSRFTokenValidator.java public final class CSRFTokenValidator { : public static void validate(httpservletrequest request) throws CSRFTokenException { HttpSession session = request.getsession(); セッション変数とリクエストにトークンが含まれているかを検証 if (session.getattribute(token_key) == null) { throw new CSRFTokenException("Session does not contain a CSRF security token"); } if (request.getparameter(token_key) == null) { throw new CSRFTokenException("Request does not contain a CSRF security token"); } } if (!session.getattribute(token_key).equals(request.getparameter(token_key))) { throw new CSRFTokenException("Validation of CSRF security token failed"); } 29

修正版コード 4 アプリケーションによるトークンの検証 リクエスト受信時に CSRFTokenValidator クラスの validate メソッドが呼び出され トークンの検証を行う ( 本クラスは修正版コードに追加されたもの ) CSRFTokenValidator.java public final class CSRFTokenValidator { : public static void validate(httpservletrequest request) throws CSRFTokenException { HttpSession session = request.getsession(); if (session.getattribute(token_key) == null) { throw new CSRFTokenException("Session does not contain a CSRF security token"); } セッション変数とリクエストに含まれるトークンが同一であるかを検証 if (request.getparameter(token_key) == null) { throw new CSRFTokenException("Request does not contain a CSRF security token"); } } if (!session.getattribute(token_key).equals(request.getparameter(token_key))) { throw new CSRFTokenException("Validation of CSRF security token failed"); } 30

修正版コード 5 アプリケーションがリクエストを受信し 処理を実行する トークンの検証結果に応じて 機能実行とエラー処理のどちらかを行う 通常の処理フロー ( トークンの検証 OK) HTTP リクエスト トークンが含まれている セッションオブジェクト トークン POST /rhn/account/accountdeactivationconfirm.do HTTP/1.1 : Host: www.example.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98 csrf_token = -5813750909365530134&submitted=true 検証!! 機能の実行アカウントの停止 攻撃コード実行時の処理フロー ( トークンの検証 NG) 実行!! 誘導 HTML ユーザのブラウザから送信される HTTP リクエスト POST /rhn/account/accountdeactivationconfirm.do HTTP/1.1 : Host: www.example.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98 ; pxt-sessioncookie=29x6ad3ed33446e2669c5e60a4b3080713a 検証!! セッションオブジェクト トークン 攻撃者のサイト submitted=true トークンが含まれていない 31

まとめ クロスサイトリクエストフォージェリ Spacewalk が用意したフォームからの入力と攻撃者が用意したフォームからの入力を区別していなかった 対策 : トークンを使用することで 不正なフォームからの入力を検出できるようにするトークン使用時には以下の点を検討しておく必要がある 攻撃者に値を予測されることを防ぐ : 乱数を使って生成 総当たりで探索されることを防ぐ : 長い文字列長 大きな数値など ユーザと関連付ける トークンの有効期間を明確にする : 処理を受け付けたら無効にする, リクエストが来なかったら 60 秒で無効にする など 32

参考文献 OWASP CSRFGuard Project https://www.owasp.org/index.php/category:owasp_csrfguard_project IPA ISEC セキュア プログラミング講座 : Webアプリケーション編第 4 章セッション対策 : リクエスト強要 (CSRF) 対策 https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/301.html 安全なウェブサイトの作り方 IPA https://www.ipa.go.jp/security/vuln/websecurity.html 33

著作権 引用や二次利用について本資料の著作権は JPCERT/CC に帰属します 本資料あるいはその一部を引用 転載 再配布する際は 引用元名 資料名および URL の明示をお願いします 記載例引用元 : 一般社団法人 JPCERT コーディネーションセンター Java アプリケーション脆弱性事例解説資料 Spacewalk における CSRF の脆弱性 https://www.jpcert.or.jp/securecoding/2012/no.08_spacewalk.pdf 本資料を引用 転載 再配布をする際は 引用先文書 時期 内容等の情報を JPCERT コーディネーションセンター広報 (office@jpcert.or.jp) までメールにてお知らせください なお この連絡により取得した個人情報は 別途定める JPCERT コーディネーションセンターの プライバシーポリシー に則って取り扱います 本資料の利用方法等に関するお問い合わせ JPCERT コーディネーションセンター広報担当 E-mail:office@jpcert.or.jp 本資料の技術的な内容に関するお問い合わせ JPCERT コーディネーションセンターセキュアコーディング担当 E-mail:secure-coding@jpcert.or.jp 34