SlideShare ist ein Scribd-Unternehmen logo
1 von 27
Downloaden Sie, um offline zu lesen
Javaセキュアコーディングセミナー東京
第4回
メソッドとセキュリティ
演習の解説

2012年12月16日(日)
JPCERTコーディネーションセンター
脆弱性解析チーム
熊谷裕志、戸田 洋三




                      1
‣Hands-on Exercises
 ‣ finalizer 攻撃を阻止しよう
 ‣ 他のクラスから、htに入っているキー「1」の
  エントリを消せるか?




                 2
Hands-on Exercise(1)

 finalizer 攻撃を阻止しよう




                       3
サンプルアプリケーション(1/2)

public class LicenseManager {
  public LicenseManager() {
    if (!licenseValidation()) {
      throw new SecurityException("License Invalid!");
    }
  }
  private boolean licenseValidation() {
    // ライセンスファイルをリードしてチェックし、ライセンスが正当ならtrueを返す
        return false;
    }
}

public class SecuritySystem {
  private static LicenseManager licenseManager = null;
  public static void register(LicenseManager lm) {
    // licenseManagerが初期化されていない場合のみ登録
        if (licenseManager == null) {
          if (lm == null) {
            System.out.println("License Manager invalid!");
            System.exit(1);
          }
          licenseManager = lm;
        }
    }
}            Heinz M. Kabutz. Exceptional Constructors - Ressurecting the dead. Java Specialists’ Newsletter. 2001

                                                       4
サンプルアプリケーション(2/2)

public class Application {
  public static void main(String[] args) {
    LicenseManager lm;
    try {
      lm = new LicenseManager();
    } catch(SecurityException ex) { lm = null; }

        SecuritySystem.register(lm);
        System.out.println("Now let’s get things started");
    }
}



% ls *.java
Application.java LicenseManager.java   SecuritySystem.java
% javac *.java
% java Application
License Manager invalid!
%
                                       5
ファイナライザー攻撃を行うコード(1/2)
                                                                  攻撃コード
public class LicenseManagerInterceptor extends LicenseManager {
  private static LicenseManagerInterceptor instance = null;
  public static LicenseManagerInterceptor make() {
    try {
      new LicenseManagerInterceptor();
    } catch(Exception ex) {} // 例外を無視
     try {
       synchronized(LicenseManagerInterceptor.class) {
         while (instance == null) {
           System.gc();
           LicenseManagerInterceptor.class.wait(100);
         }
       }
     } catch(InterruptedException ex) {
       return null;
     }
     return instance;
    }
    public void finalize() {
      System.out.println("In finalize of " + this);
      synchronized(LicenseManagerInterceptor.class) {
        instance = this;
        LicenseManagerInterceptor.class.notify();
      }
    }
    public LicenseManagerInterceptor() {
      System.out.println("Created LicenseManagerInterceptor");
    }
}


                                            6
ファイナライザー攻撃を行うコード(2/2)
                                                              攻撃コード
public class AttackerApp {
  public static void main(String[] args) {
    LicenseManagerInterceptor lm = LicenseManagerInterceptor.make();
    SecuritySystem.register(lm);
    // now we call the other application
    Application.main(args);
  }
}




% ls
Application.class LicenseManager.class SecuritySystem.class
AttackerApp.java LicenseManagerInterceptor.java
% javac *.java
% java AttakerApp
In finalize of LicenseManagerInterceptor@7dcb3cd
Now let’s get things started
%



                                      7
ファイナライザ攻撃対策
‣ finalize()メソッドを上書きされないように定義
‣ 重要なインスタンスは、初期化の完了を必ず確認
‣ サブクラス化による悪用を防ぐために、クラスをfinal
宣言する




  サンプルコードを
   修正してみよう!


               8
ファイナライザ攻撃対策          解説編
‣ finalize()メソッドを上書きされないように定義
‣ 重要なインスタンスは、初期化の完了を必ず確認
‣ サブクラス化による悪用を防ぐために、クラスをfinal
宣言する



•finalize()をサブクラスで上書きされないよう
final 宣言つきで定義
•LicenseManager クラスを final 宣言


                 9
