SlideShare uma empresa Scribd logo
1 de 22
Baixar para ler offline
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:56 +09'00'
Apache Tomcat における
クロスサイトリクエストフォージェリ
(CSRF)保護メカニズム回避の脆弱性
CVE-2012-4431
JVNDB-2012-005750
2
Copyright©2013 JPCERT/CC All rights reserved.
Apache Tomcatとは
Java Servlet や JavaServer Pages (JSP) を実行するため
のサーブレットコンテナ(サーブレットエンジン)
CSRF対策のために、トークンを使ったリクエスト
フォームの検証機能が実装されている
3
Copyright©2013 JPCERT/CC All rights reserved.
脆弱性の概要
Apache Tomcatには、クロスサイトリクエストフォー
ジェリ対策をバイパスできる脆弱性が存在する
脆弱性を悪用されることで、被害者が意図しない操作を
実行させられる可能性がある
Apache Tomcat上で展開されるWebアプリケーションの
機能を不正に実行させることが可能となる
4
バイパス!!
被害者
攻撃成功!!
Copyright©2013 JPCERT/CC All rights reserved.
通常の処理フロー
5
サイト停止機能を実行する際のApache Tomcatの処理フロー
① Tomcat Managerにクライアント(サイト管理者)がBasic認証でログイン
する。
② 管理者画面にアクセス時に、アプリケーションはトークンを発行しForm
要素に埋め込む。さらにセッション変数にトークンを格納する
③ クライアントがサイト停止機能を実行しリクエストが送信される。
④ アプリケーションは送信されてきたトークンとセッション変数に格納さ
れているトークンが同一かを検証する
⑤ アプリケーションがリクエストを受信し、処理を実行する。
⑥ 結果を含むレスポンスがクライアント(サイト管理者)へ送信される。
Tomcat Webアプリケーションマネージャのサイト停止機能における処理フ
ローを解説する。
Copyright©2013 JPCERT/CC All rights reserved.
サイト停止機能実行時
6
アプリケーションはリクエストを受信後、CSRFトークンを検証を実施し、正規
のトークンが送信されてきたときのみに機能を実行する。
GET
/manager/html/stop?path=/&org.apache.catalina.filters.CSRF_NONCE=1A740989DB7347FB6FE1FF02EC6A2C59
HTTP/1.1
:
Host: www.example.com
Cookie: JSESSIONID=F11C4A2BDEE2759214A79D46F69B283E
Authorization: Basic Og==
HTTPリクエスト
サイトの停止
CSRFトークンは付与され、検証もされている。
トークン
セッション
オブジェク
ト
検証!!
トークン
Copyright©2013 JPCERT/CC All rights reserved.
doFilterメソッドによるトークンの検証
7
トークンの検証はCsrfPreventionFilterクラスの doFilter メソッドで
実行される。
public class CsrfPreventionFilter…
public void doFilter(…
CsrfPreventionFilter .java
HTTPリクエスト
トークンの検証処理
Copyright©2013 JPCERT/CC All rights reserved.
doFilterメソッドによるトークンの検証: セッションからトークンの取得
8
public class CsrfPreventionFilter extends FilterBase {
:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
throws IOException, ServletException {
:
HttpServletRequest req = (HttpServletRequest) request;
:
@SuppressWarnings("unchecked")
LruCache<String> nonceCache =
(LruCache<String>) req.getSession(true).getAttribute(
Constants.CSRF_NONCE_SESSION_ATTR_NAME);
if (!skipNonceCheck) {
String previousNonce =
req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM); ...(B)
if (nonceCache != null &&!nonceCache.contains(previousNonce)) { ...(C)
res.sendError(HttpServletResponse.SC_FORBIDDEN); //エラー処理
return;
}
}
リクエストのセッションからセッ
ション変数を取得し、変数
nonceCacheに格納する。
文字列 "org.apache.catalina.filters.CSRF_NONCE"
セッション
オブジェクト
nonceCache
トークントークン
CsrfPreventionFilter.java
Copyright©2013 JPCERT/CC All rights reserved.
doFilterメソッドによるトークンの検証: リクエストからトークンの取得
9
public class CsrfPreventionFilter extends FilterBase {
:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
throws IOException, ServletException {
:
HttpServletRequest req = (HttpServletRequest) request;
:
@SuppressWarnings("unchecked")
LruCache<String> nonceCache =
(LruCache<String>) req.getSession(true).getAttribute(
Constants.CSRF_NONCE_SESSION_ATTR_NAME);
if (!skipNonceCheck) {
String previousNonce =
req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM);
if (nonceCache != null &&!nonceCache.contains(previousNonce)) {
res.sendError(HttpServletResponse.SC_FORBIDDEN); //エラー処理
return;
}
}
CsrfPreventionFilter.java
リクエストのパラメータから変数を取得し、
変数previousNonceに格納する。
文字列 "org.apache.catalina.filters.CSRF_NONCE"
GET
/manager/html/stop?path=/&org.apache.catalina.filters.CSR
F_NONCE=1A740989DB7347FB6FE1FF02EC6A2C59 HTTP/1.1
:
Host: www.example.com
Cookie: JSESSIONID=F11C4A2BDEE2759214A79D46F69B283E
Authorization: Basic Og==
HTTPリクエスト
previousNonce
トークン
Copyright©2013 JPCERT/CC All rights reserved.
doFilterメソッドによるトークンの取得: トークンの比較
10
public class CsrfPreventionFilter extends FilterBase {
:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
throws IOException, ServletException {
:
HttpServletRequest req = (HttpServletRequest) request;
:
@SuppressWarnings("unchecked")
LruCache<String> nonceCache =
(LruCache<String>) req.getSession(true).getAttribute(
Constants.CSRF_NONCE_SESSION_ATTR_NAME);
if (!skipNonceCheck) {
String previousNonce =
req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM);
if (nonceCache != null &&!nonceCache.contains(previousNonce)) {
res.sendError(HttpServletResponse.SC_FORBIDDEN); //エラー処理
return;
}
://正常処理
}
トークンの検証処理を実行する。
下記の2つの条件が両方とも成り立つ場合は
エラーとして処理される。
① 変数nonceCacheの値に変数
previousNonceが含まれていない。
② 変数nonceCacheがnullでない。
previousNonc
e
トークン
nonceCache
トークン
条件①:nonceCacheにpreviousNonce
の値が含まれているか?
nonceCache
トークン
条件②:nonceCacheはnullでないか?
Is not null ?
条件①、②がともに成立しないときに正常処理となる。
CsrfPreventionFilter.java
Copyright©2013 JPCERT/CC All rights reserved.
攻撃コード (正常なリクエストとの比較)
11
■攻撃コードのポイント
リクエストに含まれるトークン (GETパラメータの
ord.apache.catalina.filters.CSRF_NONCE) とセッション(Cookieヘッダ)が削除さ
れている
GET
/manager/html/stop?path=/&org.apache.catalina.filters.CSRF_NONCE=1A74098
9DB7347FB6FE1FF02EC6A2C59 HTTP/1.1
Host: www.example.com
:
Cookie: JSESSIONID=F11C4A2BDEE2759214A79D46F69B283E
Authorization: Basic Og==
通常のリクエスト
トークン
セッション
GET /manager/html/stop?path=/ HTTP/1.1
Host: www.example.com
:
Authorization: Basic Og==
攻撃コード
ついていない
Copyright©2013 JPCERT/CC All rights reserved.
サイト停止機能を実行する際のApache Tomcatの処理フロー
① Tomcat Managerにクライアント(サイト管理者)がBasic認証でログイン
する。
② 管理者画面にアクセス時に、アプリケーションはトークンを発行しForm
要素に埋め込む。さらにセッション変数にトークンを格納する
③ クライアントがサイト停止機能を実行しリクエストが送信される。
④ アプリケーションは送信されてきたトークンとセッション変数に格納さ
れているトークンが同一かを検証する
⑤ アプリケーションがリクエストを受信し、処理を実行する。
⑥ 結果を含むレスポンスがクライアント(サイト管理者)へ送信される。
攻撃コード実行時の処理フロー
12
④の検証処理が不十分だった!!
Copyright©2013 JPCERT/CC All rights reserved.
④ 送信されてきたトークンとセッション変数のトークンの検証
13
public class CsrfPreventionFilter extends FilterBase {
:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
throws IOException, ServletException {
:
HttpServletRequest req = (HttpServletRequest) request;
:
@SuppressWarnings("unchecked")
LruCache<String> nonceCache =
(LruCache<String>) req.getSession(true).getAttribute(
Constants.CSRF_NONCE_SESSION_ATTR_NAME);
if (!skipNonceCheck) {
String previousNonce =
req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM); ...(B)
if (nonceCache != null &&!nonceCache.contains(previousNonce)) { ...(C)
res.sendError(HttpServletResponse.SC_FORBIDDEN); //エラー処理
return;
}
}
リクエストのセッションからセッ
ション変数を取得し、変数
nonceCacheに格納する。
文字列 "org.apache.catalina.filters.CSRF_NONCE"
トークン
セッション
オブジェクト nonceCache
トークン
nonceCache
null
CsrfPreventionFilter.java
攻撃コードではセッ
ションが削除されて
おり、セッションオ
ブジェクトが存在し
ないため、nullが格
納される。
Copyright©2013 JPCERT/CC All rights reserved.
④ 送信されてきたトークンとセッション変数のトークンの検証
14
public class CsrfPreventionFilter extends FilterBase {
:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
throws IOException, ServletException {
:
HttpServletRequest req = (HttpServletRequest) request;
:
@SuppressWarnings("unchecked")
LruCache<String> nonceCache =
(LruCache<String>) req.getSession(true).getAttribute(
Constants.CSRF_NONCE_SESSION_ATTR_NAME);
if (!skipNonceCheck) {
String previousNonce =
req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM);
if (nonceCache != null &&!nonceCache.contains(previousNonce)) { ...(C)
res.sendError(HttpServletResponse.SC_FORBIDDEN); //エラー処理
return;
}
}
リクエストのパラメータから変数を取
得し、変数previousNonceに格納する。
文字列 "org.apache.catalina.filters.CSRF_NONCE"
GET /manager/html/stop?path=/ HTTP/1.1
Host: www.example.com
:
Authorization: Basic Og==
HTTPリクエスト
previousNonce
null
CsrfPreventionFilter.java
攻撃コードにはトーク
ンが含まれていないの
でnullが格納される。
Copyright©2013 JPCERT/CC All rights reserved.
④ 送信されてきたトークンとセッション変数のトークンの検証
15
public class CsrfPreventionFilter extends FilterBase {
:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
throws IOException, ServletException {
:
HttpServletRequest req = (HttpServletRequest) request;
:
@SuppressWarnings("unchecked")
LruCache<String> nonceCache =
(LruCache<String>) req.getSession(true).getAttribute(
Constants.CSRF_NONCE_SESSION_ATTR_NAME);
if (!skipNonceCheck) {
String previousNonce =
req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM);
if (nonceCache != null &&!nonceCache.contains(previousNonce)) {
res.sendError(HttpServletResponse.SC_FORBIDDEN); //エラー処理
return;
}
://正常処理
}
トークンの検証処理を実行する。
下記の2つの条件が両方とも成り立つ場合は
エラーとして処理される。
① 変数nonceCacheの値に変数
previousNonceが含まれていない。
② 変数nonceCacheがnullでない。
CsrfPreventionFilter.java
Copyright©2013 JPCERT/CC All rights reserved.
④ 送信されてきたトークンとセッション変数のトークンの検証
16
public class CsrfPreventionFilter extends FilterBase {
:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
throws IOException, ServletException {
:
HttpServletRequest req = (HttpServletRequest) request;
:
@SuppressWarnings("unchecked")
LruCache<String> nonceCache =
(LruCache<String>) req.getSession(true).getAttribute(
Constants.CSRF_NONCE_SESSION_ATTR_NAME);
if (!skipNonceCheck) {
String previousNonce =
req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM);
if (nonceCache != null &&!nonceCache.contains(previousNonce)) {
res.sendError(HttpServletResponse.SC_FORBIDDEN); //エラー処理
return;
}
://正常処理
}
トークンの検証処理を実行する。
下記の2つの条件が両方とも成り立つ場合は
エラーとして処理される。
① 変数nonceCacheの値に変数
previousNonceが含まれていない。
② 変数nonceCacheがnullでない。
CsrfPreventionFilter.java
①は正常なトークンの検証処理のため問題ないが、問題は②
の条件。
「変数nonceCacheがnull」=「セッションがそのものが存在
しない」
であり、セッション自体を削除する(Cookieヘッダを削除す
る)ことで変数nonceCacheがnullとなり、このトークンの検
証処理をバイパスすることができる!!
Copyright©2013 JPCERT/CC All rights reserved.
セッションを削除したリクエストの処理
17
通常、セッションを削除(Cookieヘッダを削除)してしまうと、Webアプリケー
ションはユーザーを認識できなくなり、認証エラーが発生する。
セッション(Cookie)なしの
HTTPリクエスト
しかし、Apache TomcatのTomcat WebアプリケーションマネージャはBasic
認証を使用しており、認証にセッション(Cookieヘッダ)を使用していない。
CSRF対策であるトークン検証処理にてセッション(Cookieヘッダ)が無い場合を
想定していなかったため、認証エラーが発生せず機能が実行されてしまう!!
セッション(Cookie)なしの
HTTPリクエスト
※Basic認証ではAuthorizationヘッダを使用する
通常の
Webサイト
一般のWebアプリ
Copyright©2013 JPCERT/CC All rights reserved.18
今回のアプリケーションにおける具体的な問題点
セッションが存在しないケース(Cookie以外によるセッ
ション管理)を想定していなかった。
セッションが存在しない場合は、CSRF対策をパスしてし
まっていた。
問題点に対してどうすべきだったか。
アプリケーションの仕様(今回の場合はセッションの管理
方式)を確認し、適切なCSRF対策を選択する必要があっ
た。
Copyright©2013 JPCERT/CC All rights reserved.
サイト停止機能を実行する際のApache Tomcatの処理フロー
① Tomcat Managerにクライアント(サイト管理者)がBasic認証でログイ
ンする。
② 管理者画面にアクセス時に、アプリケーションはトークンを発行しForm
要素に埋め込む。さらにセッション変数にトークンを格納する
③ クライアントがサイト停止機能を実行しリクエストが送信される。
④ アプリケーションは送信されてきたトークンとセッション変数に格納さ
れているトークンが同一かを検証する
⑤ アプリケーションがリクエストを受信し、処理を実行する。
⑥ 結果を含むレスポンスがクライアント(サイト管理者)へ送信される。
修正版コード
19
④の処理におけるコードが修正されている
脆弱性はバージョン7.0.32、6.0.36にて修正が適用されている
Copyright©2013 JPCERT/CC All rights reserved.
修正版コード
20
public class CsrfPreventionFilter extends FilterBase {
:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
throws IOException, ServletException {:
HttpServletRequest req = (HttpServletRequest) request;:
HttpSession session = req.getSession(false);
@SuppressWarnings("unchecked")
LruCache<String> nonceCache = (session == null) ? null
: (LruCache<String>) session.getAttribute(
Constants.CSRF_NONCE_SESSION_ATTR_NAME);
if (!skipNonceCheck) {
String previousNonce =
req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM);
if (nonceCache == null || previousNonce == null ||
!nonceCache.contains(previousNonce)) {
res.sendError(denyStatus);
return;
}
}
://正常処理
}
セッションがnullである
場合、またはリクエス
トにトークンが含まれ
ていない場合はエラー
として処理する
CsrfPreventionFilter.java
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
21
Copyright©2013 JPCERT/CC All rights reserved.
著作権・引用や二次利用について
本資料の著作権はJPCERT/CCに帰属します。
本資料あるいはその一部を引用・転載・再配布する際は、引用元名、資料名および URL の明示を
お願いします。
記載例
引用元:一般社団法人JPCERTコーディネーションセンター
Java アプリケーション脆弱性事例解説資料
Apache Tomcat における CSRF 保護メカニズム回避の脆弱性
https://www.jpcert.or.jp/securecoding/2012/No.09_Apache_Tomcat.pdf
本資料を引用・転載・再配布をする際は、引用先文書、時期、内容等の情報を、JPCERT コーディ
ネーションセンター広報(office@jpcert.or.jp)までメールにてお知らせください。なお、この連絡
により取得した個人情報は、別途定めるJPCERT コーディネーションセンターの「プライバシーポ
リシー」に則って取り扱います。
本資料の利用方法等に関するお問い合わせ
JPCERTコーディネーションセンター
広報担当
E-mail:office@jpcert.or.jp
本資料の技術的な内容に関するお問い合わせ
JPCERTコーディネーションセンター
セキュアコーディング担当
E-mail:secure-coding@jpcert.or.jp
22

Mais conteúdo relacionado

Mais procurados

今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ増田 亨
 
Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)
Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)
Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)NTT DATA Technology & Innovation
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き土岐 孝平
 
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...Google Cloud Platform - Japan
 
deep dive distributed tracing
deep dive distributed tracingdeep dive distributed tracing
deep dive distributed tracingTakayoshi Tanaka
 
Amazon EKS上の開発体験を最大化するプレビュー環境の作り方
Amazon EKS上の開発体験を最大化するプレビュー環境の作り方Amazon EKS上の開発体験を最大化するプレビュー環境の作り方
Amazon EKS上の開発体験を最大化するプレビュー環境の作り方理弘 山崎
 
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みTakeshi Ogawa
 
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~貴志 上坂
 
マルチクラウド時代に求められる ID & シングル・サインオン(SSO)基盤とは?
マルチクラウド時代に求められる ID & シングル・サインオン(SSO)基盤とは?マルチクラウド時代に求められる ID & シングル・サインオン(SSO)基盤とは?
マルチクラウド時代に求められる ID & シングル・サインオン(SSO)基盤とは?IIJ
 
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)NTT DATA Technology & Innovation
 
継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#m ishizaki
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with KarateTakanori Suzuki
 
アジャイル開発の中の設計
アジャイル開発の中の設計アジャイル開発の中の設計
アジャイル開発の中の設計Takuya Okamoto
 
AWSで実現するクラウドネイティブなアプリ開発のポイント
AWSで実現するクラウドネイティブなアプリ開発のポイントAWSで実現するクラウドネイティブなアプリ開発のポイント
AWSで実現するクラウドネイティブなアプリ開発のポイントKeisuke Nishitani
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)NTT DATA Technology & Innovation
 

Mais procurados (20)

今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)
Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)
Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
 
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
 
deep dive distributed tracing
deep dive distributed tracingdeep dive distributed tracing
deep dive distributed tracing
 
Amazon EKS上の開発体験を最大化するプレビュー環境の作り方
Amazon EKS上の開発体験を最大化するプレビュー環境の作り方Amazon EKS上の開発体験を最大化するプレビュー環境の作り方
Amazon EKS上の開発体験を最大化するプレビュー環境の作り方
 
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
 
Oracle Database (CDB) on Docker を動かしてみる
Oracle Database (CDB) on Docker を動かしてみるOracle Database (CDB) on Docker を動かしてみる
Oracle Database (CDB) on Docker を動かしてみる
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
 
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
 
マルチクラウド時代に求められる ID & シングル・サインオン(SSO)基盤とは?
マルチクラウド時代に求められる ID & シングル・サインオン(SSO)基盤とは?マルチクラウド時代に求められる ID & シングル・サインオン(SSO)基盤とは?
マルチクラウド時代に求められる ID & シングル・サインオン(SSO)基盤とは?
 
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
 
継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate
 
アジャイル開発の中の設計
アジャイル開発の中の設計アジャイル開発の中の設計
アジャイル開発の中の設計
 
AWSで実現するクラウドネイティブなアプリ開発のポイント
AWSで実現するクラウドネイティブなアプリ開発のポイントAWSで実現するクラウドネイティブなアプリ開発のポイント
AWSで実現するクラウドネイティブなアプリ開発のポイント
 
Verrazzanoご紹介
Verrazzanoご紹介Verrazzanoご紹介
Verrazzanoご紹介
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
 

Destaque

脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)JPCERT Coordination Center
 
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性JPCERT Coordination Center
 
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性JPCERT Coordination Center
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性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
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)JPCERT Coordination Center
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JPCERT Coordination Center
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JPCERT Coordination Center
 
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
 
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)JPCERT Coordination Center
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)JPCERT Coordination Center
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性JPCERT Coordination Center
 
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」JPCERT Coordination Center
 
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
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)JPCERT Coordination Center
 

