SlideShare ist ein Scribd-Unternehmen logo
1 von 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

Weitere ähnliche Inhalte

Ähnlich wie 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
 

Ähnlich wie 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
 

Mehr von 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
 

Mehr von 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回演習
 

Kürzlich hochgeladen

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 

Kürzlich hochgeladen (10)

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 

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