LicenseManager の修正                             解説編
public final class LicenseManager {              final宣言を追加
  public LicenseManager() {
    if (!licenseValidation()) {
      throw new SecurityException("License Invalid!");
    }
  }
  private boolean licenseValidation() {
    // ライセンスファイルをリードしてチェックし、ライセンスが正当ならtrueを返す
        return false;
    }

    @Override
    protected final void finalize(){}

}

                                             final宣言つきでfinalize() メソッド
                                                      を定義




                                        10
修正の効果                                             解説編
この修正により、攻撃コードはコンパイル
できなくなる。


% javac AttackerApp.java LicenseManagerInterceptor.java
LicenseManagerInterceptor.java:1: error: cannot inherit from final LicenseManager
public class LicenseManagerInterceptor extends LicenseManager {
                                 ^
LicenseManagerInterceptor.java:19: error: finalize() in LicenseManagerInterceptor
cannot override finalize() in LicenseManager
 public void finalize() {
          ^
 overridden method is final
2 errors
%



                                       11
ファイナライザ攻撃対策         解説編
 ‣ finalize()メソッドを上書きされないように定義
 ‣ 重要なインスタンスは、初期化の完了を必ず確認
 ‣ サブクラス化による悪用を防ぐために、クラスをfinal
  宣言する

LicenseManager のコンストラクタが正常終了した
ことを確認できるようにする



     初期化完了フラグを設ける


                12
LicenseManager の修正                     解説編
public class LicenseManager {

    boolean init = false;            初期化完了フラグ
    public LicenseManager() {
      if (!licenseValidation()) {
        throw new SecurityException("License Invalid!");
      }
      init = true;
    }                                              コンストラクタが正常終
    private boolean licenseValidation() {
      // ライセンスファイルをリードしてチェックし、ライセンスが正当ならtrueを返す
                                                   了する最後に初期化完了
        return false;                      フラグの値を変更する
    }

}




                                13
SecuritySystem の修正                           解説編
public class SecuritySystem {
  private static LicenseManager licenseManager = null;
  public static void register(LicenseManager lm) {
    // licenseManagerが初期化されていない場合のみ登録
        if (licenseManager == null) {
          if (lm == null) {
            System.out.println("License Manager invalid!");
            System.exit(1);
          }
          if (lm.init == false) {
            System.out.println("incomplete License Manager!");
            System.exit(2);
          }
          licenseManager = lm;
        }                            渡されたインスタンスが正しく初期化された
    }
}                               ものかどうかチェックする




                                    14
修正の効果                                          解説編
この修正により、初期化完了していないイ
ンスタンスを検出できるようになる。

% java AttackerApp
In finalize of LicenseManagerInterceptor@2aa05bc3
incomplete License Manager!
%



しかしこれでは不十分!

    攻撃コードで init の値を操作してしまえば...

                                     15
攻撃コード(改)                                       解説編
                                                            攻撃コード
public class AttackerApp {
  public static void main(String[] args) {
    LicenseManagerInterceptor lm = LicenseManagerInterceptor.make();
    lm.init = true;
    SecuritySystem.register(lm);
    // now we call the other application
                                                   init の値を操作
    Application.main(args);
  }
}




% javac AttackerApp.java
% java AttackerApp
In finalize of LicenseManagerInterceptor@2aa05bc3
Now let’s get things started
%                                                       攻撃成功!

   初期化完了フラグを改変されないようにする
   必要がある
                                     16
LicenseManager をさらに修正                              解説編
public class LicenseManager {                     private 宣言する
    private boolean init = false;

    public boolean is_init(){ return init; }       init の値を調べるメ
    public LicenseManager() {                            ソッドを追加
      if (!licenseValidation()) {
        throw new SecurityException("License Invalid!");
      }
      init = true;
    }
    private boolean licenseValidation() {
      // ライセンスファイルをリードしてチェックし、ライセンスが正当ならtrueを返す
        return false;
    }

}




                                      17
SecuritySystem をさらに修正                                    解説編
public class SecuritySystem {
  private static LicenseManager licenseManager = null;
  public static void register(LicenseManager lm) {
    // licenseManagerが初期化されていない場合のみ登録
        if (licenseManager == null) {
          if (lm == null) {
            System.out.println("License Manager invalid!");
            System.exit(1);
          }
          if (lm.is_init() == false) {
            System.out.println("incomplete License Manager!");
            System.exit(2);
          }
          licenseManager = lm;
        }                            初期化完了のチェックはメソッドを呼び出す
    }
}                               形に変更




                                    18
さらなる修正の効果                                           解説編
AttackerApp から初期化フラグを改変でき
なくなる。
% javac AttackerApp.java
AttackerApp.java:4: error: init has private access in LicenseManager
   lm.init = true;
    ^
1 error
%




                                         19
Hands-on Exercise(2)




 他のクラスから、htに入っている
 キー「1」のエントリを消せるか?




                       20
Hands-on Exercise(2)
他のクラスから、htに入っているキー「1」のエントリを消せるか?
import java.util.Hashtable;                                            問題のコード
import java.security.AccessController;
import java.security.SecurityPermission;

public final class SensitiveHash {
  private Hashtable<Integer,String> ht = new Hashtable<Integer,String>();

    SensitiveHash() {
      ht.put(1, "one");                            例えば
      ht.put(2, "two");
      ht.put(3, "three");                     SensitiveHash sh = new SensitiveHash();
    }                                         sh.removeEntry(1);
                                              sh.showEntries();
    void removeEntry(Object key) {
      check("removeKeyPermission");                              セキュリティチェックされているため
      ht.remove(key);                                            エントリーを消すことはできない
    }

    public void showEntries()   {
      System.out.println("" +   ht.get(1));
      System.out.println("" +   ht.get(2));
      System.out.println("" +   ht.get(3));
    }

    private void check(String directive) {
      SecurityPermission sp = new SecurityPermission(directive);
      AccessController.checkPermission(sp);
    }
}

                                              21
Hands-on Exercise(2)
他のクラスから、htに入っているキー「1」のエントリを消せるか?




 やってみる




                       22
Hands-on Exercise(2)
他のクラスから、htに入っているキー「1」のエントリを消せるか?



 class AttackHash extends SensitiveHash {
   void removeEntry(Object key) {
     ht.remove(key);
   }
 }                   SensitiveHashクラスはfinal宣言さ
                      れているのでサブクラスは作れない




                   import java.util.Hashtable;

                   public class Attack {
                     public static void main(String[] args){
                       SensitiveHash sh = new SensitiveHash();
                       sh.removeEntry(1);
                       sh.showEntries();
                     }
                   }                 removeKeyPermissionが許可されてい
                                      ないのでremoveEntryは実行できない

                             23
Hands-on Exercise(2)
他のクラスから、htに入っているキー「1」のエントリを消せるか?




 リフレクションを使えば
 エントリーを消すことができる




                       24
Hands-on Exercise(2)
他のクラスから、htに入っているキー「1」のエントリを消せるか?

 import java.util.Hashtable;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;

 public class AttackAns {
   public static void main(String[] args){

         try {
           Class<SensitiveHash> c = SensitiveHash.class;
                                                           リフレクションを使ってprivate
           SensitiveHash sh = new SensitiveHash();
                                                           フィールドにアクセスする
           Field field = c.getDeclaredField("ht");
           field.setAccessible(true);

           Hashtable hh = (Hashtable)field.get(sh);
           hh.remove(1);
                                                           Hashtable#removeで削除
           sh.showEntries();

         } catch (Exception ex) {
           ex.printStackTrace(System.out);
         }
     }
 }



                                        25
Hands-on Exercise(2)
他のクラスから、htに入っているキー「1」のエントリを消せるか?
import java.util.Hashtable;                                              問題のコード
import java.security.AccessController;
import java.security.SecurityPermission;

public final class SensitiveHash {
  private Hashtable<Integer,String> ht = new Hashtable<Integer,String>();

    SensitiveHash() {
      ht.put(1, "one");
      ht.put(2, "two");
      ht.put(3, "three");
    }

    void removeEntry(Object key) {
      check("removeKeyPermission");
      ht.remove(key);
    }
                                                                   「removeKeyPermission」の権
    public void showEntries()   {
      System.out.println("" +   ht.get(1));                        限があるかどうかのチェックのみ
      System.out.println("" +   ht.get(2));
      System.out.println("" +   ht.get(3));
    }                                                                    セキュリティマネージャは
    private void check(String directive) {                               有効になっていない
      SecurityPermission sp = new SecurityPermission(directive);
      AccessController.checkPermission(sp);
    }
}

                                              26
Hands-on Exercise(2)
他のクラスから、htに入っているキー「1」のエントリを消せるか?




 ということで
 リフレクションが使えて
 エントリーを消すことができる



                       27

Weitere ähnliche Inhalte

Andere mochten auch

ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルJPCERT Coordination Center
 
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性JPCERT Coordination Center
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説JPCERT Coordination Center
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性JPCERT Coordination Center
 
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)JPCERT Coordination Center
 
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性JPCERT Coordination Center
 
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
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JPCERT Coordination Center
 
Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性JPCERT Coordination Center
 
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性JPCERT Coordination Center
 
Modul latihan matematik upsr peratus
Modul latihan matematik upsr  peratusModul latihan matematik upsr  peratus
Modul latihan matematik upsr peratussoulmoon
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性JPCERT Coordination Center
 
クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第1回 講義
Javaセキュアコーディングセミナー東京第1回 講義Javaセキュアコーディングセミナー東京第1回 講義
Javaセキュアコーディングセミナー東京第1回 講義JPCERT Coordination Center
 
脆弱性事例に学ぶセキュアコーディング「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
 
MATEMATIK TAHUN 5 : TOPIK PERATUS
MATEMATIK TAHUN 5 : TOPIK PERATUSMATEMATIK TAHUN 5 : TOPIK PERATUS
MATEMATIK TAHUN 5 : TOPIK PERATUSZulkifli Muhamad
 
Nota RINGKAS MENGIKUT TOPIK MATEMATIK SEKOLAH RENDAH
Nota RINGKAS MENGIKUT TOPIK MATEMATIK SEKOLAH RENDAHNota RINGKAS MENGIKUT TOPIK MATEMATIK SEKOLAH RENDAH
Nota RINGKAS MENGIKUT TOPIK MATEMATIK SEKOLAH RENDAHrichieroyston
 

Andere mochten auch (20)

ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデル
 
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
 
Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
 
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
 
Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備
 
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
 
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
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
 
Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性
 
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
 
Modul latihan matematik upsr peratus
Modul latihan matematik upsr  peratusModul latihan matematik upsr  peratus
Modul latihan matematik upsr peratus
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性
 
クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策
 
Javaセキュアコーディングセミナー東京第1回 講義
Javaセキュアコーディングセミナー東京第1回 講義Javaセキュアコーディングセミナー東京第1回 講義
Javaセキュアコーディングセミナー東京第1回 講義
 
脆弱性事例に学ぶセキュアコーディング「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証明書検証の現状と対策」
 
MATEMATIK TAHUN 5 : TOPIK PERATUS
MATEMATIK TAHUN 5 : TOPIK PERATUSMATEMATIK TAHUN 5 : TOPIK PERATUS
MATEMATIK TAHUN 5 : TOPIK PERATUS
 
Nota RINGKAS MENGIKUT TOPIK MATEMATIK SEKOLAH RENDAH
Nota RINGKAS MENGIKUT TOPIK MATEMATIK SEKOLAH RENDAHNota RINGKAS MENGIKUT TOPIK MATEMATIK SEKOLAH RENDAH
Nota RINGKAS MENGIKUT TOPIK MATEMATIK SEKOLAH RENDAH
 

Ähnlich wie Javaセキュアコーディングセミナー東京第4回演習の解説

Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会
Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会
Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会Hirokazu Narita
 
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetupこれで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線MeetupMasatoshi Tada
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会Takinami Kei
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義ria1201
 
[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部haruki ueno
 
Zynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチZynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチMr. Vengineer
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習JPCERT Coordination Center
 
WordPress widget api
WordPress widget apiWordPress widget api
WordPress widget apiTakami Kazuya
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compilernothingcosmos
 
Google App Engineでできる、あんなこと/こんなこと
Google App Engineでできる、あんなこと/こんなことGoogle App Engineでできる、あんなこと/こんなこと
Google App Engineでできる、あんなこと/こんなことa-know
 
認証機能で学ぶ Laravel 5 アプリケーション
認証機能で学ぶ Laravel 5 アプリケーション認証機能で学ぶ Laravel 5 アプリケーション
認証機能で学ぶ Laravel 5 アプリケーションMasashi Shinbara
 

Ähnlich wie Javaセキュアコーディングセミナー東京第4回演習の解説 (18)

Junit4
Junit4Junit4
Junit4
 
Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会
Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会
Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会
 
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetupこれで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部
 
Heap statsfx analyzer
Heap statsfx analyzerHeap statsfx analyzer
Heap statsfx analyzer
 
Boilerplate vs Magic
Boilerplate vs MagicBoilerplate vs Magic
Boilerplate vs Magic
 
Zynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチZynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチ
 
T93 com入門
T93 com入門T93 com入門
T93 com入門
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習
 
WordPress widget api
WordPress widget apiWordPress widget api
WordPress widget api
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compiler
 
Google App Engineでできる、あんなこと/こんなこと
Google App Engineでできる、あんなこと/こんなことGoogle App Engineでできる、あんなこと/こんなこと
Google App Engineでできる、あんなこと/こんなこと
 
認証機能で学ぶ Laravel 5 アプリケーション
認証機能で学ぶ Laravel 5 アプリケーション認証機能で学ぶ Laravel 5 アプリケーション
認証機能で学ぶ Laravel 5 アプリケーション
 
JavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, PerformanceJavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, Performance
 

Mehr von JPCERT Coordination Center

いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~JPCERT Coordination Center
 
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)JPCERT Coordination Center
 
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』JPCERT Coordination Center
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)JPCERT Coordination Center
 
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)JPCERT Coordination Center
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性JPCERT Coordination Center
 
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...JPCERT Coordination Center
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義JPCERT Coordination Center
 