Destaque (20)

脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
 
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
 
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性
 
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
 
Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
 
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
 
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
 
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
 
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...
 
脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
 

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

Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性JPCERT Coordination Center
 
tech talk about JS #0
tech talk about JS #0tech talk about JS #0
tech talk about JS #0Hika Maeng
 
ななめ45°から見たJavaOne
ななめ45°から見たJavaOneななめ45°から見たJavaOne
ななめ45°から見たJavaOneAdvancedTechNight
 
Laravelとテストについて
LaravelとテストについてLaravelとテストについて
LaravelとテストについてTakeo Noda
 
東京Node学園#8 Let It Crash!?
東京Node学園#8 Let It Crash!?東京Node学園#8 Let It Crash!?
東京Node学園#8 Let It Crash!?koichik
 
MEANスタック提案プレゼンテーション
MEANスタック提案プレゼンテーションMEANスタック提案プレゼンテーション
MEANスタック提案プレゼンテーションTakumi Yokoyama
 
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]David Buck
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/AndroidセキュアコーディングMasaki Kubo
 
Awsで実現するseleniumテスト高速術
Awsで実現するseleniumテスト高速術Awsで実現するseleniumテスト高速術
Awsで実現するseleniumテスト高速術finoue
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Tokuhiro Matsuno
 
Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4
Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4
Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4Yusuke Yamamoto
 
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTHeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTYuji Kubota
 
