SlideShare a Scribd company logo
1 of 45
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 11:02:04 +09'00'
JBoss Application Server における
ディレクトリトラバーサルの脆弱性
CVE-2006-5750
JVNDB-2006-002376
2
Copyright©2013 JPCERT/CC All rights reserved.
JBossとは
JavaEEのアプリケーションサーバ
JBossの名のもとに40以上のさまざまなプロジェクトが
存在し、 JBoss.orgコミュニティによって開発、運営さ
れている。
3
Webサーバ Webアプリケーション
Copyright©2013 JPCERT/CC All rights reserved.
JBoss Application Serverとは
Javaで記述されたサーバサイドアプリケーションを動作
させるための基盤を提供する。
JBossの様々なソフト群の中核になるソフトであること
から、このソフトを指して単に「JBoss」と呼ぶ場合も
ある。
4
Copyright©2013 JPCERT/CC All rights reserved.
JBoss Application Serverとは
5
JBoss プロジェクト ポートフォリオ
JBoss Application Server 内
に”JBoss”と名の付く複数のコ
ンポーネントが存在している。
※JBoss Application Server 5.0.0
Administration And Development Guideから引用
http://docs.jboss.org/jbossas/docs/Server_Configu
ration_Guide/beta500/html-single/index.html
Copyright©2013 JPCERT/CC All rights reserved.
脆弱性の概要
—JBoss Application Serverには、JMXコンソールという管理
機能が存在する。
—JMXコンソールは、外部からサーバのシャットダウンや
ファイルのアップロードなどの管理機能を提供している。
—その中のファイル操作機能においてディレクトリトラバー
サルの脆弱性が存在する。
6
Copyright©2013 JPCERT/CC All rights reserved.
ディレクトリトラバーサルとは
パスの値を不正に操作されることで、想定外のファイル
やディレクトリに対して操作が行われてしまう攻撃。
ファイル操作(読み出し/変更/削除等)におけるパスの
値を、外部から受け取った入力を元に動的に生成するア
プリケーションで発生する。
7
① http://www.example.com/
?file=../../../../../etc/passwd
② ファイル操作
③ 機密情報
の漏えい
Copyright©2013 JPCERT/CC All rights reserved.
脆弱性が悪用された場合のリスク
8
機密情報の漏えい
•アプリケーションが動作するサーバ上のファイルの内
容が読み出され、機密情報が漏えいする可能性がありま
す。
システムやデータの破壊・改ざん
•アプリケーションが動作するサーバ上のファイルが改
ざん・削除され、アプリケーションの誤動作、停止など
サービス提供に影響が及ぶ可能性があります。
Copyright©2013 JPCERT/CC All rights reserved.
JMXコンソールとは
—JMXコンソールは、サーバの実行状況モニタリングや設定
の変更などを行う機能
—JMXコンソールのファイル操作機能では以下の操作が可能
ファイル作成
ファイル削除
ファイル存在確認
—本来はアプリケーションのプログラムが配置されているパ
ス配下のファイルに対してのみ、上記の操作が可能である。
9
Copyright©2013 JPCERT/CC All rights reserved.
JMXコンソールの悪用
—JMXコンソールから不正なリクエストを送信するだ
けで脆弱性が悪用でき、アプリケーションが稼働す
るサーバ内の任意のファイル作成、削除、存在確認
を行うことが可能となる。
10
jboss
JBoss Application Serverのフォルダ構成
本来ファイル操作が可能な範囲
server
default
deploy
Manage
ment
脆弱性を悪用することで、
サーバ内の任意のパスのファ
イル操作が可能となる!!
Copyright©2013 JPCERT/CC All rights reserved.11
■JMXコンソールを通じてファイル作成/削除/存在確認機能を悪
用することでこんなことが可能!!
•ファイル作成機能/ファイル削除機能
設定ファイルの削除/作成による上書き
⇒セキュリティ設定の変更、ユーザーの追加等
不正なバイナリの配置
⇒ウイルスやバックドアの配置等
サーバ上で稼働するサービスへの攻撃
⇒Webコンテンツの改ざん等
•ファイル存在確認機能
⇒ディレクトリ構造を調べることで、OSバージョンの特定等
JMXコンソールの悪用
Copyright©2013 JPCERT/CC All rights reserved.
JMXコンソールにおけるファイル作成
12
JMXコンソールを利用したファイル作成時の処理フロー
は以下のようになる。
① クライアントからリクエストが送信される
② アプリケーション(Jboss Application Server)がリクエストを受信
し、フォルダ名、ファイル名、拡張子、ファイルデータの情報を
取り出す
③ DeploymentFileRepositoryクラスのstoreメソッドでファイルを作
成する
④ 結果を含むレスポンスがクライアントへ送信される
Copyright©2013 JPCERT/CC All rights reserved.
①クライアントからリクエストが送信される
13
ファイル「./testfolder/testfile.txt」作成リクエストがど
のように処理されるか見てみよう。
JMXコンソール
Copyright©2013 JPCERT/CC All rights reserved.
①クライアントからリクエストが送信される
14
POST /jmx-console/HtmlAdaptor HTTP/1.1
Host: localhost:8080
:
action=invokeOp&name=jboss.admin%3Aservice%3DDeploymentFileRepository&
methodIndex=5&arg0=testfolder&arg1=testfile&arg2=.txt&arg3=testcontent&ar
g4=True
<form action=‘/jmx-console/HtmlAdaptor’ method=‘POST’>
:
<input type=‘hidden’ name=‘arg0’ value=‘testfolder’>
<input type=‘hidden’ name=‘arg1’ value=‘testfile’>
<input type=‘hidden’ name=‘arg2’ value=‘.txt’>
<input type=‘hidden’ name=‘arg3’ value=‘testcontent’>
:
</form>
HTTPリクエスト
上記HTTPリクエストを送信するためのHTML
arg0 : 作成するファイルの上位フォルダ名
arg1 : ファイル名
arg2 : ファイル拡張子
arg3 : ファイルの内容
Copyright©2013 JPCERT/CC All rights reserved.
②アプリケーションがリクエストを受信し、コピー処理を開始
15
ファイル作成はDeploymentFileRepositoryクラスの
storeメソッドで行われる。
public class
DeploymentFileRepository…
public void store(…
DeploymentFileRepository.java
POST /jmx-console/HtmlAdaptor HTTP/1.1
Host: localhost:8080
:
…&arg0=testfolder&arg1=testfile&arg2=.txt&a
rg3=testcontent&arg4=True
HTTPリクエスト
HtmlAdaptorServlet.doPost()
HtmlAdaptorServlet.processRequest()
HtmlAdaptorServlet.invokeOp()
Server.invokeOp()
Server.invokeOpByName()
MBeanServerImpl.invoke()
XMBean(AbstractMBeanInvoker).invoke()
Invocation.invoke()
Invocation.dispatch()
ReflectedDispatcher.invoke()
Method.invoke()
DelegatingMethodAccessorImpl.invoke()
NativeMethodAccessorImpl.invoke()
NativeMethodAccessorImpl.invoke0()
DeploymentFileRepository.store()
経由するメソッド
Copyright©2013 JPCERT/CC All rights reserved.
③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成
16
public class DeploymentFileRepository extends ServiceMBeanSupport
implements DeploymentFileRepositoryMBean
{
:
public void store(String folder, String name, String fileExtension, String data,
boolean noHotDeploy) throws IOException
{
:
DeploymentFileRepository.java
storeメソッドの第1引数(folder)にリクエストのarg0、第2引数(name)に
arg1、第3引数(fileExtension)にはarg2、第4引数(data)にはarg3の値が
渡される。
arg3:”testcontent”arg2:”.txt”
arg1:”testfile”
arg0:”testfolder”
Copyright©2013 JPCERT/CC All rights reserved.17
public class DeploymentFileRepository …{
:
public void store(String folder, String name, String fileExtension,
String data, boolean noHotDeploy) throws IOException
{
log.debug("store called");
File dir = new File(base, folder);
log.debug("respository folder: " + dir.toString());
log.debug("absolute: " + dir.getAbsolutePath());
if (!dir.exists())
{
if (!dir.mkdirs())
{
throw new RuntimeException("Failed to create directory: " +
dir.toString());
}
}
testfolder
③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成
DeploymentFileRepository.java
Copyright©2013 JPCERT/CC All rights reserved.
public class DeploymentFileRepository …{
:
public void store(String folder, String name, String fileExtension,
String data, boolean noHotDeploy) throws IOException
{
log.debug("store called");
File dir = new File(base, folder);
log.debug("respository folder: " + dir.toString());
log.debug("absolute: " + dir.getAbsolutePath());
if (!dir.exists())
{
if (!dir.mkdirs())
{
throw new RuntimeException("Failed to create directory: " +
dir.toString());
}
}
18
引数folderを使用してFileオブジェクトを作成する。
baseはjmxコンソール上で設定されたコンテンツ保存
のディレクトリパスのFileオブジェクトであり、デ
フォルトでは「./deploy/management」となる。
そのため、ここで作成されるFileオブジェクトのパス
は「./deploy/management/testfolder」となる。
testfolder
./deploy/management./deploy/management/testfolder
③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成
DeploymentFileRepository.java
Copyright©2013 JPCERT/CC All rights reserved.19
public class DeploymentFileRepository …{
:
public void store(String folder, String name, String fileExtension,
String data, boolean noHotDeploy) throws IOException
{
log.debug("store called");
File dir = new File(base, folder);
log.debug("respository folder: " + dir.toString());
log.debug("absolute: " + dir.getAbsolutePath());
if (!dir.exists())
{
if (!dir.mkdirs())
{
throw new RuntimeException("Failed to create directory: " +
dir.toString());
}
}
「./deploy/management/testfolder」
が作成される
./deploy/management/testfolder
③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成
DeploymentFileRepository.java
Copyright©2013 JPCERT/CC All rights reserved.20
public class DeploymentFileRepository …{
:
public void store(String folder, String name, String fileExtension,
String data, boolean noHotDeploy) throws IOException
{
:
if (!dir.mkdirs())
:
String filename = name.replace(' ', '_') + fileExtension;
File file = new File(dir, filename);
File tmpfile = new File(dir, filename + ".tmp");
PrintWriter writer = new PrintWriter(new FileOutputStream(tmpfile));
writer.write(data);
writer.close();
:
第2引数と第3引数を使ってfilenameを作成
する。ここでは「testfile.txt」となる。
testfile .txt
③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成
DeploymentFileRepository.java
Copyright©2013 JPCERT/CC All rights reserved.21
public class DeploymentFileRepository …{
:
public void store(String folder, String name, String fileExtension,
String data, boolean noHotDeploy) throws IOException
{
:
if (!dir.mkdirs())
:
String filename = name.replace(' ', '_') + fileExtension;
File file = new File(dir, filename);
File tmpfile = new File(dir, filename + ".tmp");
PrintWriter writer = new PrintWriter(new FileOutputStream(tmpfile));
writer.write(data);
writer.close();
:
Fileオブジェクト
「 ./deploy/management/testfolder /testfile.txt」
を作成。
./deploy/management/testfolder
./deploy/management/testfolder/testfile.txt
testfile.txt
③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成
DeploymentFileRepository.java
Copyright©2013 JPCERT/CC All rights reserved.22
public class DeploymentFileRepository …{
:
public void store(String folder, String name, String fileExtension,
String data, boolean noHotDeploy) throws IOException
{
:
if (!dir.mkdirs())
:
String filename = name.replace(' ', '_') + fileExtension;
File file = new File(dir, filename);
File tmpfile = new File(dir, filename + ".tmp");
PrintWriter writer = new PrintWriter(new FileOutputStream(tmpfile));
writer.write(data);
writer.close();
:
一時ファイル用のFileオブジェクト
「 ./deploy/management/testfolder /testfile.txt .tmp」
を作成する。
./deploy/management/testfolder
./deploy/management/testfolder /testfile.txt.tmp
testfile.txt
③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成
DeploymentFileRepository.java
Copyright©2013 JPCERT/CC All rights reserved.23
public class DeploymentFileRepository …{
:
public void store(String folder, String name, String fileExtension,
String data, boolean noHotDeploy) throws IOException
{
:
if (!dir.mkdirs())
:
String filename = name.replace(' ', '_') + fileExtension;
File file = new File(dir, filename);
File tmpfile = new File(dir, filename + ".tmp");
PrintWriter writer = new PrintWriter(new FileOutputStream(tmpfile));
writer.write(data);
writer.close();
:
一時ファイル
「 ./deploy/management/testfolder /testfile.txt .tmp」
に第4引数dataの値を書きこむ。
testcontent
./deploy/management/testfolder /testfile.txt.tmp
③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成
DeploymentFileRepository.java
Copyright©2013 JPCERT/CC All rights reserved.24
public class DeploymentFileRepository …{
:
public void store(String folder, String name, String fileExtension,
String data, boolean noHotDeploy) throws IOException
{
:
File file = new File(dir, filename);
File tmpfile = new File(dir, filename + ".tmp");
PrintWriter writer = new PrintWriter(new FileOutputStream(tmpfile));
writer.write(data);
writer.close();
if (file.exists() && noHotDeploy)
{
:
file.delete();
}
if (!tmpfile.renameTo(file))
{
Fileオブジェクト
「 ./deploy/management/testfolder /testfile.txt 」
「 ./deploy/management/testfolder /testfile.txt 」
が既に存在していたら削除する。
③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成
DeploymentFileRepository.java
Copyright©2013 JPCERT/CC All rights reserved.25
public class DeploymentFileRepository …{
:
public void store(String folder, String name, String fileExtension,
String data, boolean noHotDeploy) throws IOException
{
:
File file = new File(dir, filename);
File tmpfile = new File(dir, filename + ".tmp");
PrintWriter writer = new PrintWriter(new FileOutputStream(tmpfile));
writer.write(data);
writer.close();
if (file.exists() && noHotDeploy)
{
:
file.delete();
}
if (!tmpfile.renameTo(file))
{
Fileオブジェクト
「 ./deploy/management/testfolder/testfile.txt.tmp」
一時ファイル
「 ./deploy/management/testfolder /testfile.txt.tmp」を
「 ./deploy/management/testfolder /testfile.txt 」に
変更して処理が完了。
Fileオブジェクト
「 ./deploy/management/testfolder /testfile.txt 」
③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成
DeploymentFileRepository.java
Copyright©2013 JPCERT/CC All rights reserved.
④結果を含むレスポンスがクライアントへ送信される。
26
ファイル作成処理が終了し、結果をレスポンスとしてクライアント
へ送信する。
Success!!
Copyright©2013 JPCERT/CC All rights reserved.
攻撃コード
27
■攻撃コードのポイント
パラメータarg0の値として上位ディレクトリを示す値を含んだ
「..¥..¥..¥..¥testfolder」が指定されている。
POST /jmx-console/HtmlAdaptor HTTP/1.1
Host: localhost:8080
:
action=invokeOp&name=jboss.admin%3Aservice%3DDeploymentFileRepository&methodInd
ex=5&arg0=..¥..¥..¥..¥testfolder&arg1=testfile&arg2=.txt&arg3=testcontent&arg4=True
HTTPリクエスト
arg0 : 作成するファイルの上位フォルダ名
arg1 : ファイル名
arg2 : ファイル拡張子
arg3 : ファイルの内容
Copyright©2013 JPCERT/CC All rights reserved.
攻撃コード
28
<form action=‘/jmx-console/HtmlAdaptor’ method=‘POST’>
:
<input type=‘hidden’ name=‘arg0’ value=‘..¥..¥..¥..¥testfolder’>
<input type=‘hidden’ name=‘arg1’ value=‘testfile’>
<input type=‘hidden’ name=‘arg2’ value=‘.txt’>
<input type=‘hidden’ name=‘arg3’ value=‘testcontent’>
:
</form>
攻撃コードのHTTPリクエストを送信するためのHTML
arg0 : 作成するファイルの上位フォルダ名
arg1 : ファイル名
arg2 : ファイル拡張子
arg3 : ファイルの内容
Copyright©2013 JPCERT/CC All rights reserved.
攻撃コードが実行された際の処理
29
攻撃コードが実行された際に、③の処理でディレ
クトリトラバーサル攻撃が成立する。
JMXコンソールでのファイル作成時の処理フロー
① クライアントからリクエストが送信される
② アプリケーション(Jboss Application Server)がリクエストを受信
し、フォルダ名、ファイル名、拡張子、ファイルデータの情報を
取り出す
③ DeploymentFileRepositoryクラスのstoreメソッドでファイルを作
成する
④ 結果を含むレスポンスがクライアントへ送信される
Copyright©2013 JPCERT/CC All rights reserved.30
public class DeploymentFileRepository extends ServiceMBeanSupport
implements DeploymentFileRepositoryMBean
{
:
public void store(String folder, String name, String fileExtension, String data,
boolean noHotDeploy) throws IOException
{
:
storeメソッドの第1引数(folder)にリクエストのarg0、第2引数(name)
にarg1、第3引数(fileExtension)にはarg2、第4引数(data)にはarg3の値
が渡される。
arg3:”testcontent”arg2:”.txt”
arg1:”testfile”
攻撃コード実行時
③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成
arg0:”..¥..¥..¥..¥testfolder”
DeploymentFileRepository.java
Copyright©2013 JPCERT/CC All rights reserved.31
public class DeploymentFileRepository …{
:
public void store(String folder, String name, String fileExtension,
String data, boolean noHotDeploy) throws IOException
{
log.debug("store called");
File dir = new File(base, folder);
log.debug("respository folder: " + dir.toString());
log.debug("absolute: " + dir.getAbsolutePath());
if (!dir.exists())
{
if (!dir.mkdirs())
{
throw new RuntimeException("Failed to create directory: " +
dir.toString());
}
}
..¥..¥..¥..¥testfolder
攻撃コード実行時
③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成
DeploymentFileRepository.java
Copyright©2013 JPCERT/CC All rights reserved.
public class DeploymentFileRepository …{
:
public void store(String folder, String name, String fileExtension,
String data, boolean noHotDeploy) throws IOException
{
log.debug("store called");
File dir = new File(base, folder);
log.debug("respository folder: " + dir.toString());
log.debug("absolute: " + dir.getAbsolutePath());
if (!dir.exists())
{
if (!dir.mkdirs())
{
throw new RuntimeException("Failed to create directory: " +
dir.toString());
}
}
引数folderを使用して作成したFileオブジェクトは
「 ./deploy/management/../../../../testfolder」
となる。
これはフォルダdeployの2階層上に位置する
「testfolder」フォルダを意味する。
32
攻撃コード実行時
③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成
DeploymentFileRepository.java
..¥..¥..¥..¥testfolder
./deploy/management
Copyright©2013 JPCERT/CC All rights reserved.33
public class DeploymentFileRepository …{
:
public void store(String folder, String name, String fileExtension,
String data, boolean noHotDeploy) throws IOException
{
log.debug("store called");
File dir = new File(base, folder);
log.debug("respository folder: " + dir.toString());
log.debug("absolute: " + dir.getAbsolutePath());
if (!dir.exists())
{
if (!dir.mkdirs())
{
throw new RuntimeException("Failed to create directory: " +
dir.toString());
}
}
「 ./deploy/management/../../../../testfolder」
というFileオブジェクト
「 ./deploy/management/../../../../testfolder」
が作成されてしまう。
攻撃コード実行時
③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成
DeploymentFileRepository.java
Copyright©2013 JPCERT/CC All rights reserved.34
その後は正常処理と同様の処理が実行され、下記の場所にファイルが作成され
てしまう。本来は ./deploy/management 配下にフォルダ、ファイルが作成さ
れるはずが、攻撃コードでパスを操作することで任意のパスにファイルを作成
することが可能となる。
jboss
server
default
deploy
Manage
ment
JBoss Application Serverのフォルダ構成
本来フォルダやファイルが作成されるパス
(./deploy/management 配下)
testfolder
testfolder
攻撃コードによってファイルが作成されるパス
(./deploy/management/../../../../testfolder)
攻撃コード実行時
③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成
Copyright©2013 JPCERT/CC All rights reserved.35
1.ファイル削除(removeメソッド)
public void remove(String folder, String name, String fileExtension)
{
File dir = new File(base, folder);
String filename = name.replace(' ', '_') + fileExtension;
File file = new File(dir, filename);
file.delete();
}
public boolean isStored(String folder, String name, String fileExtension)
{
File dir = new File(base, folder);
String filename = name.replace(' ', '_') + fileExtension;
File file = new File(dir, filename);
return file.exists();
}
JMXコンソールにはファイル作成以外にも、次の3つの機能に同様の脆弱性
が存在する。
2.ファイル存在確認(isStoredメソッド)
Copyright©2013 JPCERT/CC All rights reserved.36
3.ファイル保存パス設定(setBaseDirメソッド)
public void setBaseDir(String baseDir)
{
this.baseDir = baseDir;
this.base = new File(serverHome, baseDir);
}
Copyright©2013 JPCERT/CC All rights reserved.
問題点
 今回のアプリケーションにおける具体的な問題点
引数として渡されたパスの値を検証せずに処理を行って
いた。
以下のコーディングガイドに違反している
「 MET00-J. メソッドの引数を検証する」
「 IDS02-J. パス名は検証する前に正規化する」
37
Copyright©2013 JPCERT/CC All rights reserved.
問題点
 問題点に対してどうすべきだったか。
・引数の値を使って構成したパスが、想定しているディ
レクトリの下にあることを検証した上で、ファイルを作
成すべきであった。
・パスの検証のためには、パスの正規化処理が必要。
38
Copyright©2013 JPCERT/CC All rights reserved.
修正版コード
39
③の処理を行うコードが修正されている。
脆弱性はバージョン4.2.0で修正されている。
JMXコンソールでのファイル作成時の処理フロー
① クライアントからリクエストが送信される
② アプリケーション(Jboss Application Server)がリクエストを受信
し、フォルダ名、ファイル名、拡張子、ファイルデータの情報を
取り出す
③ DeploymentFileRepositoryクラスのstoreメソッドでファイルを作
成する
④ 結果を含むレスポンスがクライアントへ送信される
Copyright©2013 JPCERT/CC All rights reserved.
修正前/修正後の処理比較
③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成
40
public class DeploymentFileRepository …{
:
public void store(String folder, String name, String fileExtension, String data, boolean
noHotDeploy) throws IOException
{
log.debug("store called");
File dir = new File(base, folder);
log.debug("respository folder: " + dir.toString());
:
DeploymentFileRepository.java (修正前)
public class DeploymentFileRepository …{
:
public void store(String folder, String name, String fileExtension, String data, boolean
noHotDeploy) throws IOException
{
log.debug("store called");
File dir = getFile(base, folder);
log.debug("respository folder: " + dir.toString());
:
DeploymentFileRepository.java (修正後)
getFileメソッドを使用するよ
うにコードが変更されている。
Copyright©2013 JPCERT/CC All rights reserved.41
private File getFile(File parent, String child) throws IOException
{
File childFile = new File(parent, child);
if (childFile.getCanonicalPath().indexOf(parent.getCanonicalPath()) != 0)
throw new IllegalArgumentException(
"child '" + child + "' should be a child of parent '" + parent + "'“
);
return childFile;
}
getFileメソッド
getCanonicalPathメソッドで正規化をした後に、
indexOfメソッドを使用して parentがchildFileの
一部に含まれているか検証している。
新規作成するフォルダの
Fileオブジェクトを作成
./deploy/management storeメソッドの第1引数
(フォルダ名)
修正前/修正後の処理比較
③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成
※ getCanonicalPath関数を使用すると
「/parent/child1/child2/../../child0」→「 /parent/child0 」
というように正規化される。
Copyright©2013 JPCERT/CC All rights reserved.42
■修正版コードが攻撃を受けるとどうなるか
getFileメソッド内でgetCanonicalPathメソッドにより
parent :
「./deploy/management」→
「/jboss/server/default/deploy/management」
childFile :
「 ./deploy/management/../../../../testfolder」→
「 /jboss/server/testfolder」
と正規化される。
パスを検証するコードが、childFileのパスにparentが含まれていない
ことを検知し、エラーとして処理する。
修正前/修正後の処理比較
③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成
Copyright©2013 JPCERT/CC All rights reserved.
その他の修正
下記のメソッドも getFile メソッドを利用したパスの正
規化と検証を行うように修正されている。
—ファイル削除(removeメソッド)
—ファイル存在確認(isStoredメソッド)
—ファイル保存パス設定(setBaseDirメソッド)
43
Copyright©2013 JPCERT/CC All rights reserved.
まとめ
44
■この脆弱性から学べるプログラミングの注意点
• アプリケーションの処理内容や扱うデータ構造に応じて、
引数が適切な値であることを検証すべき。
•今回のケースでは、ファイル/ディレクトリ操作で扱うパス名
を細工されることで、ディレクトリトラバーサルの脆弱性につ
ながった。
■上記への対策
• 引数のパス名を正規化してから(IDS02-J)、想定した範
囲に収まっていることを確認する。
Copyright©2013 JPCERT/CC All rights reserved.
著作権・引用や二次利用について
本資料の著作権はJPCERT/CCに帰属します。
本資料あるいはその一部を引用・転載・再配布する際は、引用元名、資料名および URL の明示をお
願いします。
記載例
引用元:一般社団法人JPCERTコーディネーションセンター
Java アプリケーション脆弱性事例解説資料
Jboss Application Server におけるディレクトリトラバーサルの脆弱性
https://www.jpcert.or.jp/research/materials-java-casestudies/No.5_JBoss.pdf
本資料を引用・転載・再配布をする際は、引用先文書、時期、内容等の情報を、JPCERT コーディ
ネーションセンター広報(office@jpcert.or.jp)までメールにてお知らせください。なお、この連絡に
より取得した個人情報は、別途定めるJPCERT コーディネーションセンターの「プライバシーポリ
シー」に則って取り扱います。
本資料の利用方法等に関するお問い合わせ
JPCERTコーディネーションセンター
広報担当
E-mail:office@jpcert.or.jp
45
本資料の技術的な内容に関するお問い合わせ
JPCERTコーディネーションセンター
セキュアコーディング担当
E-mail:secure-coding@jpcert.or.jp

More Related Content

What's hot

Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性JPCERT Coordination Center
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)JPCERT Coordination Center
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)JPCERT Coordination Center
 
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」JPCERT Coordination Center
 
Lt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdiLt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdiNorito Agetsuma
 
Advanced database monitoring in modern java
Advanced database monitoring in modern javaAdvanced database monitoring in modern java
Advanced database monitoring in modern javaChihiro Ito
 
Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!Shinpei Ohtani
 
クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策JPCERT Coordination Center
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPAkawaba
 
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4cCDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4cNorito Agetsuma
 
Nashorn in the future (Japanese)
Nashorn in the future (Japanese)Nashorn in the future (Japanese)
Nashorn in the future (Japanese)Logico
 
Java EE パフォーマンスTips #glassfish_jp
Java EE パフォーマンスTips #glassfish_jpJava EE パフォーマンスTips #glassfish_jp
Java EE パフォーマンスTips #glassfish_jpNorito Agetsuma
 
Spring fest2020 spring-security
Spring fest2020 spring-securitySpring fest2020 spring-security
Spring fest2020 spring-security土岐 孝平
 
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」Hiroyuki Ohnaka
 
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決オラクルエンジニア通信
 

What's hot (17)

Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
 
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
 
Lt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdiLt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdi
 
Advanced database monitoring in modern java
Advanced database monitoring in modern javaAdvanced database monitoring in modern java
Advanced database monitoring in modern java
 
Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!
 
Cndt2021 casareal
Cndt2021 casarealCndt2021 casareal
Cndt2021 casareal
 
クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策
 
Java EE8 Report
Java EE8 ReportJava EE8 Report
Java EE8 Report
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPA
 
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4cCDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
 
Nashorn in the future (Japanese)
Nashorn in the future (Japanese)Nashorn in the future (Japanese)
Nashorn in the future (Japanese)
 
Java EE パフォーマンスTips #glassfish_jp
Java EE パフォーマンスTips #glassfish_jpJava EE パフォーマンスTips #glassfish_jp
Java EE パフォーマンスTips #glassfish_jp
 
Spring fest2020 spring-security
Spring fest2020 spring-securitySpring fest2020 spring-security
Spring fest2020 spring-security
 
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
 
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
 

Viewers also liked

OWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCONOWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCONJun Matsumoto
 
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
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)JPCERT Coordination Center
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性JPCERT Coordination Center
 
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性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
 
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)JPCERT Coordination Center
 
自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたこと自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたことSuzuki Masayuki
 
Devsumi2015_20E1 エンジニアが知っておきたいお金の話
Devsumi2015_20E1 エンジニアが知っておきたいお金の話Devsumi2015_20E1 エンジニアが知っておきたいお金の話
Devsumi2015_20E1 エンジニアが知っておきたいお金の話Akio Doi
 
とある診断員と色々厄介な脆弱性達
とある診断員と色々厄介な脆弱性達とある診断員と色々厄介な脆弱性達
とある診断員と色々厄介な脆弱性達zaki4649
 
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hackツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hackteapipin
 
世界一簡単なGithub入門(githubは無料で使用する場合、全てのファイルが公開されていることにご注意ください)
世界一簡単なGithub入門(githubは無料で使用する場合、全てのファイルが公開されていることにご注意ください)世界一簡単なGithub入門(githubは無料で使用する場合、全てのファイルが公開されていることにご注意ください)
世界一簡単なGithub入門(githubは無料で使用する場合、全てのファイルが公開されていることにご注意ください)Shinichi Hirauchi
 
OWASP Testing Guide からはじめよう - セキュリティ診断技術の共有、そして横展開
OWASP Testing Guide からはじめよう - セキュリティ診断技術の共有、そして横展開OWASP Testing Guide からはじめよう - セキュリティ診断技術の共有、そして横展開
OWASP Testing Guide からはじめよう - セキュリティ診断技術の共有、そして横展開Muneaki Nishimura
 
フーリエ変換と画像圧縮の仕組み
フーリエ変換と画像圧縮の仕組みフーリエ変換と画像圧縮の仕組み
フーリエ変換と画像圧縮の仕組みyuichi takeda
 

Viewers also liked (16)

OWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCONOWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCON
 
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
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
 
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性
 
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
 
脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる
 
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
 
自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたこと自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたこと
 
Devsumi2015_20E1 エンジニアが知っておきたいお金の話
Devsumi2015_20E1 エンジニアが知っておきたいお金の話Devsumi2015_20E1 エンジニアが知っておきたいお金の話
Devsumi2015_20E1 エンジニアが知っておきたいお金の話
 
とある診断員と色々厄介な脆弱性達
とある診断員と色々厄介な脆弱性達とある診断員と色々厄介な脆弱性達
とある診断員と色々厄介な脆弱性達
 
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hackツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack
 
世界一簡単なGithub入門(githubは無料で使用する場合、全てのファイルが公開されていることにご注意ください)
世界一簡単なGithub入門(githubは無料で使用する場合、全てのファイルが公開されていることにご注意ください)世界一簡単なGithub入門(githubは無料で使用する場合、全てのファイルが公開されていることにご注意ください)
世界一簡単なGithub入門(githubは無料で使用する場合、全てのファイルが公開されていることにご注意ください)
 
OWASP Testing Guide からはじめよう - セキュリティ診断技術の共有、そして横展開
OWASP Testing Guide からはじめよう - セキュリティ診断技術の共有、そして横展開OWASP Testing Guide からはじめよう - セキュリティ診断技術の共有、そして横展開
OWASP Testing Guide からはじめよう - セキュリティ診断技術の共有、そして横展開
 
Android Secure Coding
Android Secure CodingAndroid Secure Coding
Android Secure Coding
 
フーリエ変換と画像圧縮の仕組み
フーリエ変換と画像圧縮の仕組みフーリエ変換と画像圧縮の仕組み
フーリエ変換と画像圧縮の仕組み
 

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

Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方linzhixing
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireAkio Katayama
 
第12回 つ部 ミーティング兼忘年会 LT資料
第12回 つ部 ミーティング兼忘年会 LT資料第12回 つ部 ミーティング兼忘年会 LT資料
第12回 つ部 ミーティング兼忘年会 LT資料Kenji Nagase
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/AndroidセキュアコーディングMasaki Kubo
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaYuta Kawadai
 
Tech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LTTech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LTterurou
 
[D13] Disaster Recovery環境をOracle Standard Editionでつくる by Miyuki Ohasi
[D13] Disaster Recovery環境をOracle Standard Editionでつくる by Miyuki Ohasi[D13] Disaster Recovery環境をOracle Standard Editionでつくる by Miyuki Ohasi
[D13] Disaster Recovery環境をOracle Standard Editionでつくる by Miyuki OhasiInsight Technology, Inc.
 
Alfrescoのバックアップとレストア
AlfrescoのバックアップとレストアAlfrescoのバックアップとレストア
AlfrescoのバックアップとレストアAshitaba YOSHIOKA
 
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスドMicrosoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスドKazumi Hirose
 
ownCloud2015年まとめ
ownCloud2015年まとめownCloud2015年まとめ
ownCloud2015年まとめTetsurou Yano
 
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-PE-BANK
 
ownCloud2015年まとめ
ownCloud2015年まとめownCloud2015年まとめ
ownCloud2015年まとめTetsurou Yano
 
商用ミドルウェアのPuppet化で気を付けたい5つのこと
商用ミドルウェアのPuppet化で気を付けたい5つのこと商用ミドルウェアのPuppet化で気を付けたい5つのこと
商用ミドルウェアのPuppet化で気を付けたい5つのことNTT DATA OSS Professional Services
 
TestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストYoichiro Sakurai
 
[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見Yosuke HASEGAWA
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_GebNobuhiro Sue
 

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

Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
 
第12回 つ部 ミーティング兼忘年会 LT資料
第12回 つ部 ミーティング兼忘年会 LT資料第12回 つ部 ミーティング兼忘年会 LT資料
第12回 つ部 ミーティング兼忘年会 LT資料
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/Androidセキュアコーディング
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
 
Tech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LTTech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LT
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 
[D13] Disaster Recovery環境をOracle Standard Editionでつくる by Miyuki Ohasi
[D13] Disaster Recovery環境をOracle Standard Editionでつくる by Miyuki Ohasi[D13] Disaster Recovery環境をOracle Standard Editionでつくる by Miyuki Ohasi
[D13] Disaster Recovery環境をOracle Standard Editionでつくる by Miyuki Ohasi
 
Alfrescoのバックアップとレストア
AlfrescoのバックアップとレストアAlfrescoのバックアップとレストア
Alfrescoのバックアップとレストア
 
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスドMicrosoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
 
ownCloud2015年まとめ
ownCloud2015年まとめownCloud2015年まとめ
ownCloud2015年まとめ
 
Hello Java
Hello JavaHello Java
Hello Java
 
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
 
ownCloud2015年まとめ
ownCloud2015年まとめownCloud2015年まとめ
ownCloud2015年まとめ
 
商用ミドルウェアのPuppet化で気を付けたい5つのこと
商用ミドルウェアのPuppet化で気を付けたい5つのこと商用ミドルウェアのPuppet化で気を付けたい5つのこと
商用ミドルウェアのPuppet化で気を付けたい5つのこと
 
Gradle handson
Gradle handsonGradle handson
Gradle handson
 
TestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテスト
 
[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見
 
Java in the World of Container by David Buck
Java in the World of Container by David BuckJava in the World of Container by David Buck
Java in the World of Container by David Buck
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_Geb
 

More from 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
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデル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
 

More from JPCERT Coordination Center (9)

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

Recently uploaded

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
 
論文紹介: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
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
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
 
論文紹介: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
 
論文紹介: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
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
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
 

Recently uploaded (9)

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」の紹介
 
論文紹介: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...
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
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
 
論文紹介: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
 
論文紹介: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
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
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
 

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

  • 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 11:02:04 +09'00'
  • 2. JBoss Application Server における ディレクトリトラバーサルの脆弱性 CVE-2006-5750 JVNDB-2006-002376 2
  • 3. Copyright©2013 JPCERT/CC All rights reserved. JBossとは JavaEEのアプリケーションサーバ JBossの名のもとに40以上のさまざまなプロジェクトが 存在し、 JBoss.orgコミュニティによって開発、運営さ れている。 3 Webサーバ Webアプリケーション
  • 4. Copyright©2013 JPCERT/CC All rights reserved. JBoss Application Serverとは Javaで記述されたサーバサイドアプリケーションを動作 させるための基盤を提供する。 JBossの様々なソフト群の中核になるソフトであること から、このソフトを指して単に「JBoss」と呼ぶ場合も ある。 4
  • 5. Copyright©2013 JPCERT/CC All rights reserved. JBoss Application Serverとは 5 JBoss プロジェクト ポートフォリオ JBoss Application Server 内 に”JBoss”と名の付く複数のコ ンポーネントが存在している。 ※JBoss Application Server 5.0.0 Administration And Development Guideから引用 http://docs.jboss.org/jbossas/docs/Server_Configu ration_Guide/beta500/html-single/index.html
  • 6. Copyright©2013 JPCERT/CC All rights reserved. 脆弱性の概要 —JBoss Application Serverには、JMXコンソールという管理 機能が存在する。 —JMXコンソールは、外部からサーバのシャットダウンや ファイルのアップロードなどの管理機能を提供している。 —その中のファイル操作機能においてディレクトリトラバー サルの脆弱性が存在する。 6
  • 7. Copyright©2013 JPCERT/CC All rights reserved. ディレクトリトラバーサルとは パスの値を不正に操作されることで、想定外のファイル やディレクトリに対して操作が行われてしまう攻撃。 ファイル操作(読み出し/変更/削除等)におけるパスの 値を、外部から受け取った入力を元に動的に生成するア プリケーションで発生する。 7 ① http://www.example.com/ ?file=../../../../../etc/passwd ② ファイル操作 ③ 機密情報 の漏えい
  • 8. Copyright©2013 JPCERT/CC All rights reserved. 脆弱性が悪用された場合のリスク 8 機密情報の漏えい •アプリケーションが動作するサーバ上のファイルの内 容が読み出され、機密情報が漏えいする可能性がありま す。 システムやデータの破壊・改ざん •アプリケーションが動作するサーバ上のファイルが改 ざん・削除され、アプリケーションの誤動作、停止など サービス提供に影響が及ぶ可能性があります。
  • 9. Copyright©2013 JPCERT/CC All rights reserved. JMXコンソールとは —JMXコンソールは、サーバの実行状況モニタリングや設定 の変更などを行う機能 —JMXコンソールのファイル操作機能では以下の操作が可能 ファイル作成 ファイル削除 ファイル存在確認 —本来はアプリケーションのプログラムが配置されているパ ス配下のファイルに対してのみ、上記の操作が可能である。 9
  • 10. Copyright©2013 JPCERT/CC All rights reserved. JMXコンソールの悪用 —JMXコンソールから不正なリクエストを送信するだ けで脆弱性が悪用でき、アプリケーションが稼働す るサーバ内の任意のファイル作成、削除、存在確認 を行うことが可能となる。 10 jboss JBoss Application Serverのフォルダ構成 本来ファイル操作が可能な範囲 server default deploy Manage ment 脆弱性を悪用することで、 サーバ内の任意のパスのファ イル操作が可能となる!!
  • 11. Copyright©2013 JPCERT/CC All rights reserved.11 ■JMXコンソールを通じてファイル作成/削除/存在確認機能を悪 用することでこんなことが可能!! •ファイル作成機能/ファイル削除機能 設定ファイルの削除/作成による上書き ⇒セキュリティ設定の変更、ユーザーの追加等 不正なバイナリの配置 ⇒ウイルスやバックドアの配置等 サーバ上で稼働するサービスへの攻撃 ⇒Webコンテンツの改ざん等 •ファイル存在確認機能 ⇒ディレクトリ構造を調べることで、OSバージョンの特定等 JMXコンソールの悪用
  • 12. Copyright©2013 JPCERT/CC All rights reserved. JMXコンソールにおけるファイル作成 12 JMXコンソールを利用したファイル作成時の処理フロー は以下のようになる。 ① クライアントからリクエストが送信される ② アプリケーション(Jboss Application Server)がリクエストを受信 し、フォルダ名、ファイル名、拡張子、ファイルデータの情報を 取り出す ③ DeploymentFileRepositoryクラスのstoreメソッドでファイルを作 成する ④ 結果を含むレスポンスがクライアントへ送信される
  • 13. Copyright©2013 JPCERT/CC All rights reserved. ①クライアントからリクエストが送信される 13 ファイル「./testfolder/testfile.txt」作成リクエストがど のように処理されるか見てみよう。 JMXコンソール
  • 14. Copyright©2013 JPCERT/CC All rights reserved. ①クライアントからリクエストが送信される 14 POST /jmx-console/HtmlAdaptor HTTP/1.1 Host: localhost:8080 : action=invokeOp&name=jboss.admin%3Aservice%3DDeploymentFileRepository& methodIndex=5&arg0=testfolder&arg1=testfile&arg2=.txt&arg3=testcontent&ar g4=True <form action=‘/jmx-console/HtmlAdaptor’ method=‘POST’> : <input type=‘hidden’ name=‘arg0’ value=‘testfolder’> <input type=‘hidden’ name=‘arg1’ value=‘testfile’> <input type=‘hidden’ name=‘arg2’ value=‘.txt’> <input type=‘hidden’ name=‘arg3’ value=‘testcontent’> : </form> HTTPリクエスト 上記HTTPリクエストを送信するためのHTML arg0 : 作成するファイルの上位フォルダ名 arg1 : ファイル名 arg2 : ファイル拡張子 arg3 : ファイルの内容
  • 15. Copyright©2013 JPCERT/CC All rights reserved. ②アプリケーションがリクエストを受信し、コピー処理を開始 15 ファイル作成はDeploymentFileRepositoryクラスの storeメソッドで行われる。 public class DeploymentFileRepository… public void store(… DeploymentFileRepository.java POST /jmx-console/HtmlAdaptor HTTP/1.1 Host: localhost:8080 : …&arg0=testfolder&arg1=testfile&arg2=.txt&a rg3=testcontent&arg4=True HTTPリクエスト HtmlAdaptorServlet.doPost() HtmlAdaptorServlet.processRequest() HtmlAdaptorServlet.invokeOp() Server.invokeOp() Server.invokeOpByName() MBeanServerImpl.invoke() XMBean(AbstractMBeanInvoker).invoke() Invocation.invoke() Invocation.dispatch() ReflectedDispatcher.invoke() Method.invoke() DelegatingMethodAccessorImpl.invoke() NativeMethodAccessorImpl.invoke() NativeMethodAccessorImpl.invoke0() DeploymentFileRepository.store() 経由するメソッド
  • 16. Copyright©2013 JPCERT/CC All rights reserved. ③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成 16 public class DeploymentFileRepository extends ServiceMBeanSupport implements DeploymentFileRepositoryMBean { : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { : DeploymentFileRepository.java storeメソッドの第1引数(folder)にリクエストのarg0、第2引数(name)に arg1、第3引数(fileExtension)にはarg2、第4引数(data)にはarg3の値が 渡される。 arg3:”testcontent”arg2:”.txt” arg1:”testfile” arg0:”testfolder”
  • 17. Copyright©2013 JPCERT/CC All rights reserved.17 public class DeploymentFileRepository …{ : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { log.debug("store called"); File dir = new File(base, folder); log.debug("respository folder: " + dir.toString()); log.debug("absolute: " + dir.getAbsolutePath()); if (!dir.exists()) { if (!dir.mkdirs()) { throw new RuntimeException("Failed to create directory: " + dir.toString()); } } testfolder ③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成 DeploymentFileRepository.java
  • 18. Copyright©2013 JPCERT/CC All rights reserved. public class DeploymentFileRepository …{ : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { log.debug("store called"); File dir = new File(base, folder); log.debug("respository folder: " + dir.toString()); log.debug("absolute: " + dir.getAbsolutePath()); if (!dir.exists()) { if (!dir.mkdirs()) { throw new RuntimeException("Failed to create directory: " + dir.toString()); } } 18 引数folderを使用してFileオブジェクトを作成する。 baseはjmxコンソール上で設定されたコンテンツ保存 のディレクトリパスのFileオブジェクトであり、デ フォルトでは「./deploy/management」となる。 そのため、ここで作成されるFileオブジェクトのパス は「./deploy/management/testfolder」となる。 testfolder ./deploy/management./deploy/management/testfolder ③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成 DeploymentFileRepository.java
  • 19. Copyright©2013 JPCERT/CC All rights reserved.19 public class DeploymentFileRepository …{ : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { log.debug("store called"); File dir = new File(base, folder); log.debug("respository folder: " + dir.toString()); log.debug("absolute: " + dir.getAbsolutePath()); if (!dir.exists()) { if (!dir.mkdirs()) { throw new RuntimeException("Failed to create directory: " + dir.toString()); } } 「./deploy/management/testfolder」 が作成される ./deploy/management/testfolder ③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成 DeploymentFileRepository.java
  • 20. Copyright©2013 JPCERT/CC All rights reserved.20 public class DeploymentFileRepository …{ : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { : if (!dir.mkdirs()) : String filename = name.replace(' ', '_') + fileExtension; File file = new File(dir, filename); File tmpfile = new File(dir, filename + ".tmp"); PrintWriter writer = new PrintWriter(new FileOutputStream(tmpfile)); writer.write(data); writer.close(); : 第2引数と第3引数を使ってfilenameを作成 する。ここでは「testfile.txt」となる。 testfile .txt ③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成 DeploymentFileRepository.java
  • 21. Copyright©2013 JPCERT/CC All rights reserved.21 public class DeploymentFileRepository …{ : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { : if (!dir.mkdirs()) : String filename = name.replace(' ', '_') + fileExtension; File file = new File(dir, filename); File tmpfile = new File(dir, filename + ".tmp"); PrintWriter writer = new PrintWriter(new FileOutputStream(tmpfile)); writer.write(data); writer.close(); : Fileオブジェクト 「 ./deploy/management/testfolder /testfile.txt」 を作成。 ./deploy/management/testfolder ./deploy/management/testfolder/testfile.txt testfile.txt ③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成 DeploymentFileRepository.java
  • 22. Copyright©2013 JPCERT/CC All rights reserved.22 public class DeploymentFileRepository …{ : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { : if (!dir.mkdirs()) : String filename = name.replace(' ', '_') + fileExtension; File file = new File(dir, filename); File tmpfile = new File(dir, filename + ".tmp"); PrintWriter writer = new PrintWriter(new FileOutputStream(tmpfile)); writer.write(data); writer.close(); : 一時ファイル用のFileオブジェクト 「 ./deploy/management/testfolder /testfile.txt .tmp」 を作成する。 ./deploy/management/testfolder ./deploy/management/testfolder /testfile.txt.tmp testfile.txt ③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成 DeploymentFileRepository.java
  • 23. Copyright©2013 JPCERT/CC All rights reserved.23 public class DeploymentFileRepository …{ : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { : if (!dir.mkdirs()) : String filename = name.replace(' ', '_') + fileExtension; File file = new File(dir, filename); File tmpfile = new File(dir, filename + ".tmp"); PrintWriter writer = new PrintWriter(new FileOutputStream(tmpfile)); writer.write(data); writer.close(); : 一時ファイル 「 ./deploy/management/testfolder /testfile.txt .tmp」 に第4引数dataの値を書きこむ。 testcontent ./deploy/management/testfolder /testfile.txt.tmp ③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成 DeploymentFileRepository.java
  • 24. Copyright©2013 JPCERT/CC All rights reserved.24 public class DeploymentFileRepository …{ : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { : File file = new File(dir, filename); File tmpfile = new File(dir, filename + ".tmp"); PrintWriter writer = new PrintWriter(new FileOutputStream(tmpfile)); writer.write(data); writer.close(); if (file.exists() && noHotDeploy) { : file.delete(); } if (!tmpfile.renameTo(file)) { Fileオブジェクト 「 ./deploy/management/testfolder /testfile.txt 」 「 ./deploy/management/testfolder /testfile.txt 」 が既に存在していたら削除する。 ③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成 DeploymentFileRepository.java
  • 25. Copyright©2013 JPCERT/CC All rights reserved.25 public class DeploymentFileRepository …{ : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { : File file = new File(dir, filename); File tmpfile = new File(dir, filename + ".tmp"); PrintWriter writer = new PrintWriter(new FileOutputStream(tmpfile)); writer.write(data); writer.close(); if (file.exists() && noHotDeploy) { : file.delete(); } if (!tmpfile.renameTo(file)) { Fileオブジェクト 「 ./deploy/management/testfolder/testfile.txt.tmp」 一時ファイル 「 ./deploy/management/testfolder /testfile.txt.tmp」を 「 ./deploy/management/testfolder /testfile.txt 」に 変更して処理が完了。 Fileオブジェクト 「 ./deploy/management/testfolder /testfile.txt 」 ③DeploymentFileRepositoryクラスのstoreメソッドでファイルを作成 DeploymentFileRepository.java
  • 26. Copyright©2013 JPCERT/CC All rights reserved. ④結果を含むレスポンスがクライアントへ送信される。 26 ファイル作成処理が終了し、結果をレスポンスとしてクライアント へ送信する。 Success!!
  • 27. Copyright©2013 JPCERT/CC All rights reserved. 攻撃コード 27 ■攻撃コードのポイント パラメータarg0の値として上位ディレクトリを示す値を含んだ 「..¥..¥..¥..¥testfolder」が指定されている。 POST /jmx-console/HtmlAdaptor HTTP/1.1 Host: localhost:8080 : action=invokeOp&name=jboss.admin%3Aservice%3DDeploymentFileRepository&methodInd ex=5&arg0=..¥..¥..¥..¥testfolder&arg1=testfile&arg2=.txt&arg3=testcontent&arg4=True HTTPリクエスト arg0 : 作成するファイルの上位フォルダ名 arg1 : ファイル名 arg2 : ファイル拡張子 arg3 : ファイルの内容
  • 28. Copyright©2013 JPCERT/CC All rights reserved. 攻撃コード 28 <form action=‘/jmx-console/HtmlAdaptor’ method=‘POST’> : <input type=‘hidden’ name=‘arg0’ value=‘..¥..¥..¥..¥testfolder’> <input type=‘hidden’ name=‘arg1’ value=‘testfile’> <input type=‘hidden’ name=‘arg2’ value=‘.txt’> <input type=‘hidden’ name=‘arg3’ value=‘testcontent’> : </form> 攻撃コードのHTTPリクエストを送信するためのHTML arg0 : 作成するファイルの上位フォルダ名 arg1 : ファイル名 arg2 : ファイル拡張子 arg3 : ファイルの内容
  • 29. Copyright©2013 JPCERT/CC All rights reserved. 攻撃コードが実行された際の処理 29 攻撃コードが実行された際に、③の処理でディレ クトリトラバーサル攻撃が成立する。 JMXコンソールでのファイル作成時の処理フロー ① クライアントからリクエストが送信される ② アプリケーション(Jboss Application Server)がリクエストを受信 し、フォルダ名、ファイル名、拡張子、ファイルデータの情報を 取り出す ③ DeploymentFileRepositoryクラスのstoreメソッドでファイルを作 成する ④ 結果を含むレスポンスがクライアントへ送信される
  • 30. Copyright©2013 JPCERT/CC All rights reserved.30 public class DeploymentFileRepository extends ServiceMBeanSupport implements DeploymentFileRepositoryMBean { : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { : storeメソッドの第1引数(folder)にリクエストのarg0、第2引数(name) にarg1、第3引数(fileExtension)にはarg2、第4引数(data)にはarg3の値 が渡される。 arg3:”testcontent”arg2:”.txt” arg1:”testfile” 攻撃コード実行時 ③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成 arg0:”..¥..¥..¥..¥testfolder” DeploymentFileRepository.java
  • 31. Copyright©2013 JPCERT/CC All rights reserved.31 public class DeploymentFileRepository …{ : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { log.debug("store called"); File dir = new File(base, folder); log.debug("respository folder: " + dir.toString()); log.debug("absolute: " + dir.getAbsolutePath()); if (!dir.exists()) { if (!dir.mkdirs()) { throw new RuntimeException("Failed to create directory: " + dir.toString()); } } ..¥..¥..¥..¥testfolder 攻撃コード実行時 ③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成 DeploymentFileRepository.java
  • 32. Copyright©2013 JPCERT/CC All rights reserved. public class DeploymentFileRepository …{ : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { log.debug("store called"); File dir = new File(base, folder); log.debug("respository folder: " + dir.toString()); log.debug("absolute: " + dir.getAbsolutePath()); if (!dir.exists()) { if (!dir.mkdirs()) { throw new RuntimeException("Failed to create directory: " + dir.toString()); } } 引数folderを使用して作成したFileオブジェクトは 「 ./deploy/management/../../../../testfolder」 となる。 これはフォルダdeployの2階層上に位置する 「testfolder」フォルダを意味する。 32 攻撃コード実行時 ③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成 DeploymentFileRepository.java ..¥..¥..¥..¥testfolder ./deploy/management
  • 33. Copyright©2013 JPCERT/CC All rights reserved.33 public class DeploymentFileRepository …{ : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { log.debug("store called"); File dir = new File(base, folder); log.debug("respository folder: " + dir.toString()); log.debug("absolute: " + dir.getAbsolutePath()); if (!dir.exists()) { if (!dir.mkdirs()) { throw new RuntimeException("Failed to create directory: " + dir.toString()); } } 「 ./deploy/management/../../../../testfolder」 というFileオブジェクト 「 ./deploy/management/../../../../testfolder」 が作成されてしまう。 攻撃コード実行時 ③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成 DeploymentFileRepository.java
  • 34. Copyright©2013 JPCERT/CC All rights reserved.34 その後は正常処理と同様の処理が実行され、下記の場所にファイルが作成され てしまう。本来は ./deploy/management 配下にフォルダ、ファイルが作成さ れるはずが、攻撃コードでパスを操作することで任意のパスにファイルを作成 することが可能となる。 jboss server default deploy Manage ment JBoss Application Serverのフォルダ構成 本来フォルダやファイルが作成されるパス (./deploy/management 配下) testfolder testfolder 攻撃コードによってファイルが作成されるパス (./deploy/management/../../../../testfolder) 攻撃コード実行時 ③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成
  • 35. Copyright©2013 JPCERT/CC All rights reserved.35 1.ファイル削除(removeメソッド) public void remove(String folder, String name, String fileExtension) { File dir = new File(base, folder); String filename = name.replace(' ', '_') + fileExtension; File file = new File(dir, filename); file.delete(); } public boolean isStored(String folder, String name, String fileExtension) { File dir = new File(base, folder); String filename = name.replace(' ', '_') + fileExtension; File file = new File(dir, filename); return file.exists(); } JMXコンソールにはファイル作成以外にも、次の3つの機能に同様の脆弱性 が存在する。 2.ファイル存在確認(isStoredメソッド)
  • 36. Copyright©2013 JPCERT/CC All rights reserved.36 3.ファイル保存パス設定(setBaseDirメソッド) public void setBaseDir(String baseDir) { this.baseDir = baseDir; this.base = new File(serverHome, baseDir); }
  • 37. Copyright©2013 JPCERT/CC All rights reserved. 問題点  今回のアプリケーションにおける具体的な問題点 引数として渡されたパスの値を検証せずに処理を行って いた。 以下のコーディングガイドに違反している 「 MET00-J. メソッドの引数を検証する」 「 IDS02-J. パス名は検証する前に正規化する」 37
  • 38. Copyright©2013 JPCERT/CC All rights reserved. 問題点  問題点に対してどうすべきだったか。 ・引数の値を使って構成したパスが、想定しているディ レクトリの下にあることを検証した上で、ファイルを作 成すべきであった。 ・パスの検証のためには、パスの正規化処理が必要。 38
  • 39. Copyright©2013 JPCERT/CC All rights reserved. 修正版コード 39 ③の処理を行うコードが修正されている。 脆弱性はバージョン4.2.0で修正されている。 JMXコンソールでのファイル作成時の処理フロー ① クライアントからリクエストが送信される ② アプリケーション(Jboss Application Server)がリクエストを受信 し、フォルダ名、ファイル名、拡張子、ファイルデータの情報を 取り出す ③ DeploymentFileRepositoryクラスのstoreメソッドでファイルを作 成する ④ 結果を含むレスポンスがクライアントへ送信される
  • 40. Copyright©2013 JPCERT/CC All rights reserved. 修正前/修正後の処理比較 ③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成 40 public class DeploymentFileRepository …{ : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { log.debug("store called"); File dir = new File(base, folder); log.debug("respository folder: " + dir.toString()); : DeploymentFileRepository.java (修正前) public class DeploymentFileRepository …{ : public void store(String folder, String name, String fileExtension, String data, boolean noHotDeploy) throws IOException { log.debug("store called"); File dir = getFile(base, folder); log.debug("respository folder: " + dir.toString()); : DeploymentFileRepository.java (修正後) getFileメソッドを使用するよ うにコードが変更されている。
  • 41. Copyright©2013 JPCERT/CC All rights reserved.41 private File getFile(File parent, String child) throws IOException { File childFile = new File(parent, child); if (childFile.getCanonicalPath().indexOf(parent.getCanonicalPath()) != 0) throw new IllegalArgumentException( "child '" + child + "' should be a child of parent '" + parent + "'“ ); return childFile; } getFileメソッド getCanonicalPathメソッドで正規化をした後に、 indexOfメソッドを使用して parentがchildFileの 一部に含まれているか検証している。 新規作成するフォルダの Fileオブジェクトを作成 ./deploy/management storeメソッドの第1引数 (フォルダ名) 修正前/修正後の処理比較 ③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成 ※ getCanonicalPath関数を使用すると 「/parent/child1/child2/../../child0」→「 /parent/child0 」 というように正規化される。
  • 42. Copyright©2013 JPCERT/CC All rights reserved.42 ■修正版コードが攻撃を受けるとどうなるか getFileメソッド内でgetCanonicalPathメソッドにより parent : 「./deploy/management」→ 「/jboss/server/default/deploy/management」 childFile : 「 ./deploy/management/../../../../testfolder」→ 「 /jboss/server/testfolder」 と正規化される。 パスを検証するコードが、childFileのパスにparentが含まれていない ことを検知し、エラーとして処理する。 修正前/修正後の処理比較 ③DeploymentFileRepositoryクラスのstoreメソッドでファイル作成
  • 43. Copyright©2013 JPCERT/CC All rights reserved. その他の修正 下記のメソッドも getFile メソッドを利用したパスの正 規化と検証を行うように修正されている。 —ファイル削除(removeメソッド) —ファイル存在確認(isStoredメソッド) —ファイル保存パス設定(setBaseDirメソッド) 43
  • 44. Copyright©2013 JPCERT/CC All rights reserved. まとめ 44 ■この脆弱性から学べるプログラミングの注意点 • アプリケーションの処理内容や扱うデータ構造に応じて、 引数が適切な値であることを検証すべき。 •今回のケースでは、ファイル/ディレクトリ操作で扱うパス名 を細工されることで、ディレクトリトラバーサルの脆弱性につ ながった。 ■上記への対策 • 引数のパス名を正規化してから(IDS02-J)、想定した範 囲に収まっていることを確認する。
  • 45. Copyright©2013 JPCERT/CC All rights reserved. 著作権・引用や二次利用について 本資料の著作権はJPCERT/CCに帰属します。 本資料あるいはその一部を引用・転載・再配布する際は、引用元名、資料名および URL の明示をお 願いします。 記載例 引用元:一般社団法人JPCERTコーディネーションセンター Java アプリケーション脆弱性事例解説資料 Jboss Application Server におけるディレクトリトラバーサルの脆弱性 https://www.jpcert.or.jp/research/materials-java-casestudies/No.5_JBoss.pdf 本資料を引用・転載・再配布をする際は、引用先文書、時期、内容等の情報を、JPCERT コーディ ネーションセンター広報(office@jpcert.or.jp)までメールにてお知らせください。なお、この連絡に より取得した個人情報は、別途定めるJPCERT コーディネーションセンターの「プライバシーポリ シー」に則って取り扱います。 本資料の利用方法等に関するお問い合わせ JPCERTコーディネーションセンター 広報担当 E-mail:office@jpcert.or.jp 45 本資料の技術的な内容に関するお問い合わせ JPCERTコーディネーションセンター セキュアコーディング担当 E-mail:secure-coding@jpcert.or.jp