SlideShare ist ein Scribd-Unternehmen logo
1 von 34
Downloaden Sie, um offline zu lesen
Copyright©2013 JPCERT/CC All rights reserved.
「Javaアプリケーション脆弱性事例調査資料」について
この資料は、Javaプログラマである皆様に、脆弱性を身
近な問題として感じてもらい、セキュアコーディングの
重要性を認識していただくことを目指して作成していま
す。
「Javaセキュアコーディングスタンダード
CERT/Oracle版」と合わせて、セキュアコーディングに
関する理解を深めるためにご利用ください。
JPCERTコーディネーションセンター
セキュアコーディングプロジェクト
secure-coding@jpcert.or.jp
1
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'
Spacewalkにおけるクロスサイト
リクエストフォージェリ(CSRF)の脆弱性
CVE-2009-4139
JVNDB-2011-003800
2
Copyright©2013 JPCERT/CC All rights reserved.
Spacewalkとは
SpacewalkはWebベースのLinuxシステムの統合管理
ツール
Red Hat社がリリースしている「Red Hat Network
Satellite」のオープンソース版
3
Copyright©2013 JPCERT/CC All rights reserved.
Spacewalkとは
統合管理ツールとして以下が実施可能
—ハードウエア、ソフトウエアのインベントリ管理
—ソフトウェアのインストールやアップデート
—設定ファイルの管理と展開
—システムのモニタリング
4
Copyright©2013 JPCERT/CC All rights reserved.
脆弱性の概要
Spacewalkには、クロスサイトリクエスト
フォージェリの脆弱性が存在する。
脆弱性を悪用されることで、被害者が意図しな
い操作を実行させられる可能性がある。
Spacewalkではシステムの管理機能を提供して
いるため、被害者が意図しない設定変更等が行
われてしまう。
5
Copyright©2013 JPCERT/CC All rights reserved.
クロスサイトリクエストフォージェリとは
攻撃者の罠サイトにアクセスさせ、ログインし
ているWebサービスの機能を、意図せず実行さ
せる攻撃。
6
解像度UP
① ログイン
② ユーザを攻撃者のwebサイトに誘導
③ 攻撃者のwebサイトにアクセス
④ 攻撃コードを含むレスポンス
⑤ セッションID
+ 処理実行のリクエスト
⑥ 処理確定
のレスポンス
攻撃対象のWebアプリケーション
Copyright©2013 JPCERT/CC All rights reserved.
脆弱性が悪用された場合のリスク
ユーザの意図しない機能の実行
• Webサイトが提供している機能により、リスクは異なる
• 例えば、掲示板に投稿する機能があった場合、攻撃者に
よって意図しない投稿をさせられるかも
• 商品を購入する機能があった場合、攻撃者によって意図
しない商品購入をさせられるかも
7
被害者
・掲示板書き込み
・決済の実行
犯行予告!!
xxxxxxxx
意図しない機能の実行
Copyright©2013 JPCERT/CC All rights reserved.
Spacewalk の処理フロー
8
アカウント停止機能を実行する際のSpacewalkの処理フロー
① ユーザがSpacewalkにログインする。
② ユーザがアカウント停止機能を実行しリクエストが送信される。
③ Spacewalkがリクエストを受信し、処理を実行する。
④ 結果を含むレスポンスがユーザへ送信される。
アカウント停止機能を実行する場合の処理フローを解説する。
画面遷移にしたがってユーザが操作を行い、処理が行われる。
Copyright©2013 JPCERT/CC All rights reserved.
① ユーザがSpacewalkにログインする
9
ユーザがログインし、セッションを取得する。(Cookieを発行する)
ログイン
セッション(Cookie)
発行
ログイン画面
セッションオブジェクト
Cookie
セッションに紐付
いたCookieを作
成/発行
Copyright©2013 JPCERT/CC All rights reserved.
② ユーザがアカウント停止機能を実行しリクエストが送信される
10
管理画面にログインし、アカウント停止画面にアクセスする。
アカウント停止画面
このボタンをクリックすることで機能が実行され、
アカウントが停止(無効)となる。
Copyright©2013 JPCERT/CC All rights reserved.
③Spacewalkがリクエストを受信し、処理を実行する
11
Spacewalkはリクエストを受信して、アカウント停止機能を実
行する。
POST /rhn/account/AccountDeactivationConfirm.doHTTP/1.1
:
Host: www.example.com
Content-Length: 14
Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98;
pxt-session-cookie=29x6ad3ed33446e2669c5e60a4b3080713a
submitted=true
HTTPリクエスト
アカウントの停止
Copyright©2013 JPCERT/CC All rights reserved.
④ 結果を含むレスポンスがユーザへ送信される
12
アカウント停止処理が終了し、結果をレスポンスとしてユーザへ送信する。
Success!!
アカウントが無効となり、
ログイン画面に戻る。
Copyright©2013 JPCERT/CC All rights reserved.
機能実行時 詳細
13
アカウント停止機能を実行する際のSpacewalkの処理フロー
① ユーザがSpacewalkにログインする
② ユーザがアカウント停止機能を実行しリクエストが送信される
③ Spacewalkがリクエストを受信し、処理を実行する
④ 結果を含むレスポンスがユーザへ送信される
アカウント停止機能実行時の処理フローにおける、②の処理を詳しく
見てみよう。
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リクエスト
Copyright©2013 JPCERT/CC All rights reserved.
機能実行時 詳細
② ユーザがアカウント停止機能を実行しリクエストが送信される
14
アカウント停止画面のForm要素(HTML)と、機能実行時のHTTPリクエスト
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="DeactivateAccount" />
</div>
<input type="hidden" name="submitted" value="true" />
</form>
HTMLソース(抜粋)
POST /rhn/account/AccountDeactivationConfirm.do HTTP/1.1
:
Host: www.example.com
Content-Length: 14
Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98; pxt-session-
cookie=29x6ad3ed33446e2669c5e60a4b3080713a
submitted=true
Deactivate ボタンを押したときに送信されるHTTPリクエスト
「Deactivate Account」
のクリックで送信される
Form要素
送信されるデータにForm要素固有
の値は含まれておらず、毎回同じ
データとなっている。
Copyright©2013 JPCERT/CC All rights reserved.
問題点
 Spacewalkがユーザからのリクエストを処理す
