SlideShare uma empresa Scribd logo
1 de 35
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.06.26 10:59:43 +09'00'
Apache Struts 2 における任意の
Java メソッド実行の脆弱性
CVE-2012-0838
JVNDB-2012-000012
2
Copyright©2013 JPCERT/CC All rights reserved.
Apache Struts 2とは
 Java のWebアプリケーションを開発するための
オープンソースのフレームワーク
 アプリケーションの開発効率やメンテナンス性
を向上させることを目的としている
3
Apache Struts2
JAVAアプリケーションWebサーバークライアント
Copyright©2013 JPCERT/CC All rights reserved.
Apache Struts 2とは
4
• Model-View-Controller (MVC)アーキテクチャを
採用
• アプリケーションの開発者はModelとViewを実
装する。
Model: ビジネスロジックの実装 (javaで実装)
View: 画面デザイン (jspで実装)
Controller: クライアントからの入力イベントを処理し、ModelやViewに振り分ける(Struts2で実装)
.jsp
.javaクライアント
Webサーバー
Copyright©2013 JPCERT/CC All rights reserved.
脆弱性の概要
—クライアントから送信されてきた文字列の処理で発生す
るエラーの取り扱いに不備が存在。
—具体的には、数値型の変数に対して文字列が送信されて
きた際に発生する変換エラー処理。
—送信する文字列を細工することで、任意のJavaメソッド
が実行可能となる。
5
Copyright©2013 JPCERT/CC All rights reserved.
脆弱性が悪用された場合のリスク
任意のJavaメソッドが実行できるため、Runtime::exec
メソッドを使えばOSコマンドを実行することが可能
アプリケーションの外部から、アプリケーションが稼働
するサーバ上で任意のコマンドが実行可能となり、サー
バを乗っ取られる可能性がある
6
Runtime::exec()
Webサーバ
Javaメソッド
実行!!細工された文字列
Copyright©2013 JPCERT/CC All rights reserved.
Struts2 内部で変換エラーが発生した場合の処理
7
※Struts2付属のサンプルアプリ「showcase」を元に処理を解説する
① クライアントから、エラーの原因となる文字列を含むリクエストが送信
される。
② Struts上で、文字列→数値に変換する際にエラーが発生し、エラー(例外)
処理を行う。
③ エラー処理で、変換エラーの原因となった文字列が保持される。
④ jsp側からエラーの原因となった文字列が取り出され、レスポンスの一部
としてクライアントへ送信される。
HelloWorld
Long型 empId エラー値
HelloWorld
.jsp
エラー値
HelloWorld
HelloWorld
エラー
empIdは数値です
HelloWorld
empId= HelloWorld
① ②
③
④
クライアント
エラー発生!
Copyright©2013 JPCERT/CC All rights reserved.8
private Long empId;
:
public Long getEmpId() {
return empId;
}
:
<s:textfield label="Employee Id"
name="currentEmployee.empId"/>
:
Javaファイル(Model)
/showcase/action/EmployeeAction.java
Jspファイル(View)
/empmanager/editEmployee.jsp
変数empIdをModel(.java)か
ら取得して表示する。
数値型(Long)の変数empId
が存在し、クライアントか
ら送信されたパラメータ
empIdの値が格納される
数値型の変数empIdに対して文字列を送信するとエラーが発生する。
クライアントからのリクエスト
サンプルアプリ「showcase」
Copyright©2013 JPCERT/CC All rights reserved.
①クライアントからエラーの原因となる文字列を含むリクエストが送信される
9
GET /?empId=HelloWorld HTTP/1.1
Host: localhost:8080
<form action=‘/’ method=‘GET’>
:
<input type=‘text’ name=‘empId’ value=‘HelloWorld’>
:
</form>
HTTPリクエスト
上記HTTPリクエストを送信するためのHTML
パラメータempIdの値と
して”HelloWorld”とい
う文字列を送信する。
(empIdはサーバ側では
数値型として扱われるこ
とに注意。)
empId= HelloWorld
①
クライアント
Copyright©2013 JPCERT/CC All rights reserved.
②文字列→数値に変換する際にエラー発生、エラー(例外)処理を行う
10
public class ConversionErrorInterceptor extends AbstractInterceptor {
:
public String intercept(ActionInvocation invocation) throws Exception {
:
クライアントから送信されてきたパラメータempIdの値”HelloWorld”を、
数値型変数empIdに対して挿入する際に変換エラーが発生し、エラー処理
が行われる。
変換エラー処理はConversionErrorInterceptorクラスのinterceptメソッド
内でエラー例外処理が行われる。
ConversionErrorInterceptor.java
HelloWorld
Long型 empId
②
Copyright©2013 JPCERT/CC All rights reserved.
③エラー処理で、変換エラーの原因となった文字列が保持される
11
public class ConversionErrorInterceptor extends AbstractInterceptor {
:
public String intercept(ActionInvocation invocation) throws Exception {
:
HashMap<Object, Object> fakie = null;
:
String propertyName = (String) entry.getKey();
Object value = entry.getValue();
:
fakie.put(propertyName, getOverrideExpr(invocation, value));
:
ConversionErrorInterceptor.java
エラーとなった変数名が
<クラス名.変数名>
という形式で取得され、変数
propertyNameに格納される。
currentEmployee.empId
Copyright©2013 JPCERT/CC All rights reserved.12
public class ConversionErrorInterceptor extends AbstractInterceptor {
:
public String intercept(ActionInvocation invocation) throws Exception {
:
HashMap<Object, Object> fakie = null;
:
String propertyName = (String) entry.getKey();
Object value = entry.getValue();
:
fakie.put(propertyName, getOverrideExpr(invocation, value));
:
変数valueには変換エラーとなっ
た文字列の値が代入される。
“HelloWorld”
③エラー処理で、変換エラーの原因となった文字列が保持される
ConversionErrorInterceptor.java
Copyright©2013 JPCERT/CC All rights reserved.13
public class ConversionErrorInterceptor extends AbstractInterceptor {
:
public String intercept(ActionInvocation invocation) throws Exception {
:
HashMap<Object, Object> fakie = null;
:
String propertyName = (String) entry.getKey();
Object value = entry.getValue();
:
fakie.put(propertyName, getOverrideExpr(invocation, value));
:
protected Object getOverrideExpr(ActionInvocation invocation, Object value) {
return "'" + value + "'";
}
getOverrideExprメソッド
getOverrideExprメソッドでは第2引数を’(シング
ルクオート)で囲って返却する処理を行う
“HelloWorld”‘HelloWorld’
③エラー処理で、変換エラーの原因となった文字列が保持される
ConversionErrorInterceptor.java
Copyright©2013 JPCERT/CC All rights reserved.14
public class ConversionErrorInterceptor extends AbstractInterceptor {
:
public String intercept(ActionInvocation invocation) throws Exception {
:
HashMap<Object, Object> fakie = null;
:
String propertyName = (String) entry.getKey();
Object value = entry.getValue();
:
fakie.put(propertyName, getOverrideExpr(invocation, value));
:
getOverrideExpr関数を介した
後の値は、変数propertyName
とセットでHashMap変数fakie
に代入される。
fakie:
currentEmployee.empId : ‘HelloWorld’
:
currentEmployee.empId
‘HelloWorld’
③エラー処理で、変換エラーの原因となった文字列が保持される
ConversionErrorInterceptor.java
Copyright©2013 JPCERT/CC All rights reserved.15
public class ConversionErrorInterceptor extends AbstractInterceptor {
:
public String intercept(ActionInvocation invocation) throws Exception {
:
fakie.put(propertyName, getOverrideExpr(invocation, value));
:
invocation.getStack().setExprOverrides(fakie);
public void setExprOverrides(Map overrides) {
if (this.overrides == null) {
this.overrides = overrides;
}
OgnlValueStack.java
エラー値を含む変数fakieはOgnlValueStackクラス
のインスタンス変数overridesとして保持される。
:
currentEmployee.empId :
‘HelloWorld’
fakie
fakie:
currentEmployee.empId : ‘HelloWorld’
:
③エラー処理で、変換エラーの原因となった文字列が保持される
ConversionErrorInterceptor.java
Copyright©2013 JPCERT/CC All rights reserved.
④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライ
アントへ送信する。
Jspに記述されたコード(OGNL式)にしたがって、変数empIdの値が
取得される。
 OGNLとは
⇒Object-Graph Navigation Language (OGNL)
 OGNLはJavaのクラス(Model)の変数を設定/取得するための言語
 サンプルコードのjspに記載されたOGNL式は、変数
currentEmployee.empIdの値を取得して表示をする式
 下記のような表記で直接Javaメソッドを呼び出すことも可能
:
:
<s:textfield label="Employee Id" name="currentEmployee.empId"/>
:
Jspファイル(View)
/empmanager/editEmployee.jsp
<property name="roots">@java.io.File@listRoots()</property>
16
Copyright©2013 JPCERT/CC All rights reserved.
④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライ
アントへ送信する。
Jspに記述されたOGNL式にしたがって、OgnlValueStack.findValueメソッドを
経由して変数currentEmployee.empId の値(エラーとなった文字列)が取得される。
:
:
<s:textfield label="Employee Id" name="currentEmployee.empId"/>
:
Jspファイル(View) /empmanager/editEmployee.jsp
public Object findValue(String expr, Class asType) {
:
if ((overrides != null) && overrides.containsKey(expr)) {
expr = (String) overrides.get(expr);
:
Object value = OgnlUtil.getValue(expr, context, root, asType);
:
}
OgnlValueStack.java
TextFieldTag.doEndTag()
TextField.end()
TextField.evaluateParams()
TextField.findValue()
TextParseUtil.translateVariables()
TextParseUtil.translateVariables()
TextParseUtil.translateVariables()
OgnlValueStack.findValue()
経由する関数
currentEmployee.empId
17
Copyright©2013 JPCERT/CC All rights reserved.
④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライ
アントへ送信する。
:
:
<s:textfield label="Employee Id" name="currentEmployee.empId"/>
:
public Object findValue(String expr, Class asType) {
:
if ((overrides != null) && overrides.containsKey(expr)) {
expr = (String) overrides.get(expr);
:
Object value = OgnlUtil.getValue(expr, context, root, asType);
:
}
前述の変数overridesから、変数expr
とセットの値(エラーが発生する原因
となった文字列)がとりだされる。
‘HelloWorld’
fakie
‘HelloWorld’
currentEmployee.empId
:
currentEmployee.empId :
‘HelloWorld’
18
OgnlValueStack.java
TextFieldTag.doEndTag()
TextField.end()
TextField.evaluateParams()
TextField.findValue()
TextParseUtil.translateVariables()
TextParseUtil.translateVariables()
TextParseUtil.translateVariables()
OgnlValueStack.findValue()
経由する関数
Jspに記述されたOGNL式にしたがって、OgnlValueStack.findValueメソッドを
経由して変数currentEmployee.empId の値(エラーとなった文字列)が取得される。
Jspファイル(View) /empmanager/editEmployee.jsp
Copyright©2013 JPCERT/CC All rights reserved.
④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライ
アントへ送信する。
:
:
<s:textfield label="Employee Id" name="currentEmployee.empId"/>
:
public Object findValue(String expr, Class asType) {
:
if ((overrides != null) && overrides.containsKey(expr)) {
expr = (String) overrides.get(expr);
:
Object value = OgnlUtil.getValue(expr, context, root, asType);
:
}
変数exprの値はOgnlUtil::getValueメ
ソッドにてOGNL式として評価された
後にクライアントに返却される。
‘HelloWorld’
fakie
OGNL
:
currentEmployee.empId :
‘HelloWorld’
文字列’HelloWorld’はOGNL式として意
味を持たないため、’HelloWorld’のまま
19
TextFieldTag.doEndTag()
TextField.end()
TextField.evaluateParams()
TextField.findValue()
TextParseUtil.translateVariables()
TextParseUtil.translateVariables()
TextParseUtil.translateVariables()
OgnlValueStack.findValue()
経由する関数
OgnlValueStack.java
Jspファイル(View) /empmanager/editEmployee.jsp
Jspに記述されたOGNL式にしたがって、OgnlValueStack.findValueメソッドを
経由して変数currentEmployee.empId の値(エラーとなった文字列)が取得される。
Copyright©2013 JPCERT/CC All rights reserved.
Javaファイル
(Model)
Jspファイル
(View)
Jspに記述されたOGNL式では、OgnlValueStack.findValueメソッドによって
Java(Model)の処理結果を取得後、必ずOgnlUtil.getValueメソッドによって
OGNL式による評価が行われる。
処理
OgnlUtil.getValueメソッ
ドによるOGNL式の評価
Model(Java)による処理が・・・
• 正常処理の場合 → 正常値
• エラー処理の場合 → エラー値
が保持される
クライアント
処理結果
処理後の値
OgnlValueStack.findValue()
リクエスト
Hello World
Java(Model)側の処理後の値を取得後、
Java(Model)側の処理がエラーかどうかに関わ
らず、必ずOGNL式として評価される。
①
②
③
20
④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライ
アントへ送信する。
Copyright©2013 JPCERT/CC All rights reserved.
④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライ
アントへ送信する
21
レスポンスがクライアントに返される。
クライアント上ではエラーメッセージが表示される。
Copyright©2013 JPCERT/CC All rights reserved.
攻撃コード
22
■攻撃コードのポイント
パラメーターempIdに対し、JavaメソッドであるgetRuntime.execでコマンドを
実行するOGNL式を指定している。
GET /?empId='%2B@java.lang.Runtime@getRuntime().exec(“notepad.exe")%2B' HTTP/1.1
Host: localhost:8080
<form action=‘/’ method=‘GET’>
:
<input type=‘hidden’ name=‘empId’
value="'+@java.lang.Runtime@getRuntime().exec(&quot;notepad.exe&quot;)+'">
:
</form>
攻撃コードのHTTPリクエスト
攻撃コードのHTTPリクエストを送信するためのHTML
Copyright©2013 JPCERT/CC All rights reserved.
変換エラーが発生した際の処理フロー
※Struts2に付属しているサンプルアプリ「showcase」を元に処理を解説する
① クライアントから、エラーの原因となる文字列を含むリクエストが送信
される。
② Struts上で、文字列→数値に変換する際にエラーが発生し、エラー(例
外)処理を行う。
③ エラー処理で、変換エラーの原因となった文字列が保持される。
④ Jsp側からエラーの原因となった文字列が取り出され、レスポンスの一部
としてクライアントへ送信される。
攻撃コードが実行された際の処理
23
攻撃コードが実行された際でも処理のフローは正常処理と全く変わらないが、
④の処理内容で違いが発生する。
Copyright©2013 JPCERT/CC All rights reserved.
攻撃コード実行時
④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライアントへ送信する
Jspの内容にしたがって、変数empIdの値が取得され、エラーの原因となった
文字列が返されるが・・・
:
:
<s:textfield label="Employee Id" name="currentEmployee.empId"/>
:
public Object findValue(String expr, Class asType) {
:
if ((overrides != null) && overrides.containsKey(expr)) {
expr = (String) overrides.get(expr);
:
Object value = OgnlUtil.getValue(expr, context, root, asType);
:
}
OgnlValueStack.java
前述の変数overridesから、エラー
が発生した原因となる文字列が変
数exprにとりだされる。
: fakie
'+@java.lang.Runtime@getRuntime().exec(“notepad.exe")+'
24
Jspファイル(View) /empmanager/editEmployee.jsp
Copyright©2013 JPCERT/CC All rights reserved.
25
public Object findValue(String expr, Class asType) {
:
if ((overrides != null) && overrides.containsKey(expr)) {
expr = (String) overrides.get(expr);
:
Object value = OgnlUtil.getValue(expr, context, root, asType);
:
}
変数exprがOGNL式として評
価される際にJavaメソッ
ドが実行されてしまう!!
'+@java.lang.Runtime@getRuntime().exec(“notepad.exe")+'
25
OgnlValueStack.java
:
:
<s:textfield label="Employee Id" name="currentEmployee.empId"/>
:
攻撃コード実行時
④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライアントへ送信する
Jspの内容にしたがって、変数empIdの値が取得され、エラーの原因となった
文字列が返されるが・・・
Jspファイル(View) /empmanager/editEmployee.jsp
Copyright©2013 JPCERT/CC All rights reserved.
問題点
 今回のアプリケーションにおける具体的な問題点
引数をOGNL式として評価するOgnlUtil::getValueメソッドに
対し、無害化していないデータを渡してしまっていた。
26
以下のコーディングガイドに違反している!!
「 IDS00-J. 信頼境界を越えて渡される信頼できないデータは無
害化する」
 問題点に対してどうすべきだったか。
OgnlUtil::getValueメソッドの引数として渡す前に、データが
OGNL式として解釈されないように無害化する必要があった。
Copyright©2013 JPCERT/CC All rights reserved.
変換エラーが発生した際の処理フロー
※Struts2付属のサンプルアプリ「showcase」を元に処理を解説する
① クライアントから、エラーの原因となる文字列を含むリクエストが送信
される。
② Struts上で、文字列→数値に変換する際にエラーが発生し、エラー(例
外)処理を行う。
③ エラー処理で、変換エラーの原因となった文字列が保持される。
④ Jsp側からエラーの原因となった文字列が取り出され、レスポンスの一部
としてクライアントへ送信される。
修正版コード: バージョン2.2.3.1で修正
27
この処理のコードに修正が入っている
HelloWorld
Long型 empId エラー値
HelloWorld
.jsp
エラー値
HelloWorld
HelloWorld
エラー
empIdは数値です
HelloWorld
empId= HelloWorld
① ② ③ ④
Copyright©2013 JPCERT/CC All rights reserved.
修正版コード: 脆弱バージョンのおさらい
28
public class ConversionErrorInterceptor extends AbstractInterceptor {
:
public String intercept(ActionInvocation invocation) throws Exception {
:
HashMap<Object, Object> fakie = null;
:
Object value = entry.getValue();
:
fakie.put(propertyName, getOverrideExpr(invocation, value));
:
ConversionErrorInterceptor.java
変数valueには変換エ
ラーとなった入力値が代
入される。
“HelloWorld”
③エラー処理で、変換エラーの原因となった文字列が保持される
Copyright©2013 JPCERT/CC All rights reserved.29
public class ConversionErrorInterceptor extends AbstractInterceptor {
:
public String intercept(ActionInvocation invocation) throws Exception {
:
HashMap<Object, Object> fakie = null;
:
Object value = entry.getValue();
:
fakie.put(propertyName, getOverrideExpr(invocation, value));
:
protected Object getOverrideExpr(ActionInvocation invocation, Object value) {
return "'" + value + "'";
}
変数valueは
getOverrideExpr関数を
介してHashMap変数
fakieに代入される。
getOverrideExprメソッド
getOverrideExprメソッドでは第2引数を’(シン
グルクオート)で囲って返却する処理を行う
“HelloWorld”fakie:
‘HelloWorld’
:
修正版コードではgetOverrideExprメソッドに修正が加えられている。
ConversionErrorInterceptor.java
修正版コード: 脆弱バージョンのおさらい
③エラー処理で、変換エラーの原因となった文字列が保持される
Copyright©2013 JPCERT/CC All rights reserved.
修正版コード: getOverrideExprメソッドの修正内容
30
protected Object getOverrideExpr(ActionInvocation invocation, Object value) {
return "'" + value + "'";
}
getOverrideExprメソッド(修正前)
protected Object getOverrideExpr(ActionInvocation invocation, Object value) {
return "¥"" + StringEscapeUtils.escapeJava(String.valueOf(value)) + "¥"";
}
getOverrideExprメソッド(修正後)
StringEscapeUtils.escapeJavaメソッドを
使ってエスケープ処理を行っている。
getOverrideExprメソッドでは第2引数を’(シン
グルクオート)で囲って返却する処理を行う
③エラー処理で、変換エラーの原因となった文字列が保持される
Copyright©2013 JPCERT/CC All rights reserved.
修正版コード: StringEscapeUtils.escapeJavaメソッドによるエスケープ
31
• StringEscapeUtils.escapeJavaメソッドによるエスケープ処理
エスケープ対象文字列 エスケープ処理後の文字列
¥b ¥¥b
¥n ¥¥n
¥t ¥¥t
¥f ¥¥f
¥r ¥¥r
‘(シングルクオート) ¥’
“(ダブルクオート) ¥”
¥ ¥¥
/ ¥/
■攻撃コードで送信される値がエスケープされると・・・・
'%2B@java.lang.Runtime@getRuntime().exec(“notepad.exe")%2B'
↓
¥'%2B@java.lang.Runtime@getRuntime().exec(¥“notepad.exe¥")%2B¥'
⇒OGNL式として解釈されない文字列にエスケープされる。
Copyright©2013 JPCERT/CC All rights reserved.
修正版コード: エスケープ実施後のOgnlUtil::getValueメソッドの動作
32
:
:
<s:textfield label="Employee Id" name="currentEmployee.empId"/>
:
public Object findValue(String expr, Class asType) {
:
if ((overrides != null) && overrides.containsKey(expr)) {
expr = (String) overrides.get(expr);
:
Object value = OgnlUtil.getValue(expr, context, root, asType);
:
}
OgnlValueStack.java
変数exprはエスケープされて
いるため、OGNL式として評
価されてもJavaメソッドは
実行されない
¥'+@java.lang.Runtime@getRuntime().exec(¥“notepad.exe¥")+¥'
StringEscapeUtils::escapeJavaメソッドでエスケープされた値を
OgnlUtil::getValueメソッドの引数として渡すことで、OGNL式として評
価されてもJavaメソッドは実行されなくなる。
32
Jspファイル(View) /empmanager/editEmployee.jsp
Copyright©2013 JPCERT/CC All rights reserved.
補足
今回は数値型への変換エラーの際の処理であったが、そ
れ以外のエラー処理にも同様の脆弱性が存在する可能性
がある。
Struts2の脆弱性でありながら、その上で動くJAVAアプ
リケーションの仕様によって影響を受けるかどうかが変
わる
33
Copyright©2013 JPCERT/CC All rights reserved.
まとめ
34
■この脆弱性から学べるプログラミングの注意点
• SQLクエリやHTMLなど、異なる処理系にデータを出力
する際には、出力先の処理を考慮した無害化が必要
• 無害化を実施しないとSQLインジェクションやクロスサ
イトスクリプティング等の脆弱性が発生する
• 今回はOGNL式にデータを渡す際に、OGNL式として解
釈されないような無害化処理を実施していなかったため、
脆弱性が発生した
■上記への対策
•データを出力する際には、出力先でデータがどのように
解釈されるかを確認する
•出力先でデータが意図しない解釈をされないように適切
な無害化を行う
Copyright©2013 JPCERT/CC All rights reserved.
著作権・引用や二次利用について
本資料の著作権はJPCERT/CCに帰属します。
本資料あるいはその一部を引用・転載・再配布する際は、引用元名、資料名および URL の明示をお
願いします。
記載例
引用元:一般社団法人JPCERTコーディネーションセンター
Java アプリケーション脆弱性事例解説資料
Apache Strus2 における任意の Java メソッド実行の脆弱性
https://www.jpcert.or.jp/research/materials-java-casestudies/No.2_Apache_Struts2.pdf
本資料を引用・転載・再配布をする際は、引用先文書、時期、内容等の情報を、JPCERT コーディ
ネーションセンター広報(office@jpcert.or.jp)までメールにてお知らせください。なお、この連絡に
より取得した個人情報は、別途定めるJPCERT コーディネーションセンターの「プライバシーポリ
シー」に則って取り扱います。
本資料の利用方法等に関するお問い合わせ
JPCERTコーディネーションセンター
広報担当
E-mail:office@jpcert.or.jp
35
本資料の技術的な内容に関するお問い合わせ
JPCERTコーディネーションセンター
セキュアコーディング担当
E-mail:secure-coding@jpcert.or.jp

Mais conteúdo relacionado

Mais procurados

JSON:APIについてざっくり入門
JSON:APIについてざっくり入門JSON:APIについてざっくり入門
JSON:APIについてざっくり入門iPride Co., Ltd.
 
C++ AMPを使ってみよう
C++ AMPを使ってみようC++ AMPを使ってみよう
C++ AMPを使ってみようOsamu Masutani
 
C++による数値解析の並列化手法
C++による数値解析の並列化手法C++による数値解析の並列化手法
C++による数値解析の並列化手法dc1394
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門Makoto Fukuhara
 
180116LT”全国の大学バス列から 見たSFCの異常性”
180116LT”全国の大学バス列から見たSFCの異常性”180116LT”全国の大学バス列から見たSFCの異常性”
180116LT”全国の大学バス列から 見たSFCの異常性”tan tan
 
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜Takahiro Inoue
 
Rosserial無線化への招待 〜Invitation to wirelessization by rosserial〜
Rosserial無線化への招待 〜Invitation to wirelessization by rosserial〜Rosserial無線化への招待 〜Invitation to wirelessization by rosserial〜
Rosserial無線化への招待 〜Invitation to wirelessization by rosserial〜Tatsuya Fukuta
 
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? - なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? - 健人 井関
 
ROSによるロボットソフトウェアの開発
ROSによるロボットソフトウェアの開発ROSによるロボットソフトウェアの開発
ROSによるロボットソフトウェアの開発Yuji Yamauchi
 
RailsGirls から始める エンジニアリングはじめの一歩
RailsGirls から始める エンジニアリングはじめの一歩RailsGirls から始める エンジニアリングはじめの一歩
RailsGirls から始める エンジニアリングはじめの一歩Hiroshi SHIBATA
 
Exaリーディングのすゝめ
ExaリーディングのすゝめExaリーディングのすゝめ
ExaリーディングのすゝめShinichi Makino
 
ROS2のリアルタイム化に挑む WG初参加
ROS2のリアルタイム化に挑む WG初参加ROS2のリアルタイム化に挑む WG初参加
ROS2のリアルタイム化に挑む WG初参加Atsushi Hasegawa
 
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionThe Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionYoshifumi Kawai
 
レガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osレガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osuchan_nos
 
[DO02] Jenkins PipelineとBlue Oceanによる、フルスクラッチからの継続的デリバリ
[DO02] Jenkins PipelineとBlue Oceanによる、フルスクラッチからの継続的デリバリ[DO02] Jenkins PipelineとBlue Oceanによる、フルスクラッチからの継続的デリバリ
[DO02] Jenkins PipelineとBlue Oceanによる、フルスクラッチからの継続的デリバリde:code 2017
 
AOT(Ahead Of Time)
AOT(Ahead Of Time)AOT(Ahead Of Time)
AOT(Ahead Of Time)Questpond
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 
iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い
iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞いiOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い
iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞いKen Morishita
 

Mais procurados (20)

JSON:APIについてざっくり入門
JSON:APIについてざっくり入門JSON:APIについてざっくり入門
JSON:APIについてざっくり入門
 
C++ AMPを使ってみよう
C++ AMPを使ってみようC++ AMPを使ってみよう
C++ AMPを使ってみよう
 
C++による数値解析の並列化手法
C++による数値解析の並列化手法C++による数値解析の並列化手法
C++による数値解析の並列化手法
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門
 
180116LT”全国の大学バス列から 見たSFCの異常性”
180116LT”全国の大学バス列から見たSFCの異常性”180116LT”全国の大学バス列から見たSFCの異常性”
180116LT”全国の大学バス列から 見たSFCの異常性”
 
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
 
Rosserial無線化への招待 〜Invitation to wirelessization by rosserial〜
Rosserial無線化への招待 〜Invitation to wirelessization by rosserial〜Rosserial無線化への招待 〜Invitation to wirelessization by rosserial〜
Rosserial無線化への招待 〜Invitation to wirelessization by rosserial〜
 
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? - なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
 
ROSによるロボットソフトウェアの開発
ROSによるロボットソフトウェアの開発ROSによるロボットソフトウェアの開発
ROSによるロボットソフトウェアの開発
 
RailsGirls から始める エンジニアリングはじめの一歩
RailsGirls から始める エンジニアリングはじめの一歩RailsGirls から始める エンジニアリングはじめの一歩
RailsGirls から始める エンジニアリングはじめの一歩
 
Exaリーディングのすゝめ
ExaリーディングのすゝめExaリーディングのすゝめ
Exaリーディングのすゝめ
 
ROS2のリアルタイム化に挑む WG初参加
ROS2のリアルタイム化に挑む WG初参加ROS2のリアルタイム化に挑む WG初参加
ROS2のリアルタイム化に挑む WG初参加
 
マーブル図で怖くないRxJS
マーブル図で怖くないRxJSマーブル図で怖くないRxJS
マーブル図で怖くないRxJS
 
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionThe Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnion
 
レガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osレガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free os
 
[DO02] Jenkins PipelineとBlue Oceanによる、フルスクラッチからの継続的デリバリ
[DO02] Jenkins PipelineとBlue Oceanによる、フルスクラッチからの継続的デリバリ[DO02] Jenkins PipelineとBlue Oceanによる、フルスクラッチからの継続的デリバリ
[DO02] Jenkins PipelineとBlue Oceanによる、フルスクラッチからの継続的デリバリ
 
AOT(Ahead Of Time)
AOT(Ahead Of Time)AOT(Ahead Of Time)
AOT(Ahead Of Time)
 
詳説WebAssembly
詳説WebAssembly詳説WebAssembly
詳説WebAssembly
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い
iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞いiOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い
iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い
 

Semelhante a Apache Struts2 における任意の Java メソッド実行の脆弱性

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
 
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)JPCERT Coordination Center
 
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性JPCERT Coordination Center
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性JPCERT Coordination Center
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JPCERT Coordination Center
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性JPCERT Coordination Center
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JPCERT Coordination Center
 
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性JPCERT Coordination Center
 
分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4AdvancedTechNight
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/AndroidセキュアコーディングMasaki Kubo
 
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
 
Unit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXUnit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXShinya Mochida
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)JPCERT Coordination Center
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜JustSystems Corporation
 
R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotationEIICHI KIMURA
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7Yuichi Sakuraba
 

Semelhante a Apache Struts2 における任意の Java メソッド実行の脆弱性 (20)

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)
 
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
 
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
 
Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備
 
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
 
分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4
 
Java EE8 Report
Java EE8 ReportJava EE8 Report
Java EE8 Report
 
Cve 2013-0422
Cve 2013-0422Cve 2013-0422
Cve 2013-0422
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/Androidセキュアコーディング
 
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...
 
Unit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXUnit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFX
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotation
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
 

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
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)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
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性JPCERT Coordination Center
 
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
 
クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策JPCERT Coordination Center
 
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」JPCERT Coordination Center
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデル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
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)JPCERT Coordination Center
 
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性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 (20)

いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
 
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (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 とバックアップの話』
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
 
脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる
 
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
 
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...
 
クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策
 
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデル
 
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
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
 
Android Secure Coding
Android Secure CodingAndroid Secure Coding
Android Secure Coding
 
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性
 
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回演習
 

Último

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 

Último (8)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 

Apache Struts2 における任意の Java メソッド実行の脆弱性

  • 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.06.26 10:59:43 +09'00'
  • 2. Apache Struts 2 における任意の Java メソッド実行の脆弱性 CVE-2012-0838 JVNDB-2012-000012 2
  • 3. Copyright©2013 JPCERT/CC All rights reserved. Apache Struts 2とは  Java のWebアプリケーションを開発するための オープンソースのフレームワーク  アプリケーションの開発効率やメンテナンス性 を向上させることを目的としている 3 Apache Struts2 JAVAアプリケーションWebサーバークライアント
  • 4. Copyright©2013 JPCERT/CC All rights reserved. Apache Struts 2とは 4 • Model-View-Controller (MVC)アーキテクチャを 採用 • アプリケーションの開発者はModelとViewを実 装する。 Model: ビジネスロジックの実装 (javaで実装) View: 画面デザイン (jspで実装) Controller: クライアントからの入力イベントを処理し、ModelやViewに振り分ける(Struts2で実装) .jsp .javaクライアント Webサーバー
  • 5. Copyright©2013 JPCERT/CC All rights reserved. 脆弱性の概要 —クライアントから送信されてきた文字列の処理で発生す るエラーの取り扱いに不備が存在。 —具体的には、数値型の変数に対して文字列が送信されて きた際に発生する変換エラー処理。 —送信する文字列を細工することで、任意のJavaメソッド が実行可能となる。 5
  • 6. Copyright©2013 JPCERT/CC All rights reserved. 脆弱性が悪用された場合のリスク 任意のJavaメソッドが実行できるため、Runtime::exec メソッドを使えばOSコマンドを実行することが可能 アプリケーションの外部から、アプリケーションが稼働 するサーバ上で任意のコマンドが実行可能となり、サー バを乗っ取られる可能性がある 6 Runtime::exec() Webサーバ Javaメソッド 実行!!細工された文字列
  • 7. Copyright©2013 JPCERT/CC All rights reserved. Struts2 内部で変換エラーが発生した場合の処理 7 ※Struts2付属のサンプルアプリ「showcase」を元に処理を解説する ① クライアントから、エラーの原因となる文字列を含むリクエストが送信 される。 ② Struts上で、文字列→数値に変換する際にエラーが発生し、エラー(例外) 処理を行う。 ③ エラー処理で、変換エラーの原因となった文字列が保持される。 ④ jsp側からエラーの原因となった文字列が取り出され、レスポンスの一部 としてクライアントへ送信される。 HelloWorld Long型 empId エラー値 HelloWorld .jsp エラー値 HelloWorld HelloWorld エラー empIdは数値です HelloWorld empId= HelloWorld ① ② ③ ④ クライアント エラー発生!
  • 8. Copyright©2013 JPCERT/CC All rights reserved.8 private Long empId; : public Long getEmpId() { return empId; } : <s:textfield label="Employee Id" name="currentEmployee.empId"/> : Javaファイル(Model) /showcase/action/EmployeeAction.java Jspファイル(View) /empmanager/editEmployee.jsp 変数empIdをModel(.java)か ら取得して表示する。 数値型(Long)の変数empId が存在し、クライアントか ら送信されたパラメータ empIdの値が格納される 数値型の変数empIdに対して文字列を送信するとエラーが発生する。 クライアントからのリクエスト サンプルアプリ「showcase」
  • 9. Copyright©2013 JPCERT/CC All rights reserved. ①クライアントからエラーの原因となる文字列を含むリクエストが送信される 9 GET /?empId=HelloWorld HTTP/1.1 Host: localhost:8080 <form action=‘/’ method=‘GET’> : <input type=‘text’ name=‘empId’ value=‘HelloWorld’> : </form> HTTPリクエスト 上記HTTPリクエストを送信するためのHTML パラメータempIdの値と して”HelloWorld”とい う文字列を送信する。 (empIdはサーバ側では 数値型として扱われるこ とに注意。) empId= HelloWorld ① クライアント
  • 10. Copyright©2013 JPCERT/CC All rights reserved. ②文字列→数値に変換する際にエラー発生、エラー(例外)処理を行う 10 public class ConversionErrorInterceptor extends AbstractInterceptor { : public String intercept(ActionInvocation invocation) throws Exception { : クライアントから送信されてきたパラメータempIdの値”HelloWorld”を、 数値型変数empIdに対して挿入する際に変換エラーが発生し、エラー処理 が行われる。 変換エラー処理はConversionErrorInterceptorクラスのinterceptメソッド 内でエラー例外処理が行われる。 ConversionErrorInterceptor.java HelloWorld Long型 empId ②
  • 11. Copyright©2013 JPCERT/CC All rights reserved. ③エラー処理で、変換エラーの原因となった文字列が保持される 11 public class ConversionErrorInterceptor extends AbstractInterceptor { : public String intercept(ActionInvocation invocation) throws Exception { : HashMap<Object, Object> fakie = null; : String propertyName = (String) entry.getKey(); Object value = entry.getValue(); : fakie.put(propertyName, getOverrideExpr(invocation, value)); : ConversionErrorInterceptor.java エラーとなった変数名が <クラス名.変数名> という形式で取得され、変数 propertyNameに格納される。 currentEmployee.empId
  • 12. Copyright©2013 JPCERT/CC All rights reserved.12 public class ConversionErrorInterceptor extends AbstractInterceptor { : public String intercept(ActionInvocation invocation) throws Exception { : HashMap<Object, Object> fakie = null; : String propertyName = (String) entry.getKey(); Object value = entry.getValue(); : fakie.put(propertyName, getOverrideExpr(invocation, value)); : 変数valueには変換エラーとなっ た文字列の値が代入される。 “HelloWorld” ③エラー処理で、変換エラーの原因となった文字列が保持される ConversionErrorInterceptor.java
  • 13. Copyright©2013 JPCERT/CC All rights reserved.13 public class ConversionErrorInterceptor extends AbstractInterceptor { : public String intercept(ActionInvocation invocation) throws Exception { : HashMap<Object, Object> fakie = null; : String propertyName = (String) entry.getKey(); Object value = entry.getValue(); : fakie.put(propertyName, getOverrideExpr(invocation, value)); : protected Object getOverrideExpr(ActionInvocation invocation, Object value) { return "'" + value + "'"; } getOverrideExprメソッド getOverrideExprメソッドでは第2引数を’(シング ルクオート)で囲って返却する処理を行う “HelloWorld”‘HelloWorld’ ③エラー処理で、変換エラーの原因となった文字列が保持される ConversionErrorInterceptor.java
  • 14. Copyright©2013 JPCERT/CC All rights reserved.14 public class ConversionErrorInterceptor extends AbstractInterceptor { : public String intercept(ActionInvocation invocation) throws Exception { : HashMap<Object, Object> fakie = null; : String propertyName = (String) entry.getKey(); Object value = entry.getValue(); : fakie.put(propertyName, getOverrideExpr(invocation, value)); : getOverrideExpr関数を介した 後の値は、変数propertyName とセットでHashMap変数fakie に代入される。 fakie: currentEmployee.empId : ‘HelloWorld’ : currentEmployee.empId ‘HelloWorld’ ③エラー処理で、変換エラーの原因となった文字列が保持される ConversionErrorInterceptor.java
  • 15. Copyright©2013 JPCERT/CC All rights reserved.15 public class ConversionErrorInterceptor extends AbstractInterceptor { : public String intercept(ActionInvocation invocation) throws Exception { : fakie.put(propertyName, getOverrideExpr(invocation, value)); : invocation.getStack().setExprOverrides(fakie); public void setExprOverrides(Map overrides) { if (this.overrides == null) { this.overrides = overrides; } OgnlValueStack.java エラー値を含む変数fakieはOgnlValueStackクラス のインスタンス変数overridesとして保持される。 : currentEmployee.empId : ‘HelloWorld’ fakie fakie: currentEmployee.empId : ‘HelloWorld’ : ③エラー処理で、変換エラーの原因となった文字列が保持される ConversionErrorInterceptor.java
  • 16. Copyright©2013 JPCERT/CC All rights reserved. ④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライ アントへ送信する。 Jspに記述されたコード(OGNL式)にしたがって、変数empIdの値が 取得される。  OGNLとは ⇒Object-Graph Navigation Language (OGNL)  OGNLはJavaのクラス(Model)の変数を設定/取得するための言語  サンプルコードのjspに記載されたOGNL式は、変数 currentEmployee.empIdの値を取得して表示をする式  下記のような表記で直接Javaメソッドを呼び出すことも可能 : : <s:textfield label="Employee Id" name="currentEmployee.empId"/> : Jspファイル(View) /empmanager/editEmployee.jsp <property name="roots">@java.io.File@listRoots()</property> 16
  • 17. Copyright©2013 JPCERT/CC All rights reserved. ④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライ アントへ送信する。 Jspに記述されたOGNL式にしたがって、OgnlValueStack.findValueメソッドを 経由して変数currentEmployee.empId の値(エラーとなった文字列)が取得される。 : : <s:textfield label="Employee Id" name="currentEmployee.empId"/> : Jspファイル(View) /empmanager/editEmployee.jsp public Object findValue(String expr, Class asType) { : if ((overrides != null) && overrides.containsKey(expr)) { expr = (String) overrides.get(expr); : Object value = OgnlUtil.getValue(expr, context, root, asType); : } OgnlValueStack.java TextFieldTag.doEndTag() TextField.end() TextField.evaluateParams() TextField.findValue() TextParseUtil.translateVariables() TextParseUtil.translateVariables() TextParseUtil.translateVariables() OgnlValueStack.findValue() 経由する関数 currentEmployee.empId 17
  • 18. Copyright©2013 JPCERT/CC All rights reserved. ④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライ アントへ送信する。 : : <s:textfield label="Employee Id" name="currentEmployee.empId"/> : public Object findValue(String expr, Class asType) { : if ((overrides != null) && overrides.containsKey(expr)) { expr = (String) overrides.get(expr); : Object value = OgnlUtil.getValue(expr, context, root, asType); : } 前述の変数overridesから、変数expr とセットの値(エラーが発生する原因 となった文字列)がとりだされる。 ‘HelloWorld’ fakie ‘HelloWorld’ currentEmployee.empId : currentEmployee.empId : ‘HelloWorld’ 18 OgnlValueStack.java TextFieldTag.doEndTag() TextField.end() TextField.evaluateParams() TextField.findValue() TextParseUtil.translateVariables() TextParseUtil.translateVariables() TextParseUtil.translateVariables() OgnlValueStack.findValue() 経由する関数 Jspに記述されたOGNL式にしたがって、OgnlValueStack.findValueメソッドを 経由して変数currentEmployee.empId の値(エラーとなった文字列)が取得される。 Jspファイル(View) /empmanager/editEmployee.jsp
  • 19. Copyright©2013 JPCERT/CC All rights reserved. ④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライ アントへ送信する。 : : <s:textfield label="Employee Id" name="currentEmployee.empId"/> : public Object findValue(String expr, Class asType) { : if ((overrides != null) && overrides.containsKey(expr)) { expr = (String) overrides.get(expr); : Object value = OgnlUtil.getValue(expr, context, root, asType); : } 変数exprの値はOgnlUtil::getValueメ ソッドにてOGNL式として評価された 後にクライアントに返却される。 ‘HelloWorld’ fakie OGNL : currentEmployee.empId : ‘HelloWorld’ 文字列’HelloWorld’はOGNL式として意 味を持たないため、’HelloWorld’のまま 19 TextFieldTag.doEndTag() TextField.end() TextField.evaluateParams() TextField.findValue() TextParseUtil.translateVariables() TextParseUtil.translateVariables() TextParseUtil.translateVariables() OgnlValueStack.findValue() 経由する関数 OgnlValueStack.java Jspファイル(View) /empmanager/editEmployee.jsp Jspに記述されたOGNL式にしたがって、OgnlValueStack.findValueメソッドを 経由して変数currentEmployee.empId の値(エラーとなった文字列)が取得される。
  • 20. Copyright©2013 JPCERT/CC All rights reserved. Javaファイル (Model) Jspファイル (View) Jspに記述されたOGNL式では、OgnlValueStack.findValueメソッドによって Java(Model)の処理結果を取得後、必ずOgnlUtil.getValueメソッドによって OGNL式による評価が行われる。 処理 OgnlUtil.getValueメソッ ドによるOGNL式の評価 Model(Java)による処理が・・・ • 正常処理の場合 → 正常値 • エラー処理の場合 → エラー値 が保持される クライアント 処理結果 処理後の値 OgnlValueStack.findValue() リクエスト Hello World Java(Model)側の処理後の値を取得後、 Java(Model)側の処理がエラーかどうかに関わ らず、必ずOGNL式として評価される。 ① ② ③ 20 ④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライ アントへ送信する。
  • 21. Copyright©2013 JPCERT/CC All rights reserved. ④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライ アントへ送信する 21 レスポンスがクライアントに返される。 クライアント上ではエラーメッセージが表示される。
  • 22. Copyright©2013 JPCERT/CC All rights reserved. 攻撃コード 22 ■攻撃コードのポイント パラメーターempIdに対し、JavaメソッドであるgetRuntime.execでコマンドを 実行するOGNL式を指定している。 GET /?empId='%2B@java.lang.Runtime@getRuntime().exec(“notepad.exe")%2B' HTTP/1.1 Host: localhost:8080 <form action=‘/’ method=‘GET’> : <input type=‘hidden’ name=‘empId’ value="'+@java.lang.Runtime@getRuntime().exec(&quot;notepad.exe&quot;)+'"> : </form> 攻撃コードのHTTPリクエスト 攻撃コードのHTTPリクエストを送信するためのHTML
  • 23. Copyright©2013 JPCERT/CC All rights reserved. 変換エラーが発生した際の処理フロー ※Struts2に付属しているサンプルアプリ「showcase」を元に処理を解説する ① クライアントから、エラーの原因となる文字列を含むリクエストが送信 される。 ② Struts上で、文字列→数値に変換する際にエラーが発生し、エラー(例 外)処理を行う。 ③ エラー処理で、変換エラーの原因となった文字列が保持される。 ④ Jsp側からエラーの原因となった文字列が取り出され、レスポンスの一部 としてクライアントへ送信される。 攻撃コードが実行された際の処理 23 攻撃コードが実行された際でも処理のフローは正常処理と全く変わらないが、 ④の処理内容で違いが発生する。
  • 24. Copyright©2013 JPCERT/CC All rights reserved. 攻撃コード実行時 ④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライアントへ送信する Jspの内容にしたがって、変数empIdの値が取得され、エラーの原因となった 文字列が返されるが・・・ : : <s:textfield label="Employee Id" name="currentEmployee.empId"/> : public Object findValue(String expr, Class asType) { : if ((overrides != null) && overrides.containsKey(expr)) { expr = (String) overrides.get(expr); : Object value = OgnlUtil.getValue(expr, context, root, asType); : } OgnlValueStack.java 前述の変数overridesから、エラー が発生した原因となる文字列が変 数exprにとりだされる。 : fakie '+@java.lang.Runtime@getRuntime().exec(“notepad.exe")+' 24 Jspファイル(View) /empmanager/editEmployee.jsp
  • 25. Copyright©2013 JPCERT/CC All rights reserved. 25 public Object findValue(String expr, Class asType) { : if ((overrides != null) && overrides.containsKey(expr)) { expr = (String) overrides.get(expr); : Object value = OgnlUtil.getValue(expr, context, root, asType); : } 変数exprがOGNL式として評 価される際にJavaメソッ ドが実行されてしまう!! '+@java.lang.Runtime@getRuntime().exec(“notepad.exe")+' 25 OgnlValueStack.java : : <s:textfield label="Employee Id" name="currentEmployee.empId"/> : 攻撃コード実行時 ④Jsp側からエラーの文字列が取り出され、レスポンスとしてクライアントへ送信する Jspの内容にしたがって、変数empIdの値が取得され、エラーの原因となった 文字列が返されるが・・・ Jspファイル(View) /empmanager/editEmployee.jsp
  • 26. Copyright©2013 JPCERT/CC All rights reserved. 問題点  今回のアプリケーションにおける具体的な問題点 引数をOGNL式として評価するOgnlUtil::getValueメソッドに 対し、無害化していないデータを渡してしまっていた。 26 以下のコーディングガイドに違反している!! 「 IDS00-J. 信頼境界を越えて渡される信頼できないデータは無 害化する」  問題点に対してどうすべきだったか。 OgnlUtil::getValueメソッドの引数として渡す前に、データが OGNL式として解釈されないように無害化する必要があった。
  • 27. Copyright©2013 JPCERT/CC All rights reserved. 変換エラーが発生した際の処理フロー ※Struts2付属のサンプルアプリ「showcase」を元に処理を解説する ① クライアントから、エラーの原因となる文字列を含むリクエストが送信 される。 ② Struts上で、文字列→数値に変換する際にエラーが発生し、エラー(例 外)処理を行う。 ③ エラー処理で、変換エラーの原因となった文字列が保持される。 ④ Jsp側からエラーの原因となった文字列が取り出され、レスポンスの一部 としてクライアントへ送信される。 修正版コード: バージョン2.2.3.1で修正 27 この処理のコードに修正が入っている HelloWorld Long型 empId エラー値 HelloWorld .jsp エラー値 HelloWorld HelloWorld エラー empIdは数値です HelloWorld empId= HelloWorld ① ② ③ ④
  • 28. Copyright©2013 JPCERT/CC All rights reserved. 修正版コード: 脆弱バージョンのおさらい 28 public class ConversionErrorInterceptor extends AbstractInterceptor { : public String intercept(ActionInvocation invocation) throws Exception { : HashMap<Object, Object> fakie = null; : Object value = entry.getValue(); : fakie.put(propertyName, getOverrideExpr(invocation, value)); : ConversionErrorInterceptor.java 変数valueには変換エ ラーとなった入力値が代 入される。 “HelloWorld” ③エラー処理で、変換エラーの原因となった文字列が保持される
  • 29. Copyright©2013 JPCERT/CC All rights reserved.29 public class ConversionErrorInterceptor extends AbstractInterceptor { : public String intercept(ActionInvocation invocation) throws Exception { : HashMap<Object, Object> fakie = null; : Object value = entry.getValue(); : fakie.put(propertyName, getOverrideExpr(invocation, value)); : protected Object getOverrideExpr(ActionInvocation invocation, Object value) { return "'" + value + "'"; } 変数valueは getOverrideExpr関数を 介してHashMap変数 fakieに代入される。 getOverrideExprメソッド getOverrideExprメソッドでは第2引数を’(シン グルクオート)で囲って返却する処理を行う “HelloWorld”fakie: ‘HelloWorld’ : 修正版コードではgetOverrideExprメソッドに修正が加えられている。 ConversionErrorInterceptor.java 修正版コード: 脆弱バージョンのおさらい ③エラー処理で、変換エラーの原因となった文字列が保持される
  • 30. Copyright©2013 JPCERT/CC All rights reserved. 修正版コード: getOverrideExprメソッドの修正内容 30 protected Object getOverrideExpr(ActionInvocation invocation, Object value) { return "'" + value + "'"; } getOverrideExprメソッド(修正前) protected Object getOverrideExpr(ActionInvocation invocation, Object value) { return "¥"" + StringEscapeUtils.escapeJava(String.valueOf(value)) + "¥""; } getOverrideExprメソッド(修正後) StringEscapeUtils.escapeJavaメソッドを 使ってエスケープ処理を行っている。 getOverrideExprメソッドでは第2引数を’(シン グルクオート)で囲って返却する処理を行う ③エラー処理で、変換エラーの原因となった文字列が保持される
  • 31. Copyright©2013 JPCERT/CC All rights reserved. 修正版コード: StringEscapeUtils.escapeJavaメソッドによるエスケープ 31 • StringEscapeUtils.escapeJavaメソッドによるエスケープ処理 エスケープ対象文字列 エスケープ処理後の文字列 ¥b ¥¥b ¥n ¥¥n ¥t ¥¥t ¥f ¥¥f ¥r ¥¥r ‘(シングルクオート) ¥’ “(ダブルクオート) ¥” ¥ ¥¥ / ¥/ ■攻撃コードで送信される値がエスケープされると・・・・ '%2B@java.lang.Runtime@getRuntime().exec(“notepad.exe")%2B' ↓ ¥'%2B@java.lang.Runtime@getRuntime().exec(¥“notepad.exe¥")%2B¥' ⇒OGNL式として解釈されない文字列にエスケープされる。
  • 32. Copyright©2013 JPCERT/CC All rights reserved. 修正版コード: エスケープ実施後のOgnlUtil::getValueメソッドの動作 32 : : <s:textfield label="Employee Id" name="currentEmployee.empId"/> : public Object findValue(String expr, Class asType) { : if ((overrides != null) && overrides.containsKey(expr)) { expr = (String) overrides.get(expr); : Object value = OgnlUtil.getValue(expr, context, root, asType); : } OgnlValueStack.java 変数exprはエスケープされて いるため、OGNL式として評 価されてもJavaメソッドは 実行されない ¥'+@java.lang.Runtime@getRuntime().exec(¥“notepad.exe¥")+¥' StringEscapeUtils::escapeJavaメソッドでエスケープされた値を OgnlUtil::getValueメソッドの引数として渡すことで、OGNL式として評 価されてもJavaメソッドは実行されなくなる。 32 Jspファイル(View) /empmanager/editEmployee.jsp
  • 33. Copyright©2013 JPCERT/CC All rights reserved. 補足 今回は数値型への変換エラーの際の処理であったが、そ れ以外のエラー処理にも同様の脆弱性が存在する可能性 がある。 Struts2の脆弱性でありながら、その上で動くJAVAアプ リケーションの仕様によって影響を受けるかどうかが変 わる 33
  • 34. Copyright©2013 JPCERT/CC All rights reserved. まとめ 34 ■この脆弱性から学べるプログラミングの注意点 • SQLクエリやHTMLなど、異なる処理系にデータを出力 する際には、出力先の処理を考慮した無害化が必要 • 無害化を実施しないとSQLインジェクションやクロスサ イトスクリプティング等の脆弱性が発生する • 今回はOGNL式にデータを渡す際に、OGNL式として解 釈されないような無害化処理を実施していなかったため、 脆弱性が発生した ■上記への対策 •データを出力する際には、出力先でデータがどのように 解釈されるかを確認する •出力先でデータが意図しない解釈をされないように適切 な無害化を行う
  • 35. Copyright©2013 JPCERT/CC All rights reserved. 著作権・引用や二次利用について 本資料の著作権はJPCERT/CCに帰属します。 本資料あるいはその一部を引用・転載・再配布する際は、引用元名、資料名および URL の明示をお 願いします。 記載例 引用元:一般社団法人JPCERTコーディネーションセンター Java アプリケーション脆弱性事例解説資料 Apache Strus2 における任意の Java メソッド実行の脆弱性 https://www.jpcert.or.jp/research/materials-java-casestudies/No.2_Apache_Struts2.pdf 本資料を引用・転載・再配布をする際は、引用先文書、時期、内容等の情報を、JPCERT コーディ ネーションセンター広報(office@jpcert.or.jp)までメールにてお知らせください。なお、この連絡に より取得した個人情報は、別途定めるJPCERT コーディネーションセンターの「プライバシーポリ シー」に則って取り扱います。 本資料の利用方法等に関するお問い合わせ JPCERTコーディネーションセンター 広報担当 E-mail:office@jpcert.or.jp 35 本資料の技術的な内容に関するお問い合わせ JPCERTコーディネーションセンター セキュアコーディング担当 E-mail:secure-coding@jpcert.or.jp