Mehr von JPCERT Coordination Center (12)

いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
 
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
 
DLL読み込みの問題を読み解く
DLL読み込みの問題を読み解くDLL読み込みの問題を読み解く
DLL読み込みの問題を読み解く
 
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
 
脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる
 
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
 
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
 
Android Secure Coding
Android Secure CodingAndroid Secure Coding
Android Secure Coding
 
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義
 

Javaセキュアコーディングセミナー東京第4回演習の解説

  • 2. ‣Hands-on Exercises ‣ finalizer 攻撃を阻止しよう ‣ 他のクラスから、htに入っているキー「1」の エントリを消せるか? 2
  • 3. Hands-on Exercise(1) finalizer 攻撃を阻止しよう 3
  • 4. サンプルアプリケーション(1/2) public class LicenseManager { public LicenseManager() { if (!licenseValidation()) { throw new SecurityException("License Invalid!"); } } private boolean licenseValidation() { // ライセンスファイルをリードしてチェックし、ライセンスが正当ならtrueを返す return false; } } public class SecuritySystem { private static LicenseManager licenseManager = null; public static void register(LicenseManager lm) { // licenseManagerが初期化されていない場合のみ登録 if (licenseManager == null) { if (lm == null) { System.out.println("License Manager invalid!"); System.exit(1); } licenseManager = lm; } } } Heinz M. Kabutz. Exceptional Constructors - Ressurecting the dead. Java Specialists’ Newsletter. 2001 4
  • 5. サンプルアプリケーション(2/2) public class Application { public static void main(String[] args) { LicenseManager lm; try { lm = new LicenseManager(); } catch(SecurityException ex) { lm = null; } SecuritySystem.register(lm); System.out.println("Now let’s get things started"); } } % ls *.java Application.java LicenseManager.java SecuritySystem.java % javac *.java % java Application License Manager invalid! % 5
  • 6. ファイナライザー攻撃を行うコード(1/2) 攻撃コード public class LicenseManagerInterceptor extends LicenseManager { private static LicenseManagerInterceptor instance = null; public static LicenseManagerInterceptor make() { try { new LicenseManagerInterceptor(); } catch(Exception ex) {} // 例外を無視 try { synchronized(LicenseManagerInterceptor.class) { while (instance == null) { System.gc(); LicenseManagerInterceptor.class.wait(100); } } } catch(InterruptedException ex) { return null; } return instance; } public void finalize() { System.out.println("In finalize of " + this); synchronized(LicenseManagerInterceptor.class) { instance = this; LicenseManagerInterceptor.class.notify(); } } public LicenseManagerInterceptor() { System.out.println("Created LicenseManagerInterceptor"); } } 6
  • 7. ファイナライザー攻撃を行うコード(2/2) 攻撃コード public class AttackerApp { public static void main(String[] args) { LicenseManagerInterceptor lm = LicenseManagerInterceptor.make(); SecuritySystem.register(lm); // now we call the other application Application.main(args); } } % ls Application.class LicenseManager.class SecuritySystem.class AttackerApp.java LicenseManagerInterceptor.java % javac *.java % java AttakerApp In finalize of LicenseManagerInterceptor@7dcb3cd Now let’s get things started % 7
  • 8. ファイナライザ攻撃対策 ‣ finalize()メソッドを上書きされないように定義 ‣ 重要なインスタンスは、初期化の完了を必ず確認 ‣ サブクラス化による悪用を防ぐために、クラスをfinal 宣言する サンプルコードを 修正してみよう! 8
  • 9. ファイナライザ攻撃対策 解説編 ‣ finalize()メソッドを上書きされないように定義 ‣ 重要なインスタンスは、初期化の完了を必ず確認 ‣ サブクラス化による悪用を防ぐために、クラスをfinal 宣言する •finalize()をサブクラスで上書きされないよう final 宣言つきで定義 •LicenseManager クラスを final 宣言 9
  • 10. LicenseManager の修正 解説編 public final class LicenseManager { final宣言を追加 public LicenseManager() { if (!licenseValidation()) { throw new SecurityException("License Invalid!"); } } private boolean licenseValidation() { // ライセンスファイルをリードしてチェックし、ライセンスが正当ならtrueを返す return false; } @Override protected final void finalize(){} } final宣言つきでfinalize() メソッド を定義 10
  • 11. 修正の効果 解説編 この修正により、攻撃コードはコンパイル できなくなる。 % javac AttackerApp.java LicenseManagerInterceptor.java LicenseManagerInterceptor.java:1: error: cannot inherit from final LicenseManager public class LicenseManagerInterceptor extends LicenseManager { ^ LicenseManagerInterceptor.java:19: error: finalize() in LicenseManagerInterceptor cannot override finalize() in LicenseManager public void finalize() { ^ overridden method is final 2 errors % 11
  • 12. ファイナライザ攻撃対策 解説編 ‣ finalize()メソッドを上書きされないように定義 ‣ 重要なインスタンスは、初期化の完了を必ず確認 ‣ サブクラス化による悪用を防ぐために、クラスをfinal 宣言する LicenseManager のコンストラクタが正常終了した ことを確認できるようにする 初期化完了フラグを設ける 12
  • 13. LicenseManager の修正 解説編 public class LicenseManager { boolean init = false; 初期化完了フラグ public LicenseManager() { if (!licenseValidation()) { throw new SecurityException("License Invalid!"); } init = true; } コンストラクタが正常終 private boolean licenseValidation() { // ライセンスファイルをリードしてチェックし、ライセンスが正当ならtrueを返す 了する最後に初期化完了 return false; フラグの値を変更する } } 13
  • 14. SecuritySystem の修正 解説編 public class SecuritySystem { private static LicenseManager licenseManager = null; public static void register(LicenseManager lm) { // licenseManagerが初期化されていない場合のみ登録 if (licenseManager == null) { if (lm == null) { System.out.println("License Manager invalid!"); System.exit(1); } if (lm.init == false) { System.out.println("incomplete License Manager!"); System.exit(2); } licenseManager = lm; } 渡されたインスタンスが正しく初期化された } } ものかどうかチェックする 14
  • 15. 修正の効果 解説編 この修正により、初期化完了していないイ ンスタンスを検出できるようになる。 % java AttackerApp In finalize of LicenseManagerInterceptor@2aa05bc3 incomplete License Manager! % しかしこれでは不十分! 攻撃コードで init の値を操作してしまえば... 15
  • 16. 攻撃コード(改) 解説編 攻撃コード public class AttackerApp { public static void main(String[] args) { LicenseManagerInterceptor lm = LicenseManagerInterceptor.make(); lm.init = true; SecuritySystem.register(lm); // now we call the other application init の値を操作 Application.main(args); } } % javac AttackerApp.java % java AttackerApp In finalize of LicenseManagerInterceptor@2aa05bc3 Now let’s get things started % 攻撃成功! 初期化完了フラグを改変されないようにする 必要がある 16
  • 17. LicenseManager をさらに修正 解説編 public class LicenseManager { private 宣言する private boolean init = false; public boolean is_init(){ return init; } init の値を調べるメ public LicenseManager() { ソッドを追加 if (!licenseValidation()) { throw new SecurityException("License Invalid!"); } init = true; } private boolean licenseValidation() { // ライセンスファイルをリードしてチェックし、ライセンスが正当ならtrueを返す return false; } } 17
  • 18. SecuritySystem をさらに修正 解説編 public class SecuritySystem { private static LicenseManager licenseManager = null; public static void register(LicenseManager lm) { // licenseManagerが初期化されていない場合のみ登録 if (licenseManager == null) { if (lm == null) { System.out.println("License Manager invalid!"); System.exit(1); } if (lm.is_init() == false) { System.out.println("incomplete License Manager!"); System.exit(2); } licenseManager = lm; } 初期化完了のチェックはメソッドを呼び出す } } 形に変更 18
  • 19. さらなる修正の効果 解説編 AttackerApp から初期化フラグを改変でき なくなる。 % javac AttackerApp.java AttackerApp.java:4: error: init has private access in LicenseManager lm.init = true; ^ 1 error % 19
  • 20. Hands-on Exercise(2) 他のクラスから、htに入っている キー「1」のエントリを消せるか? 20
  • 21. Hands-on Exercise(2) 他のクラスから、htに入っているキー「1」のエントリを消せるか? import java.util.Hashtable; 問題のコード import java.security.AccessController; import java.security.SecurityPermission; public final class SensitiveHash { private Hashtable<Integer,String> ht = new Hashtable<Integer,String>(); SensitiveHash() { ht.put(1, "one"); 例えば ht.put(2, "two"); ht.put(3, "three"); SensitiveHash sh = new SensitiveHash(); } sh.removeEntry(1); sh.showEntries(); void removeEntry(Object key) { check("removeKeyPermission"); セキュリティチェックされているため ht.remove(key); エントリーを消すことはできない } public void showEntries() { System.out.println("" + ht.get(1)); System.out.println("" + ht.get(2)); System.out.println("" + ht.get(3)); } private void check(String directive) { SecurityPermission sp = new SecurityPermission(directive); AccessController.checkPermission(sp); } } 21
  • 23. Hands-on Exercise(2) 他のクラスから、htに入っているキー「1」のエントリを消せるか? class AttackHash extends SensitiveHash { void removeEntry(Object key) { ht.remove(key); } } SensitiveHashクラスはfinal宣言さ れているのでサブクラスは作れない import java.util.Hashtable; public class Attack { public static void main(String[] args){ SensitiveHash sh = new SensitiveHash(); sh.removeEntry(1); sh.showEntries(); } } removeKeyPermissionが許可されてい ないのでremoveEntryは実行できない 23
  • 25. Hands-on Exercise(2) 他のクラスから、htに入っているキー「1」のエントリを消せるか? import java.util.Hashtable; import java.lang.reflect.Field; import java.lang.reflect.Method; public class AttackAns { public static void main(String[] args){ try { Class<SensitiveHash> c = SensitiveHash.class; リフレクションを使ってprivate SensitiveHash sh = new SensitiveHash(); フィールドにアクセスする Field field = c.getDeclaredField("ht"); field.setAccessible(true); Hashtable hh = (Hashtable)field.get(sh); hh.remove(1); Hashtable#removeで削除 sh.showEntries(); } catch (Exception ex) { ex.printStackTrace(System.out); } } } 25
  • 26. Hands-on Exercise(2) 他のクラスから、htに入っているキー「1」のエントリを消せるか? import java.util.Hashtable; 問題のコード import java.security.AccessController; import java.security.SecurityPermission; public final class SensitiveHash { private Hashtable<Integer,String> ht = new Hashtable<Integer,String>(); SensitiveHash() { ht.put(1, "one"); ht.put(2, "two"); ht.put(3, "three"); } void removeEntry(Object key) { check("removeKeyPermission"); ht.remove(key); } 「removeKeyPermission」の権 public void showEntries() { System.out.println("" + ht.get(1)); 限があるかどうかのチェックのみ System.out.println("" + ht.get(2)); System.out.println("" + ht.get(3)); } セキュリティマネージャは private void check(String directive) { 有効になっていない SecurityPermission sp = new SecurityPermission(directive); AccessController.checkPermission(sp); } } 26