る際に、正しい画面遷移でリクエストが送信さ
れてきたかを検証していなかった。
※ 参考
CWE(Common Weakness Enumeration)
「CWE-352 クロスサイトリクエストフォージェリ」
http://cwe.mitre.org/data/definitions/352.html
15
Copyright©2013 JPCERT/CC All rights reserved.
攻撃実行時の処理フロー
16
攻撃実行時は、②の前にユーザが攻撃者サイトへ誘導され、以下のようなフローとなる。
アカウント停止機能を実行する際の処理フロー
① ユーザがSpacewalkにログインする
② ユーザがアカウント停止機能を実行しリクエストが送信される
③ Spacewalkがリクエストを受信し、処理を実行する
④ 結果を含むレスポンスがユーザへ送信される
アカウント停止機能を実行する際のSpacewalkの処理フロー
① ユーザがSpacewalkにログインする
② -1 ユーザが何らかの方法で攻撃者のサイトに誘導され、攻撃コードを実
行するコンテンツにアクセスする
② -2 アカウント停止機能を実行するためのリクエストがユーザのブラウザ
からSpacewalkに対して送信される
③ Spacewalkがリクエストを受信し、処理を実行する
④ 結果を含むレスポンスがユーザへ送信される
通常の処理フロー
攻撃実行時の処理フロー
Copyright©2013 JPCERT/CC All rights reserved.
誘導先の攻撃者サイト上のコンテンツ(攻撃コード)
17
攻撃者は以下のようなコンテンツを用意し、Spacewalkにログイン中のユーザを
誘導する。
<html>
<body onload="document.atkform.submit()">
<form method="POST" name="atkform“
action="https://www.spacewalkserver.com/rhn/account/AccountDeactivationConfirm.do">
<input type="hidden" name="submitted" value="true" />
</form>
</body>
</html>
攻撃コードのHTTPリクエストを送信するためのコンテンツ(HTML)
アカウント停止機能を実行するForm要素
コンテンツにアクセスすると以下のForm
要素が自動送信される。
HTML
Copyright©2013 JPCERT/CC All rights reserved.
攻撃コードから送信されるリクエスト
18
■攻撃コードのポイント
• ユーザはSpacewalkにログイン中であるため、Cookieヘッダの値は
Spacewalkから発行されたCookieが自動的に送信される。(①部分)
• このリクエストを受信したSpacewalkは、ログイン中のユーザーからのリク
エストとして処理する。
• 通常の処理で送信されるリクエストと全く内容が一緒であり、Spacewalkに
はリクエストが正常なものか(サイト内の正常な遷移で送信されたものかどう
か)区別できない。
POST /rhn/account/AccountDeactivationConfirm.do HTTP/1.1
:
Host: www.victim.com
Content-Length: 14
Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98;
pxt-session-cookie=29x6ad3ed33446e2669c5e60a4b3080713a
submitted=true
コンテンツにアクセスすると送信されるHTTPリクエスト
①
Copyright©2013 JPCERT/CC All rights reserved.
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
HTTPリクエスト
機能の実行
アカウントの停止
通常の処理フロー
誘導
攻撃者のサイトへ誘導された際の処理フロー
アプリケーションにとっては
全く同じリクエストであり、
区別がつかない!!
HTML
実行!!
攻撃者のサイト
攻撃コード
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リクエスト
Copyright©2013 JPCERT/CC All rights reserved.
対策
 機能実行の際は、正しい画面遷移からの実行であること
を確認するべき。
 一般的なCSRF対策:
 トークンを生成し、セッションに格納する
 同時にリクエストのForm要素にもトークンを含める
 機能実行時にセッションとリクエストのトークンが一致する
ことを検証する
 攻撃者がその値を予測したり総当たりで探索したりする