Network Programmability and the statefulness/transactionality
Network Programmability and the statefulness/transactionalityNetwork Programmability and the statefulness/transactionality
Network Programmability and the statefulness/transactionalityMiya Kohno
 
Mk state in-programming-01
Mk state in-programming-01Mk state in-programming-01
Mk state in-programming-01Miya Kohno
 
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発Yoshitaka Kawashima
 
[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure
[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure
[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azurede:code 2017
 
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかJavaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかYoshitaka Kawashima
 
jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハック
jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハックjQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハック
jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハックJun-ichi Sakamoto
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性JPCERT Coordination Center
 

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

Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性
 
Cve 2013-0422
Cve 2013-0422Cve 2013-0422
Cve 2013-0422
 
tech talk about JS #0
tech talk about JS #0tech talk about JS #0
tech talk about JS #0
 
ななめ45°から見たJavaOne
ななめ45°から見たJavaOneななめ45°から見たJavaOne
ななめ45°から見たJavaOne
 
Laravelとテストについて
LaravelとテストについてLaravelとテストについて
Laravelとテストについて
 
東京Node学園#8 Let It Crash!?
東京Node学園#8 Let It Crash!?東京Node学園#8 Let It Crash!?
東京Node学園#8 Let It Crash!?
 
MEANスタック提案プレゼンテーション
MEANスタック提案プレゼンテーションMEANスタック提案プレゼンテーション
MEANスタック提案プレゼンテーション
 
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/Androidセキュアコーディング
 
Awsで実現するseleniumテスト高速術
Awsで実現するseleniumテスト高速術Awsで実現するseleniumテスト高速術
Awsで実現するseleniumテスト高速術
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4
Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4
Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4
 
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTHeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LT
 
Network Programmability and the statefulness/transactionality
Network Programmability and the statefulness/transactionalityNetwork Programmability and the statefulness/transactionality
Network Programmability and the statefulness/transactionality
 
Mk state in-programming-01
Mk state in-programming-01Mk state in-programming-01
Mk state in-programming-01
 
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
 
[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure
[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure
[AC06] クラウド・ネイティブなスケーラブル・アプリ開発のために~12 Factor App on Kubernetes on Azure
 
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかJavaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
 
jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハック
jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハックjQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハック
jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハック
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
 

Mais de JPCERT Coordination Center

いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~JPCERT Coordination Center
 
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)JPCERT Coordination Center
 
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』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
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデル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
 

Mais de JPCERT Coordination Center (11)

いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
 
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
 
DLL読み込みの問題を読み解く
DLL読み込みの問題を読み解くDLL読み込みの問題を読み解く
DLL読み込みの問題を読み解く
 
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
 
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデル
 
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回演習
 

Apache Tomcat における クロスサイトリクエストフォージェリ (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:56 +09'00'
  • 3. Copyright©2013 JPCERT/CC All rights reserved. Apache Tomcatとは Java Servlet や JavaServer Pages (JSP) を実行するため のサーブレットコンテナ(サーブレットエンジン) CSRF対策のために、トークンを使ったリクエスト フォームの検証機能が実装されている 3
  • 4. Copyright©2013 JPCERT/CC All rights reserved. 脆弱性の概要 Apache Tomcatには、クロスサイトリクエストフォー ジェリ対策をバイパスできる脆弱性が存在する 脆弱性を悪用されることで、被害者が意図しない操作を 実行させられる可能性がある Apache Tomcat上で展開されるWebアプリケーションの 機能を不正に実行させることが可能となる 4 バイパス!! 被害者 攻撃成功!!
  • 5. Copyright©2013 JPCERT/CC All rights reserved. 通常の処理フロー 5 サイト停止機能を実行する際のApache Tomcatの処理フロー ① Tomcat Managerにクライアント(サイト管理者)がBasic認証でログイン する。 ② 管理者画面にアクセス時に、アプリケーションはトークンを発行しForm 要素に埋め込む。さらにセッション変数にトークンを格納する ③ クライアントがサイト停止機能を実行しリクエストが送信される。 ④ アプリケーションは送信されてきたトークンとセッション変数に格納さ れているトークンが同一かを検証する ⑤ アプリケーションがリクエストを受信し、処理を実行する。 ⑥ 結果を含むレスポンスがクライアント(サイト管理者)へ送信される。 Tomcat Webアプリケーションマネージャのサイト停止機能における処理フ ローを解説する。
  • 6. Copyright©2013 JPCERT/CC All rights reserved. サイト停止機能実行時 6 アプリケーションはリクエストを受信後、CSRFトークンを検証を実施し、正規 のトークンが送信されてきたときのみに機能を実行する。 GET /manager/html/stop?path=/&org.apache.catalina.filters.CSRF_NONCE=1A740989DB7347FB6FE1FF02EC6A2C59 HTTP/1.1 : Host: www.example.com Cookie: JSESSIONID=F11C4A2BDEE2759214A79D46F69B283E Authorization: Basic Og== HTTPリクエスト サイトの停止 CSRFトークンは付与され、検証もされている。 トークン セッション オブジェク ト 検証!! トークン
  • 7. Copyright©2013 JPCERT/CC All rights reserved. doFilterメソッドによるトークンの検証 7 トークンの検証はCsrfPreventionFilterクラスの doFilter メソッドで 実行される。 public class CsrfPreventionFilter… public void doFilter(… CsrfPreventionFilter .java HTTPリクエスト トークンの検証処理
  • 8. Copyright©2013 JPCERT/CC All rights reserved. doFilterメソッドによるトークンの検証: セッションからトークンの取得 8 public class CsrfPreventionFilter extends FilterBase { : public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { : HttpServletRequest req = (HttpServletRequest) request; : @SuppressWarnings("unchecked") LruCache<String> nonceCache = (LruCache<String>) req.getSession(true).getAttribute( Constants.CSRF_NONCE_SESSION_ATTR_NAME); if (!skipNonceCheck) { String previousNonce = req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM); ...(B) if (nonceCache != null &&!nonceCache.contains(previousNonce)) { ...(C) res.sendError(HttpServletResponse.SC_FORBIDDEN); //エラー処理 return; } } リクエストのセッションからセッ ション変数を取得し、変数 nonceCacheに格納する。 文字列 "org.apache.catalina.filters.CSRF_NONCE" セッション オブジェクト nonceCache トークントークン CsrfPreventionFilter.java
  • 9. Copyright©2013 JPCERT/CC All rights reserved. doFilterメソッドによるトークンの検証: リクエストからトークンの取得 9 public class CsrfPreventionFilter extends FilterBase { : public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { : HttpServletRequest req = (HttpServletRequest) request; : @SuppressWarnings("unchecked") LruCache<String> nonceCache = (LruCache<String>) req.getSession(true).getAttribute( Constants.CSRF_NONCE_SESSION_ATTR_NAME); if (!skipNonceCheck) { String previousNonce = req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM); if (nonceCache != null &&!nonceCache.contains(previousNonce)) { res.sendError(HttpServletResponse.SC_FORBIDDEN); //エラー処理 return; } } CsrfPreventionFilter.java リクエストのパラメータから変数を取得し、 変数previousNonceに格納する。 文字列 "org.apache.catalina.filters.CSRF_NONCE" GET /manager/html/stop?path=/&org.apache.catalina.filters.CSR F_NONCE=1A740989DB7347FB6FE1FF02EC6A2C59 HTTP/1.1 : Host: www.example.com Cookie: JSESSIONID=F11C4A2BDEE2759214A79D46F69B283E Authorization: Basic Og== HTTPリクエスト previousNonce トークン
  • 10. Copyright©2013 JPCERT/CC All rights reserved. doFilterメソッドによるトークンの取得: トークンの比較 10 public class CsrfPreventionFilter extends FilterBase { : public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { : HttpServletRequest req = (HttpServletRequest) request; : @SuppressWarnings("unchecked") LruCache<String> nonceCache = (LruCache<String>) req.getSession(true).getAttribute( Constants.CSRF_NONCE_SESSION_ATTR_NAME); if (!skipNonceCheck) { String previousNonce = req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM); if (nonceCache != null &&!nonceCache.contains(previousNonce)) { res.sendError(HttpServletResponse.SC_FORBIDDEN); //エラー処理 return; } ://正常処理 } トークンの検証処理を実行する。 下記の2つの条件が両方とも成り立つ場合は エラーとして処理される。 ① 変数nonceCacheの値に変数 previousNonceが含まれていない。 ② 変数nonceCacheがnullでない。 previousNonc e トークン nonceCache トークン 条件①:nonceCacheにpreviousNonce の値が含まれているか? nonceCache トークン 条件②:nonceCacheはnullでないか? Is not null ? 条件①、②がともに成立しないときに正常処理となる。 CsrfPreventionFilter.java
  • 11. Copyright©2013 JPCERT/CC All rights reserved. 攻撃コード (正常なリクエストとの比較) 11 ■攻撃コードのポイント リクエストに含まれるトークン (GETパラメータの ord.apache.catalina.filters.CSRF_NONCE) とセッション(Cookieヘッダ)が削除さ れている GET /manager/html/stop?path=/&org.apache.catalina.filters.CSRF_NONCE=1A74098 9DB7347FB6FE1FF02EC6A2C59 HTTP/1.1 Host: www.example.com : Cookie: JSESSIONID=F11C4A2BDEE2759214A79D46F69B283E Authorization: Basic Og== 通常のリクエスト トークン セッション GET /manager/html/stop?path=/ HTTP/1.1 Host: www.example.com : Authorization: Basic Og== 攻撃コード ついていない
  • 12. Copyright©2013 JPCERT/CC All rights reserved. サイト停止機能を実行する際のApache Tomcatの処理フロー ① Tomcat Managerにクライアント(サイト管理者)がBasic認証でログイン する。 ② 管理者画面にアクセス時に、アプリケーションはトークンを発行しForm 要素に埋め込む。さらにセッション変数にトークンを格納する ③ クライアントがサイト停止機能を実行しリクエストが送信される。 ④ アプリケーションは送信されてきたトークンとセッション変数に格納さ れているトークンが同一かを検証する ⑤ アプリケーションがリクエストを受信し、処理を実行する。 ⑥ 結果を含むレスポンスがクライアント(サイト管理者)へ送信される。 攻撃コード実行時の処理フロー 12 ④の検証処理が不十分だった!!
  • 13. Copyright©2013 JPCERT/CC All rights reserved. ④ 送信されてきたトークンとセッション変数のトークンの検証 13 public class CsrfPreventionFilter extends FilterBase { : public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { : HttpServletRequest req = (HttpServletRequest) request; : @SuppressWarnings("unchecked") LruCache<String> nonceCache = (LruCache<String>) req.getSession(true).getAttribute( Constants.CSRF_NONCE_SESSION_ATTR_NAME); if (!skipNonceCheck) { String previousNonce = req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM); ...(B) if (nonceCache != null &&!nonceCache.contains(previousNonce)) { ...(C) res.sendError(HttpServletResponse.SC_FORBIDDEN); //エラー処理 return; } } リクエストのセッションからセッ ション変数を取得し、変数 nonceCacheに格納する。 文字列 "org.apache.catalina.filters.CSRF_NONCE" トークン セッション オブジェクト nonceCache トークン nonceCache null CsrfPreventionFilter.java 攻撃コードではセッ ションが削除されて おり、セッションオ ブジェクトが存在し ないため、nullが格 納される。
  • 14. Copyright©2013 JPCERT/CC All rights reserved. ④ 送信されてきたトークンとセッション変数のトークンの検証 14 public class CsrfPreventionFilter extends FilterBase { : public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { : HttpServletRequest req = (HttpServletRequest) request; : @SuppressWarnings("unchecked") LruCache<String> nonceCache = (LruCache<String>) req.getSession(true).getAttribute( Constants.CSRF_NONCE_SESSION_ATTR_NAME); if (!skipNonceCheck) { String previousNonce = req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM); if (nonceCache != null &&!nonceCache.contains(previousNonce)) { ...(C) res.sendError(HttpServletResponse.SC_FORBIDDEN); //エラー処理 return; } } リクエストのパラメータから変数を取 得し、変数previousNonceに格納する。 文字列 "org.apache.catalina.filters.CSRF_NONCE" GET /manager/html/stop?path=/ HTTP/1.1 Host: www.example.com : Authorization: Basic Og== HTTPリクエスト previousNonce null CsrfPreventionFilter.java 攻撃コードにはトーク ンが含まれていないの でnullが格納される。
  • 15. Copyright©2013 JPCERT/CC All rights reserved. ④ 送信されてきたトークンとセッション変数のトークンの検証 15 public class CsrfPreventionFilter extends FilterBase { : public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { : HttpServletRequest req = (HttpServletRequest) request; : @SuppressWarnings("unchecked") LruCache<String> nonceCache = (LruCache<String>) req.getSession(true).getAttribute( Constants.CSRF_NONCE_SESSION_ATTR_NAME); if (!skipNonceCheck) { String previousNonce = req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM); if (nonceCache != null &&!nonceCache.contains(previousNonce)) { res.sendError(HttpServletResponse.SC_FORBIDDEN); //エラー処理 return; } ://正常処理 } トークンの検証処理を実行する。 下記の2つの条件が両方とも成り立つ場合は エラーとして処理される。 ① 変数nonceCacheの値に変数 previousNonceが含まれていない。 ② 変数nonceCacheがnullでない。 CsrfPreventionFilter.java
  • 16. Copyright©2013 JPCERT/CC All rights reserved. ④ 送信されてきたトークンとセッション変数のトークンの検証 16 public class CsrfPreventionFilter extends FilterBase { : public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { : HttpServletRequest req = (HttpServletRequest) request; : @SuppressWarnings("unchecked") LruCache<String> nonceCache = (LruCache<String>) req.getSession(true).getAttribute( Constants.CSRF_NONCE_SESSION_ATTR_NAME); if (!skipNonceCheck) { String previousNonce = req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM); if (nonceCache != null &&!nonceCache.contains(previousNonce)) { res.sendError(HttpServletResponse.SC_FORBIDDEN); //エラー処理 return; } ://正常処理 } トークンの検証処理を実行する。 下記の2つの条件が両方とも成り立つ場合は エラーとして処理される。 ① 変数nonceCacheの値に変数 previousNonceが含まれていない。 ② 変数nonceCacheがnullでない。 CsrfPreventionFilter.java ①は正常なトークンの検証処理のため問題ないが、問題は② の条件。 「変数nonceCacheがnull」=「セッションがそのものが存在 しない」 であり、セッション自体を削除する(Cookieヘッダを削除す る)ことで変数nonceCacheがnullとなり、このトークンの検 証処理をバイパスすることができる!!
  • 17. Copyright©2013 JPCERT/CC All rights reserved. セッションを削除したリクエストの処理 17 通常、セッションを削除(Cookieヘッダを削除)してしまうと、Webアプリケー ションはユーザーを認識できなくなり、認証エラーが発生する。 セッション(Cookie)なしの HTTPリクエスト しかし、Apache TomcatのTomcat WebアプリケーションマネージャはBasic 認証を使用しており、認証にセッション(Cookieヘッダ)を使用していない。 CSRF対策であるトークン検証処理にてセッション(Cookieヘッダ)が無い場合を 想定していなかったため、認証エラーが発生せず機能が実行されてしまう!! セッション(Cookie)なしの HTTPリクエスト ※Basic認証ではAuthorizationヘッダを使用する 通常の Webサイト 一般のWebアプリ
  • 18. Copyright©2013 JPCERT/CC All rights reserved.18 今回のアプリケーションにおける具体的な問題点 セッションが存在しないケース(Cookie以外によるセッ ション管理)を想定していなかった。 セッションが存在しない場合は、CSRF対策をパスしてし まっていた。 問題点に対してどうすべきだったか。 アプリケーションの仕様(今回の場合はセッションの管理 方式)を確認し、適切なCSRF対策を選択する必要があっ た。
  • 19. Copyright©2013 JPCERT/CC All rights reserved. サイト停止機能を実行する際のApache Tomcatの処理フロー ① Tomcat Managerにクライアント(サイト管理者)がBasic認証でログイ ンする。 ② 管理者画面にアクセス時に、アプリケーションはトークンを発行しForm 要素に埋め込む。さらにセッション変数にトークンを格納する ③ クライアントがサイト停止機能を実行しリクエストが送信される。 ④ アプリケーションは送信されてきたトークンとセッション変数に格納さ れているトークンが同一かを検証する ⑤ アプリケーションがリクエストを受信し、処理を実行する。 ⑥ 結果を含むレスポンスがクライアント(サイト管理者)へ送信される。 修正版コード 19 ④の処理におけるコードが修正されている 脆弱性はバージョン7.0.32、6.0.36にて修正が適用されている
  • 20. Copyright©2013 JPCERT/CC All rights reserved. 修正版コード 20 public class CsrfPreventionFilter extends FilterBase { : public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {: HttpServletRequest req = (HttpServletRequest) request;: HttpSession session = req.getSession(false); @SuppressWarnings("unchecked") LruCache<String> nonceCache = (session == null) ? null : (LruCache<String>) session.getAttribute( Constants.CSRF_NONCE_SESSION_ATTR_NAME); if (!skipNonceCheck) { String previousNonce = req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM); if (nonceCache == null || previousNonce == null || !nonceCache.contains(previousNonce)) { res.sendError(denyStatus); return; } } ://正常処理 } セッションがnullである 場合、またはリクエス トにトークンが含まれ ていない場合はエラー として処理する CsrfPreventionFilter.java
  • 21. 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 21
  • 22. Copyright©2013 JPCERT/CC All rights reserved. 著作権・引用や二次利用について 本資料の著作権はJPCERT/CCに帰属します。 本資料あるいはその一部を引用・転載・再配布する際は、引用元名、資料名および URL の明示を お願いします。 記載例 引用元:一般社団法人JPCERTコーディネーションセンター Java アプリケーション脆弱性事例解説資料 Apache Tomcat における CSRF 保護メカニズム回避の脆弱性 https://www.jpcert.or.jp/securecoding/2012/No.09_Apache_Tomcat.pdf 本資料を引用・転載・再配布をする際は、引用先文書、時期、内容等の情報を、JPCERT コーディ ネーションセンター広報(office@jpcert.or.jp)までメールにてお知らせください。なお、この連絡 により取得した個人情報は、別途定めるJPCERT コーディネーションセンターの「プライバシーポ リシー」に則って取り扱います。 本資料の利用方法等に関するお問い合わせ JPCERTコーディネーションセンター 広報担当 E-mail:office@jpcert.or.jp 本資料の技術的な内容に関するお問い合わせ JPCERTコーディネーションセンター セキュアコーディング担当 E-mail:secure-coding@jpcert.or.jp 22