可能性をふまえ、トークンの値は乱数を使って生成し、
十分な長さを持った値にする必要がある。
20
Copyright©2013 JPCERT/CC All rights reserved.
修正版コード
21
脆弱性はバージョン1.2.39-85にて修正が適用されている。
アカウント停止機能を実行する際のSpacewalkの処理フロー
① ユーザがSpacewalkにログインする。
② ユーザがアカウント停止画面にアクセス時に、Spacewalkは
トークンを発行しForm要素に埋め込む。さらにセッション変数にトーク
ンを格納する
② ユーザがアカウント停止機能を実行しリクエストが送信される。
② Spacewalkは送信されてきたトークンとセッション変数に格納
されているトークンが同一であることを確認する。`
③ Spacewalkがリクエストを受信し、処理を実行する。
④ 結果を含むレスポンスがユーザへ送信される。
「②前処理」と「②後処理」が追加されている。
前処理
後処理
Copyright©2013 JPCERT/CC All rights reserved.
修正版コード
② Form要素へのトークン発行とセッション変数への格納
22
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="DeactivateAccount" />
</div>
<input type="hidden" name="submitted" value="true" />
</form>
HTTPレスポンス
トークン
セッション
オブジェクト
トークン
トークン
② トークン
をセッション
変数に格納
③ さらにトークン
をHTTPレスポン
スのForm要素内の
hidden属性に格納
.jsp
アカウント停止画面
(disableselfconfirm.jsp) ① トークンを生成
ユーザがアカウント停止画面にアクセスした際に、トークンを生成しアクセス
したユーザのセッションに格納する。
ユーザ
サーバ
(Spacewalk)
Copyright©2013 JPCERT/CC All rights reserved.
修正前/修正後のソース比較
② Form要素へのトークン発行とセッション変数への格納
23
<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">
<html:submit>
<bean:message key="disableself.jsp.deactivate"/>
</html:submit>
</div>
</form>
disableselfconfirm.jsp (修正後)
カスタムタグ rhn:csrf が追加されている
Copyright©2013 JPCERT/CC All rights reserved.
修正版コード
② Form要素へのトークン発行とセッション変数への格納
24
disableselfconfirm.jsp <rhn:csrf />
カスタムタグによりCsrfTagクラスのdoStartTagメソッドが呼び出される
(JSPの機能)
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;
}
セッションを取得
トークンを生成し、
セッションに格納する
CsrfTag.java
Copyright©2013 JPCERT/CC All rights reserved.
修正版コード
② Form要素へのトークン発行とセッション変数への格納
25
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;
}
【参考】 CSRFTokenValidator クラスのgetTokenメソッド
トークンの生成セッションへの格納
Copyright©2013 JPCERT/CC All rights reserved.
修正版コード
② Form要素へのトークン発行とセッション変数への格納
26
disableselfconfirm.jsp <rhn:csrf />
CsrfTagクラスはHiddenTagクラスを継承しており、setPropertyメソッドや
setValueメソッドで指定された値はForm要素内のhidden属性で出力される。
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()で作成されたトークン>" />
CsrfTag.java
Copyright©2013 JPCERT/CC All rights reserved.
修正版コード
③ ユーザがアカウント停止機能を実行しリクエストが送信される
27
POST /rhn/account/AccountDeactivationConfirm.do HTTP/1.1
:
Host: www.example.com
Content-Length: 14
Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98
csrf_token = -5813750909365530134&submitted=true
送信されるHTTPリクエスト
Form要素内のhidden属性に出力されたトークンの値が送信される。
JSESSIONID=
81099D8047CF94FEA3FB447C3C24AF98
セッション
オブジェク
トcsrf_token
-58137…
アプリケーション側ではセッションに関
連付けされたトークンを保持している。ユーザ
Copyright©2013 JPCERT/CC All rights reserved.
修正版コード
④ アプリケーションによるトークンの検証
28
Spacewalkは送信されてきたリクエスト内のトークンとセッション内
のトークンが同じものであるかを検証する。
検証!!
JSESSIONID=
81099D8047CF94FEA3FB447C3C24AF98
セッション
オブジェクト
csrf_token
-58137…
POST /rhn/account/AccountDeactivationConfirm.do HTTP/1.1
:
Host: www.example.com
Content-Length: 14
Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98
csrf_token = -5813750909365530134&submitted=true
送信されるHTTPリクエスト
トークン
トークン
Copyright©2013 JPCERT/CC All rights reserved.29
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");
}
}
CSRFTokenValidator .java
セッション変数とリクエストに
トークンが含まれているかを検証
リクエスト受信時にCSRFTokenValidatorクラスのvalidateメソッドが呼び出さ
れ、トークンの検証を行う。(本クラスは修正版コードに追加されたもの)
修正版コード
④ アプリケーションによるトークンの検証
Copyright©2013 JPCERT/CC All rights reserved.30
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");
}
}
セッション変数とリクエストに含まれる
トークンが同一であるかを検証
修正版コード
④ アプリケーションによるトークンの検証
CSRFTokenValidator .java
リクエスト受信時にCSRFTokenValidatorクラスのvalidateメソッドが呼び出さ
れ、トークンの検証を行う。(本クラスは修正版コードに追加されたもの)
Copyright©2013 JPCERT/CC All rights reserved.
POST /rhn/account/AccountDeactivationConfirm.do
HTTP/1.1
:
Host: www.example.com
Content-Length: 14
Cookie:
JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98
csrf_token = -5813750909365530134&submitted=true
修正版コード
⑤ アプリケーションがリクエストを受信し、処理を実行する
31
トークンの検証結果に応じて、機能実行とエラー処理のどちらかを行う
POST /rhn/account/AccountDeactivationConfirm.do
HTTP/1.1
:
Host: www.example.com
Content-Length: 14
Cookie:
JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98
; pxt-session-
cookie=29x6ad3ed33446e2669c5e60a4b3080713a
submitted=true
機能の実行
アカウントの停止
通常の処理フロー
(トークンの検証OK)
ユーザのブラウザから
送信されるHTTPリクエスト
誘導
攻撃コード実行時の処理フロー
(トークンの検証NG)
HTML
実行!!
攻撃者のサイト
HTTPリクエスト
トークンが
含まれている
トークンが
含まれていない
トークン
セッション
オブジェクト
検証!!
検証!!
トークン
セッション
オブジェクト
Copyright©2013 JPCERT/CC All rights reserved.
まとめ
32
■クロスサイトリクエストフォージェリ
Spacewalk が用意したフォームからの入力と攻撃者が用意
したフォームからの入力を区別していなかった
■対策: トークンを使用することで、不正なフォー
ムからの入力を検出できるようにする
トークン使用時には以下の点を検討しておく必要がある
攻撃者に値を予測されることを防ぐ: 乱数を使って生成
総当たりで探索されることを防ぐ: 長い文字列長、大きな数値など
ユーザと関連付ける
トークンの有効期間を明確にする: 処理を受け付けたら無効にする, リクエス
トが来なかったら60秒で無効にする、など
Copyright©2013 JPCERT/CC All rights reserved.
参考文献
■ 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
Copyright©2013 JPCERT/CC All rights reserved.
著作権・引用や二次利用について
本資料の著作権は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

Weitere ähnliche Inhalte

Was ist angesagt?

デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」JPCERT Coordination Center
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)JPCERT Coordination Center
 
Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!Shinpei Ohtani
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)JPCERT Coordination Center
 
クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策JPCERT Coordination Center
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性JPCERT Coordination Center
 
[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見Yosuke HASEGAWA
 
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012Hiroshi Tokumaru
 
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL VulnerabilitiesLessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL VulnerabilitiesJPCERT Coordination Center
 
Spring fest2020 spring-security
Spring fest2020 spring-securitySpring fest2020 spring-security
Spring fest2020 spring-security土岐 孝平
 
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetupこれで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線MeetupMasatoshi Tada
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)JPCERT Coordination Center
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JPCERT Coordination Center
 
Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUse JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUehara Junji
 
Lt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdiLt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdiNorito Agetsuma
 
安全なWebアプリケーションの作り方2018
安全なWebアプリケーションの作り方2018安全なWebアプリケーションの作り方2018
安全なWebアプリケーションの作り方2018Hiroshi Tokumaru
 
Keycloak拡張入門
Keycloak拡張入門Keycloak拡張入門
Keycloak拡張入門Hiroyuki Wada
 
今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)
今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)
今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)Sen Ueno
 
phpMyAdminにおけるスクリプト実行可能な脆弱性3種盛り合わせ
phpMyAdminにおけるスクリプト実行可能な脆弱性3種盛り合わせphpMyAdminにおけるスクリプト実行可能な脆弱性3種盛り合わせ
phpMyAdminにおけるスクリプト実行可能な脆弱性3種盛り合わせHiroshi Tokumaru
 
安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014Hiroshi Tokumaru
 

Was ist angesagt? (20)

デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
 
Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
 
クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
 
[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見
 
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
 
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL VulnerabilitiesLessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
 
Spring fest2020 spring-security
Spring fest2020 spring-securitySpring fest2020 spring-security
Spring fest2020 spring-security
 
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetupこれで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
 
Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUse JWT access-token on Grails REST API
Use JWT access-token on Grails REST API
 
Lt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdiLt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdi
 
安全なWebアプリケーションの作り方2018
安全なWebアプリケーションの作り方2018安全なWebアプリケーションの作り方2018
安全なWebアプリケーションの作り方2018
 
Keycloak拡張入門
Keycloak拡張入門Keycloak拡張入門
Keycloak拡張入門
 
今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)
今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)
今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)
 
phpMyAdminにおけるスクリプト実行可能な脆弱性3種盛り合わせ
phpMyAdminにおけるスクリプト実行可能な脆弱性3種盛り合わせphpMyAdminにおけるスクリプト実行可能な脆弱性3種盛り合わせ
phpMyAdminにおけるスクリプト実行可能な脆弱性3種盛り合わせ
 
安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014
 

Andere mochten auch

Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性JPCERT Coordination Center
 
Advanced SQL Injection Attack & Defenses
Advanced SQL Injection Attack & DefensesAdvanced SQL Injection Attack & Defenses
Advanced SQL Injection Attack & DefensesTiago Mendo
 
Advanced sql injection
Advanced sql injectionAdvanced sql injection
Advanced sql injectionbadhanbd
 
OWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCONOWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCONJun Matsumoto
 
It all starts with the ' (SQL injection from attacker's point of view)
It all starts with the ' (SQL injection from attacker's point of view)It all starts with the ' (SQL injection from attacker's point of view)
It all starts with the ' (SQL injection from attacker's point of view)Miroslav Stampar
 
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...JPCERT Coordination Center
 
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)JPCERT Coordination Center
 
自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたこと自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたことSuzuki Masayuki
 
Devsumi2015_20E1 エンジニアが知っておきたいお金の話
Devsumi2015_20E1 エンジニアが知っておきたいお金の話Devsumi2015_20E1 エンジニアが知っておきたいお金の話
Devsumi2015_20E1 エンジニアが知っておきたいお金の話Akio Doi
 
とある診断員と色々厄介な脆弱性達
とある診断員と色々厄介な脆弱性達とある診断員と色々厄介な脆弱性達
とある診断員と色々厄介な脆弱性達zaki4649
 
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hackツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hackteapipin
 

Andere mochten auch (13)

Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性
 
Advanced SQL Injection Attack & Defenses
Advanced SQL Injection Attack & DefensesAdvanced SQL Injection Attack & Defenses
Advanced SQL Injection Attack & Defenses
 
Advanced sql injection
Advanced sql injectionAdvanced sql injection
Advanced sql injection
 
OWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCONOWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCON
 
It all starts with the ' (SQL injection from attacker's point of view)
It all starts with the ' (SQL injection from attacker's point of view)It all starts with the ' (SQL injection from attacker's point of view)
It all starts with the ' (SQL injection from attacker's point of view)
 
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
 
脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる
 
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
 
自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたこと自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたこと
 
Devsumi2015_20E1 エンジニアが知っておきたいお金の話
Devsumi2015_20E1 エンジニアが知っておきたいお金の話Devsumi2015_20E1 エンジニアが知っておきたいお金の話
Devsumi2015_20E1 エンジニアが知っておきたいお金の話
 
SQL injection: Not only AND 1=1
SQL injection: Not only AND 1=1SQL injection: Not only AND 1=1
SQL injection: Not only AND 1=1
 
とある診断員と色々厄介な脆弱性達
とある診断員と色々厄介な脆弱性達とある診断員と色々厄介な脆弱性達
とある診断員と色々厄介な脆弱性達
 
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hackツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack
 

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

Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/AndroidセキュアコーディングMasaki Kubo
 
CodeIgniterによるPhwittr
CodeIgniterによるPhwittrCodeIgniterによるPhwittr
CodeIgniterによるPhwittrkenjis
 
安全なPHPアプリケーションの作り方2016
安全なPHPアプリケーションの作り方2016安全なPHPアプリケーションの作り方2016
安全なPHPアプリケーションの作り方2016Hiroshi Tokumaru
 
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)JPCERT Coordination Center
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdkKazuki Nakajima
 
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternAtsushi Kambara
 
Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...Shotaro Suzuki
 
TerraformでECS+ECRする話
TerraformでECS+ECRする話TerraformでECS+ECRする話
TerraformでECS+ECRする話Satoshi Hirayama
 
jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発Akira Inoue
 
TestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストYoichiro Sakurai
 
勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発Kazuki Nakajima
 
Karateによる UI Test Automation 革命
Karateによる UI Test Automation 革命Karateによる UI Test Automation 革命
Karateによる UI Test Automation 革命Takanori Suzuki
 
Osc2017 tokyo spring_soss_sig
Osc2017 tokyo spring_soss_sigOsc2017 tokyo spring_soss_sig
Osc2017 tokyo spring_soss_sigKazuki Omo
 
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法hiroya
 
クロスプラットフォーム開発を可能にするMonaca
クロスプラットフォーム開発を可能にするMonacaクロスプラットフォーム開発を可能にするMonaca
クロスプラットフォーム開発を可能にするMonacaMonaca
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Yuji Takayama
 
マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版i_yudai
 
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】DeNA
 
次世代プラットフォームのセキュリティモデル考察(前編)
次世代プラットフォームのセキュリティモデル考察(前編)次世代プラットフォームのセキュリティモデル考察(前編)
次世代プラットフォームのセキュリティモデル考察(前編)Yosuke HASEGAWA
 

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

Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/Androidセキュアコーディング
 
CodeIgniterによるPhwittr
CodeIgniterによるPhwittrCodeIgniterによるPhwittr
CodeIgniterによるPhwittr
 
安全なPHPアプリケーションの作り方2016
安全なPHPアプリケーションの作り方2016安全なPHPアプリケーションの作り方2016
安全なPHPアプリケーションの作り方2016
 
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdk
 
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
 
Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...
 
TerraformでECS+ECRする話
TerraformでECS+ECRする話TerraformでECS+ECRする話
TerraformでECS+ECRする話
 
jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発
 
TestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテスト
 
勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発
 
Karateによる UI Test Automation 革命
Karateによる UI Test Automation 革命Karateによる UI Test Automation 革命
Karateによる UI Test Automation 革命
 
Osc2017 tokyo spring_soss_sig
Osc2017 tokyo spring_soss_sigOsc2017 tokyo spring_soss_sig
Osc2017 tokyo spring_soss_sig
 
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法
 
クロスプラットフォーム開発を可能にするMonaca
クロスプラットフォーム開発を可能にするMonacaクロスプラットフォーム開発を可能にするMonaca
クロスプラットフォーム開発を可能にするMonaca
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
 
マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版
 
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
 
次世代プラットフォームのセキュリティモデル考察(前編)
次世代プラットフォームのセキュリティモデル考察(前編)次世代プラットフォームのセキュリティモデル考察(前編)
次世代プラットフォームのセキュリティモデル考察(前編)
 

Mehr von JPCERT Coordination Center

いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~JPCERT Coordination Center
 
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』JPCERT Coordination Center
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルJPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習JPCERT Coordination Center
 

Mehr von JPCERT Coordination Center (9)

いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
 
DLL読み込みの問題を読み解く
DLL読み込みの問題を読み解くDLL読み込みの問題を読み解く
DLL読み込みの問題を読み解く
 
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデル
 
Android Secure Coding
Android Secure CodingAndroid Secure Coding
Android Secure Coding
 
Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説
 
Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説
 
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習
 

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

  • 1. Copyright©2013 JPCERT/CC All rights reserved. 「Javaアプリケーション脆弱性事例調査資料」について この資料は、Javaプログラマである皆様に、脆弱性を身 近な問題として感じてもらい、セキュアコーディングの 重要性を認識していただくことを目指して作成していま す。 「Javaセキュアコーディングスタンダード CERT/Oracle版」と合わせて、セキュアコーディングに 関する理解を深めるためにご利用ください。 JPCERTコーディネーションセンター セキュアコーディングプロジェクト secure-coding@jpcert.or.jp 1 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'
  • 3. Copyright©2013 JPCERT/CC All rights reserved. Spacewalkとは SpacewalkはWebベースのLinuxシステムの統合管理 ツール Red Hat社がリリースしている「Red Hat Network Satellite」のオープンソース版 3
  • 4. Copyright©2013 JPCERT/CC All rights reserved. Spacewalkとは 統合管理ツールとして以下が実施可能 —ハードウエア、ソフトウエアのインベントリ管理 —ソフトウェアのインストールやアップデート —設定ファイルの管理と展開 —システムのモニタリング 4
  • 5. Copyright©2013 JPCERT/CC All rights reserved. 脆弱性の概要 Spacewalkには、クロスサイトリクエスト フォージェリの脆弱性が存在する。 脆弱性を悪用されることで、被害者が意図しな い操作を実行させられる可能性がある。 Spacewalkではシステムの管理機能を提供して いるため、被害者が意図しない設定変更等が行 われてしまう。 5
  • 6. Copyright©2013 JPCERT/CC All rights reserved. クロスサイトリクエストフォージェリとは 攻撃者の罠サイトにアクセスさせ、ログインし ているWebサービスの機能を、意図せず実行さ せる攻撃。 6 解像度UP ① ログイン ② ユーザを攻撃者のwebサイトに誘導 ③ 攻撃者のwebサイトにアクセス ④ 攻撃コードを含むレスポンス ⑤ セッションID + 処理実行のリクエスト ⑥ 処理確定 のレスポンス 攻撃対象のWebアプリケーション
  • 7. Copyright©2013 JPCERT/CC All rights reserved. 脆弱性が悪用された場合のリスク ユーザの意図しない機能の実行 • Webサイトが提供している機能により、リスクは異なる • 例えば、掲示板に投稿する機能があった場合、攻撃者に よって意図しない投稿をさせられるかも • 商品を購入する機能があった場合、攻撃者によって意図 しない商品購入をさせられるかも 7 被害者 ・掲示板書き込み ・決済の実行 犯行予告!! xxxxxxxx 意図しない機能の実行
  • 8. Copyright©2013 JPCERT/CC All rights reserved. Spacewalk の処理フロー 8 アカウント停止機能を実行する際のSpacewalkの処理フロー ① ユーザがSpacewalkにログインする。 ② ユーザがアカウント停止機能を実行しリクエストが送信される。 ③ Spacewalkがリクエストを受信し、処理を実行する。 ④ 結果を含むレスポンスがユーザへ送信される。 アカウント停止機能を実行する場合の処理フローを解説する。 画面遷移にしたがってユーザが操作を行い、処理が行われる。
  • 9. Copyright©2013 JPCERT/CC All rights reserved. ① ユーザがSpacewalkにログインする 9 ユーザがログインし、セッションを取得する。(Cookieを発行する) ログイン セッション(Cookie) 発行 ログイン画面 セッションオブジェクト Cookie セッションに紐付 いたCookieを作 成/発行
  • 10. Copyright©2013 JPCERT/CC All rights reserved. ② ユーザがアカウント停止機能を実行しリクエストが送信される 10 管理画面にログインし、アカウント停止画面にアクセスする。 アカウント停止画面 このボタンをクリックすることで機能が実行され、 アカウントが停止(無効)となる。
  • 11. Copyright©2013 JPCERT/CC All rights reserved. ③Spacewalkがリクエストを受信し、処理を実行する 11 Spacewalkはリクエストを受信して、アカウント停止機能を実 行する。 POST /rhn/account/AccountDeactivationConfirm.doHTTP/1.1 : Host: www.example.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98; pxt-session-cookie=29x6ad3ed33446e2669c5e60a4b3080713a submitted=true HTTPリクエスト アカウントの停止
  • 12. Copyright©2013 JPCERT/CC All rights reserved. ④ 結果を含むレスポンスがユーザへ送信される 12 アカウント停止処理が終了し、結果をレスポンスとしてユーザへ送信する。 Success!! アカウントが無効となり、 ログイン画面に戻る。
  • 13. Copyright©2013 JPCERT/CC All rights reserved. 機能実行時 詳細 13 アカウント停止機能を実行する際のSpacewalkの処理フロー ① ユーザがSpacewalkにログインする ② ユーザがアカウント停止機能を実行しリクエストが送信される ③ Spacewalkがリクエストを受信し、処理を実行する ④ 結果を含むレスポンスがユーザへ送信される アカウント停止機能実行時の処理フローにおける、②の処理を詳しく 見てみよう。 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リクエスト
  • 14. Copyright©2013 JPCERT/CC All rights reserved. 機能実行時 詳細 ② ユーザがアカウント停止機能を実行しリクエストが送信される 14 アカウント停止画面のForm要素(HTML)と、機能実行時のHTTPリクエスト 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="DeactivateAccount" /> </div> <input type="hidden" name="submitted" value="true" /> </form> HTMLソース(抜粋) POST /rhn/account/AccountDeactivationConfirm.do HTTP/1.1 : Host: www.example.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98; pxt-session- cookie=29x6ad3ed33446e2669c5e60a4b3080713a submitted=true Deactivate ボタンを押したときに送信されるHTTPリクエスト 「Deactivate Account」 のクリックで送信される Form要素 送信されるデータにForm要素固有 の値は含まれておらず、毎回同じ データとなっている。
  • 15. Copyright©2013 JPCERT/CC All rights reserved. 問題点  Spacewalkがユーザからのリクエストを処理す る際に、正しい画面遷移でリクエストが送信さ れてきたかを検証していなかった。 ※ 参考 CWE(Common Weakness Enumeration) 「CWE-352 クロスサイトリクエストフォージェリ」 http://cwe.mitre.org/data/definitions/352.html 15
  • 16. Copyright©2013 JPCERT/CC All rights reserved. 攻撃実行時の処理フロー 16 攻撃実行時は、②の前にユーザが攻撃者サイトへ誘導され、以下のようなフローとなる。 アカウント停止機能を実行する際の処理フロー ① ユーザがSpacewalkにログインする ② ユーザがアカウント停止機能を実行しリクエストが送信される ③ Spacewalkがリクエストを受信し、処理を実行する ④ 結果を含むレスポンスがユーザへ送信される アカウント停止機能を実行する際のSpacewalkの処理フロー ① ユーザがSpacewalkにログインする ② -1 ユーザが何らかの方法で攻撃者のサイトに誘導され、攻撃コードを実 行するコンテンツにアクセスする ② -2 アカウント停止機能を実行するためのリクエストがユーザのブラウザ からSpacewalkに対して送信される ③ Spacewalkがリクエストを受信し、処理を実行する ④ 結果を含むレスポンスがユーザへ送信される 通常の処理フロー 攻撃実行時の処理フロー
  • 17. Copyright©2013 JPCERT/CC All rights reserved. 誘導先の攻撃者サイト上のコンテンツ(攻撃コード) 17 攻撃者は以下のようなコンテンツを用意し、Spacewalkにログイン中のユーザを 誘導する。 <html> <body onload="document.atkform.submit()"> <form method="POST" name="atkform“ action="https://www.spacewalkserver.com/rhn/account/AccountDeactivationConfirm.do"> <input type="hidden" name="submitted" value="true" /> </form> </body> </html> 攻撃コードのHTTPリクエストを送信するためのコンテンツ(HTML) アカウント停止機能を実行するForm要素 コンテンツにアクセスすると以下のForm 要素が自動送信される。 HTML
  • 18. Copyright©2013 JPCERT/CC All rights reserved. 攻撃コードから送信されるリクエスト 18 ■攻撃コードのポイント • ユーザはSpacewalkにログイン中であるため、Cookieヘッダの値は Spacewalkから発行されたCookieが自動的に送信される。(①部分) • このリクエストを受信したSpacewalkは、ログイン中のユーザーからのリク エストとして処理する。 • 通常の処理で送信されるリクエストと全く内容が一緒であり、Spacewalkに はリクエストが正常なものか(サイト内の正常な遷移で送信されたものかどう か)区別できない。 POST /rhn/account/AccountDeactivationConfirm.do HTTP/1.1 : Host: www.victim.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98; pxt-session-cookie=29x6ad3ed33446e2669c5e60a4b3080713a submitted=true コンテンツにアクセスすると送信されるHTTPリクエスト ①
  • 19. Copyright©2013 JPCERT/CC All rights reserved. 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 HTTPリクエスト 機能の実行 アカウントの停止 通常の処理フロー 誘導 攻撃者のサイトへ誘導された際の処理フロー アプリケーションにとっては 全く同じリクエストであり、 区別がつかない!! HTML 実行!! 攻撃者のサイト 攻撃コード 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リクエスト
  • 20. Copyright©2013 JPCERT/CC All rights reserved. 対策  機能実行の際は、正しい画面遷移からの実行であること を確認するべき。  一般的なCSRF対策:  トークンを生成し、セッションに格納する  同時にリクエストのForm要素にもトークンを含める  機能実行時にセッションとリクエストのトークンが一致する ことを検証する  攻撃者がその値を予測したり総当たりで探索したりする 可能性をふまえ、トークンの値は乱数を使って生成し、 十分な長さを持った値にする必要がある。 20
  • 21. Copyright©2013 JPCERT/CC All rights reserved. 修正版コード 21 脆弱性はバージョン1.2.39-85にて修正が適用されている。 アカウント停止機能を実行する際のSpacewalkの処理フロー ① ユーザがSpacewalkにログインする。 ② ユーザがアカウント停止画面にアクセス時に、Spacewalkは トークンを発行しForm要素に埋め込む。さらにセッション変数にトーク ンを格納する ② ユーザがアカウント停止機能を実行しリクエストが送信される。 ② Spacewalkは送信されてきたトークンとセッション変数に格納 されているトークンが同一であることを確認する。` ③ Spacewalkがリクエストを受信し、処理を実行する。 ④ 結果を含むレスポンスがユーザへ送信される。 「②前処理」と「②後処理」が追加されている。 前処理 後処理
  • 22. Copyright©2013 JPCERT/CC All rights reserved. 修正版コード ② Form要素へのトークン発行とセッション変数への格納 22 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="DeactivateAccount" /> </div> <input type="hidden" name="submitted" value="true" /> </form> HTTPレスポンス トークン セッション オブジェクト トークン トークン ② トークン をセッション 変数に格納 ③ さらにトークン をHTTPレスポン スのForm要素内の hidden属性に格納 .jsp アカウント停止画面 (disableselfconfirm.jsp) ① トークンを生成 ユーザがアカウント停止画面にアクセスした際に、トークンを生成しアクセス したユーザのセッションに格納する。 ユーザ サーバ (Spacewalk)
  • 23. Copyright©2013 JPCERT/CC All rights reserved. 修正前/修正後のソース比較 ② Form要素へのトークン発行とセッション変数への格納 23 <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"> <html:submit> <bean:message key="disableself.jsp.deactivate"/> </html:submit> </div> </form> disableselfconfirm.jsp (修正後) カスタムタグ rhn:csrf が追加されている
  • 24. Copyright©2013 JPCERT/CC All rights reserved. 修正版コード ② Form要素へのトークン発行とセッション変数への格納 24 disableselfconfirm.jsp <rhn:csrf /> カスタムタグによりCsrfTagクラスのdoStartTagメソッドが呼び出される (JSPの機能) 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; } セッションを取得 トークンを生成し、 セッションに格納する CsrfTag.java
  • 25. Copyright©2013 JPCERT/CC All rights reserved. 修正版コード ② Form要素へのトークン発行とセッション変数への格納 25 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; } 【参考】 CSRFTokenValidator クラスのgetTokenメソッド トークンの生成セッションへの格納
  • 26. Copyright©2013 JPCERT/CC All rights reserved. 修正版コード ② Form要素へのトークン発行とセッション変数への格納 26 disableselfconfirm.jsp <rhn:csrf /> CsrfTagクラスはHiddenTagクラスを継承しており、setPropertyメソッドや setValueメソッドで指定された値はForm要素内のhidden属性で出力される。 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()で作成されたトークン>" /> CsrfTag.java
  • 27. Copyright©2013 JPCERT/CC All rights reserved. 修正版コード ③ ユーザがアカウント停止機能を実行しリクエストが送信される 27 POST /rhn/account/AccountDeactivationConfirm.do HTTP/1.1 : Host: www.example.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98 csrf_token = -5813750909365530134&submitted=true 送信されるHTTPリクエスト Form要素内のhidden属性に出力されたトークンの値が送信される。 JSESSIONID= 81099D8047CF94FEA3FB447C3C24AF98 セッション オブジェク トcsrf_token -58137… アプリケーション側ではセッションに関 連付けされたトークンを保持している。ユーザ
  • 28. Copyright©2013 JPCERT/CC All rights reserved. 修正版コード ④ アプリケーションによるトークンの検証 28 Spacewalkは送信されてきたリクエスト内のトークンとセッション内 のトークンが同じものであるかを検証する。 検証!! JSESSIONID= 81099D8047CF94FEA3FB447C3C24AF98 セッション オブジェクト csrf_token -58137… POST /rhn/account/AccountDeactivationConfirm.do HTTP/1.1 : Host: www.example.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98 csrf_token = -5813750909365530134&submitted=true 送信されるHTTPリクエスト トークン トークン
  • 29. Copyright©2013 JPCERT/CC All rights reserved.29 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"); } } CSRFTokenValidator .java セッション変数とリクエストに トークンが含まれているかを検証 リクエスト受信時にCSRFTokenValidatorクラスのvalidateメソッドが呼び出さ れ、トークンの検証を行う。(本クラスは修正版コードに追加されたもの) 修正版コード ④ アプリケーションによるトークンの検証
  • 30. Copyright©2013 JPCERT/CC All rights reserved.30 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"); } } セッション変数とリクエストに含まれる トークンが同一であるかを検証 修正版コード ④ アプリケーションによるトークンの検証 CSRFTokenValidator .java リクエスト受信時にCSRFTokenValidatorクラスのvalidateメソッドが呼び出さ れ、トークンの検証を行う。(本クラスは修正版コードに追加されたもの)
  • 31. Copyright©2013 JPCERT/CC All rights reserved. POST /rhn/account/AccountDeactivationConfirm.do HTTP/1.1 : Host: www.example.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98 csrf_token = -5813750909365530134&submitted=true 修正版コード ⑤ アプリケーションがリクエストを受信し、処理を実行する 31 トークンの検証結果に応じて、機能実行とエラー処理のどちらかを行う POST /rhn/account/AccountDeactivationConfirm.do HTTP/1.1 : Host: www.example.com Content-Length: 14 Cookie: JSESSIONID=81099D8047CF94FEA3FB447C3C24AF98 ; pxt-session- cookie=29x6ad3ed33446e2669c5e60a4b3080713a submitted=true 機能の実行 アカウントの停止 通常の処理フロー (トークンの検証OK) ユーザのブラウザから 送信されるHTTPリクエスト 誘導 攻撃コード実行時の処理フロー (トークンの検証NG) HTML 実行!! 攻撃者のサイト HTTPリクエスト トークンが 含まれている トークンが 含まれていない トークン セッション オブジェクト 検証!! 検証!! トークン セッション オブジェクト
  • 32. Copyright©2013 JPCERT/CC All rights reserved. まとめ 32 ■クロスサイトリクエストフォージェリ Spacewalk が用意したフォームからの入力と攻撃者が用意 したフォームからの入力を区別していなかった ■対策: トークンを使用することで、不正なフォー ムからの入力を検出できるようにする トークン使用時には以下の点を検討しておく必要がある 攻撃者に値を予測されることを防ぐ: 乱数を使って生成 総当たりで探索されることを防ぐ: 長い文字列長、大きな数値など ユーザと関連付ける トークンの有効期間を明確にする: 処理を受け付けたら無効にする, リクエス トが来なかったら60秒で無効にする、など
  • 33. Copyright©2013 JPCERT/CC All rights reserved. 参考文献 ■ 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
  • 34. Copyright©2013 JPCERT/CC All rights reserved. 著作権・引用や二次利用について 本資料の著作権は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