SlideShare una empresa de Scribd logo
1 de 60
Descargar para leer sin conexión
Javaセキュアコーディングセミナー東京
第4回
メソッドとセキュリティ


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




                      1
本資料について
本セミナーに使用するテキストの著作権はJPCERT/CCに帰属します。
事前の承諾を受けた場合を除いて、本資料に含有される内容(一部か全部か
を問わない)を複製・公開・送信・頒布・譲渡・貸与・使用許諾・転載・再
利用できません。



本セミナーに関するお問い合わせ
JPCERTコーディネーションセンター
セキュアコーディング担当
E-mail:secure-coding@jpcert.or.jp
TEL:03-3518-4600




                                2
本セミナーについて
‣ 4回連続セミナーです
   ‣ 第1回 9月9日(日)
     ‣ オブジェクトの生成と消滅におけるセキュリティ
   ‣ 第2回 10月14日(日)
     ‣ 数値データの取扱いと入力値検査
   ‣ 第3回 11月11日(日)
     ‣ 入出力(ファイル,ストリーム)と例外時の動作
   ‣ 第4回 12月16日
     ‣ メソッドとセキュリティ

‣ 開発環境持参




                3
今日の時間割

‣ 講義 (13:30--15:00)
  ‣ メソッド/セキュリティ
    (13:30--14:35)
  ‣ ファイナライザ (14:45--15:15)
‣ ハンズオン (15:15--16:30)
  ‣ 15:25--15:55
  ‣ 15:55--16:30

             4
メソッド




       5
メソッドとは

 クラスの操作は、結果を得るためにオブジェクトのデータ
 に操作を指示するメソッド(method)により宣言されます。メ
 ソッドは、他のオブジェクトから隠蔽されている内部の実
 装の詳細にアクセスします。メソッドの中にデータを隠蔽
 することにより、他のオブジェクトからアクセスできない
 ようにすることは、データのカプセル化(data encapsulation)
 の基本中の基本です。

                プログラミング言語Java第4版、§1.8メソッドとパラメータ




                    6
メソッドとは

 2つのメソッドが同じ名前と引数の型を保持している場合,
 それらのメソッドは同じシグネチャ(same argument
 types)を保持することになる


                    Java言語仕様第3版、§8.4.2 メソッドのシグネチャ




                    7
メソッドとは

class Person {
  private int id;
  private String name;
  public Person(int i, String s){ id=i; name=s; }
  public int id(){ return id; }
  public String name(){ return name; }

    public static void main(String[] args){
      person p = new person(1,”taro”);
      System.out.println(p.name() + “: “ + p.id());
    }
}

‣ クラスPersonに、メソッドid()とname()とmain(String[])
 が定義されている。




                             8
メソッドオーバーロードを乱用しない
‣ Java言語ではメソッドのオーバーロードが可能

  2つのメソッドは、異なる数のパラメータか異なる型のパラメータ
  を持っていれば、つまり異なるシグネチャであれば、同じ名前を
  持つことができます。メソッドの1つの名前が複数の意味を持つの
  で、この機能はオーバーロード(overloading)と呼ばれます。

  1つのメソッドを呼び出す場合に、オーバーロードされているメ
  ソッドから最も一致するメソッドを探すために、コンパイラーは
  引数の型を使用します。

               プログラミング言語Java第4版、§2.8メソッドのオーバーロード




                      9
メソッドオーバーロードを乱用しない
‣ オーバーロードを使った単純なサンプルコード
class overload {
  public void id(String s){ System.out.println("String"); }
  public void id(Integer i){ System.out.println("Integer"); }

    public static void main(String[] args) {
      overload o = new overload();
      o.id("choichoi");
      o.id(42);
    }
}

‣ 実行例

$ java overload
String
Integer
$


                                10
メソッドオーバーロードを乱用しない
‣ メソッドのオーバーロード
  ‣ メソッド名が同じでも引数リストが異なれば異なるメソッド
  ‣ シグネチャで区別される
  ‣ 呼び出すメソッドはコンパイル時に決まる




‣ メソッドのオーバーライド
  ‣ 呼び出すメソッドは実行時に決定される




               11
メソッドオーバーロードを乱用しない

‣ メソッド id(int i)を追加
class Overload {
  public void id(String s){ System.out.println("String"); }
  public void id(Integer i){ System.out.println("Integer"); }
  public void id(int i){ System.out.println("int"); }

    public static void main(String[] args) {
                                                            追加された
      Overload o = new Overload();
      o.id("choichoi");                                     メソッド
      o.id(42);
    }
}

‣ 実行例

$ java Overload
String
int                      呼び出すメソッドが変
$
                         わってしまった!


                                  12
メソッドオーバーロードを乱用しない
‣ メソッドのオーバーロードを乱用すると
  ‣ 動作が分かりにくく誤解を招く
  ‣ デバッグしにくい
  ‣ コードの保守が困難になる




               13
メソッドオーバーロードを乱用しない
                                                        違反コード
public class Overloader {
  private static String display(ArrayList<Integer> arrlist) {
    return "ArrayList";
  }                                                            display()メソッドが
  private static String display(LinkedList<String> llist) {   オーバーロードされている
    return "LinkedList";
  }
  private static String display(List<?> list) {
    return "List is not recognized";
  }
  public static void main(String[] args) {
    List<?>[] invokeAll = new List<?>[] {
      new ArrayList<Integer>(),
      new LinkedList<String>(),              コンパイル時の型はList
      new Vector<Integer>() };
    for (List<?> i : invokeAll) {
      System.out.println(display(i));
    }
  }
}

       3つ全てについて”List is not recognized”と出力される




                                 14
メソッドオーバーロードを乱用しない
                                            適合コード
public class Overloader {
  private static String display(List<?> l) {
    return (l instanceof ArrayList ? "Arraylist" :
      (l instanceof LinkedList ? "LinkedList" :
      "List is not recognized"));
  }
                                             実行時に引数の型を識
  public static void main(String[] args) {
    List<?>[] invokeAll = new List<?>[] {    別するには、
      new ArrayList<Integer>(),              instanceof()を使う
      new LinkedList<String>(),
      new Vector<Integer>() };

        for (List<?> i : invokeAll) {
          System.out.println(display(i));
        }
    }
}



                               15
メソッドオーバーロードを乱用しない
                                                            違反コード
// Effective Java, 項目 41
public class SetList {
  public static void main(String[] args){
    Set<Integer> set = new TreeSet<Integer>();
    List<Integer> list = new ArrayList<Integer>();

        for (int i=-3; i<3; i++){
          set.add(i);
          list.add(i);
        }                          boolean TreeSet<Integer>.remove(Object o)
        for (int i=0; i<3; i++){   Integer ArrayList<Integer>.remove(int index)
                                   boolean ArrayList<Integer>.remove(Object o)
          set.remove(i);
          list.remove(i);
        }
        System.out.println(set + " " + list);
    }                                         ArrayListには動作の異なる2つの
}
                                              remove()メソッドが提供されている


                                     16
メソッドオーバーロードを乱用しない
‣ 実行例
$ java SetList
[-3, -2, -1] [-2, 0, 2]
$

                [-3,-2,-1] [-3,-2,-1]にならないのはなぜ?




                          17
メソッドオーバーロードを乱用しない
‣ set.remove(i)の動作


 [-3,-2,-1,0,1,2]
                     set.remove(0)
                                     (int)0がautoboxing
                                     により(Integer)0になる


  [-3,-2,-1,1,2]     set.remove(1)
                                     (int)1がautoboxing
                                     により(Integer)1になる


   [-3,-2,-1,2]      set.remove(2)
                                     (int)2がautoboxing
                                     により(Integer)2になる


   [-3,-2,-1]




                          18
メソッドオーバーロードを乱用しない
‣ list.remove(i)の動作


 [-3,-2,-1,0,1,2]
                      list.remove(0)
                                       remove(int)が呼び出される



  [-2,-1,0,1,2]       list.remove(1)
                                       remove(int)が呼び出される



   [-2,0,1,2]         list.remove(2)
                                       remove(int)が呼び出される



    [-2,0,2]




                           19
メソッドオーバーロードを乱用しない
                                                             適合コード
// Effective Java, 項目 41
public class SetList {
  public static void main(String[] args){
    Set<Integer> set = new TreeSet<Integer>();
    List<Integer> list = new ArrayList<Integer>();

        for (int i=-3; i<3; i++){
          set.add(i);
          list.add(i);
        }
        for (int i=0; i<3; i++){
          set.remove(i);
          list.remove((Integer)i); // あるいは (Integer.ValueOf(i))
        }
        System.out.println(set + " " + list);
    }
}




                                        20
まとめ
‣ オーバーロードを乱用するとコードの可読性が下がり、メソッ
  ドを誤用する危険が増す
‣ なるべくオーバーロードを避け、異なる名前のメソッドを実装
  するほうが安全


  メソッドをオーバーロードできるからと言っ
  て、オーバーロードすべきではありません。一
  般的には、同じ数のパラメータを持つ複数の
  シグニチャでメソッドをオーバーロードするこ
  とは控えるべきです。

                   Effective Java, 項目41




              21
セキュリティ




         22
privateのフィールドやメソッドにアクセス?

public class Example {
  private int i = 3;
  private int j = 4;

    private void zeroI() {
      this.i = 0;
    }
}



Example e = new Example();
System.out.println("" + e.i);
e.i = 10;
e.zeroI();
          他のクラスからprivateのiやj、zeroI()にアクセスできる?



                             23
リフレクション

 クラスとオブジェクトに関するリフレクト情報を取得するクラス
 およびインタフェースを提供します。リフレクションを使用する
 と、ロードされたクラスのフィールド、メソッド、およびコンス
 トラクタに関する情報へのプログラム化されたアクセスを実行
 し、リフレクトされたフィールド、メソッド、およびコンストラ
 クタを使ってセキュリティーの制約内で基本となる対応部分を操
 作できます。

 必要な ReflectPermission が利用できる場合、
 AccessibleObject は、アクセスチェックの抑制を可能にしま
 す。



           http://docs.oracle.com/javase/jp/6/api/java/lang/reflect/package-summary.html


                               24
リフレクションを使うと

try {
  Class<Example> c = Example.class;
  Example example = new Example();

  Field field = c.getDeclaredField("i");
  field.setAccessible(true);
  System.out.println("" + field.get(example));

} catch (Exception ex) {                 privateのフィールドに
  ex.printStackTrace(System.out);        アクセスできる
}



        setAccessibleを有効にするとリフレクションを
       使って通常アクセスできないところにアクセスできる



                           25
リフレクションを使うと

try {
  Class<Example> c = Example.class;
  Example example = new Example();

  Method method = c.getDeclaredMethod("zeroI");
  method.setAccessible(true);
  Object ret = method.invoke(example);     privateのメソッドにも
                                           アクセスできる
  Field field = c.getDeclaredField("i");
  field.setAccessible(true);

  System.out.println("" + field.get(example));
} catch (Exception ex) {
  ex.printStackTrace(System.out);
}




                           26
リフレクション




セキュリティマネージャで
 制限することができる



          27
セキュリティマネージャ

 セキュリティーマネージャーとは、アプリケーションがセ
 キュリティーポリシーを実装できるクラスです。

 セキュリティーマネージャーを使えば、セキュリティーを
 損なう恐れのある操作を実行する前に、操作が何であるか
 ということと、セキュリティーコンテキスト内でその操作
 の実行が許可されているかどうかがアプリケーションから
 判断できます。

 アプリケーションは、そのような操作を禁止したり許可し
 たりすることができます。

          http://docs.oracle.com/javase/jp/6/api/java/lang/SecurityManager.html


                      28
Java : セキュリティモデル
‣ サンドボックスによって保護されている
  ‣ セキュリティポリシーにもとづいて操作を許可する
    ‣ 許可されていない操作をすると例外が発生




例えば:Javaアプレットは


        ‣ ローカルのリソースにはアクセス出来ない
        ‣ ダウンロード元のサーバとのみ通信可




                 29
セキュリティマネージャを使う

                                                      違反コード
import java.util.Hashtable;

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

    public void removeEntry(Object key) {
      ht.remove(key);
    }

    // 中略
}




‣ removeEntry()がpublic
    ‣ 悪意ある攻撃者が自由に呼び出せる



                                  30
セキュリティマネージャを使う

                                                          適合コード
import java.util.Hashtable;

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

    public final void removeEntry(Object key) {
      check("removeKeyPermission");
      ht.remove(key);
    }

    private void check(String directive) {
      SecurityManager sm = System.getSecurityManager();
      if (sm != null) {
        sm.checkSecurityAccess(directive);
      }
    }

    // 中略
}

                                  31
セキュリティポリシーファイル

       指定した署名で署名されているクラスに許可を与える

                           指定したディレクトリからロードされたクラスに許可を与える



grant SignedBy “hogehoge” codeBase "file:${user.dir}/sensitive" {
     permission java.security.SecurityPermission "removeKeyPermission";
};




            http://docs.oracle.com/javase/jp/6/technotes/guides/security/spec/security-spec.doc3.html#20128


                                                 32
policytool




 付属のPolicy Toolユーティリティを使用して、
  ポリシーファイルを作成することもできる。


             http://docs.oracle.com/javase/jp/6/technotes/guides/security/PolicyGuide.html

                                   33
実行してみる




$ java -Djava.security.manager   -Djava.security.policy=my.policy -

classpath “./sensitive:./” UseHash




                                  34
セキュリティマネージャを使う

                                                       適合コード
import java.util.Hashtable;
import java.security.AccessController;
import java.security.SecurityPermission;

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

    public final void removeEntry(Object key) {
      check("removeKeyPermission");
      ht.remove(key);
    }

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

    // 中略
}                                      AccessController#checkPermission
                                        を呼び出すこの方法が推奨されている
                                  35
ファイナライザ




      36
finalize()メソッド



  クラス Object には, finalize と呼ばれる protected
  メソッドが用意されており, 他のクラスからこのメソッド
  をオーバーライドすることができる。あるオブジェクト
  に対して起動可能な特定の finalize 定義は, そのオブ
  ジェクトのファイナライザ(finalizer)と呼ばれる。



            Java言語仕様第3版、§12.6 クラス・インスタンスのファイナライズ




                      37
finalize()メソッド

public class Object {
  ......
  ......
  protected void finalize() throws Throwable
  ......
  ......
}



    このオブジェクトへの参照はもうないとガベージコレクションによって
    判断されたときに、ガベージコレクタによって呼び出されます。サブク
    ラスは finalize メソッドをオーバーライドして、システムリソースを
    破棄したり、その他のクリーンアップを行ったりすることができます。



                        JavaSE6 API仕様、クラスObject, finalizeメソッドの説明




                            38
finalize()メソッドを使わない

‣ finalizeメソッドの利用に関しては数々の問題が存在するた
 め、その利用は例外的場合に限るべき

 ‣ 実行に関して無保証
 ‣ 並行実行の可能性
 ‣ 例外の扱い
 ‣ リソース一般の後処理には使えない




                39
実行されるかどうか無保証

‣ finalizeメソッドは実行されるとは限らない
 ‣ メモリに余裕があればGCは働かない
   ‣ finalize メソッドも実行されない



  ‣オブジェクトの状態をファイルに保存するなどの終了
  処理をfinalizeメソッドで実行してはいけない
  ‣実行タイミングが重要な処理をfinalizeメソッドで
  実行してはいけない




                  40
実行順序や並行実行の可能性, 例外の扱い

‣ finalizeメソッドの実行順序

 プログラミング言語 Java では, ファイナライズ・メソッドの呼び
 出し順序を規定していない。このためファイナライザはさまざ
 まな順序で呼び出され, 並列的に呼び出される可能性もある。


          Java言語仕様第3版、§12.6.2 ファイナライザの起動は順序付けられていない




‣ 複数の(オブジェクトの)finalizeメソッドの実行順序は指定できない
‣ 複数の(オブジェクトの)finalizeメソッドが並列に実行されるかも
‣ finalizeメソッドのなかからスローされた例外は無視される
 ‣ finalize メソッドの実行自体は中断


                      41
リソース一般の後処理には使えない

‣ finalizeメソッドとリソース管理
 ‣ finalizeメソッドの実行はメモリの使用状況に依存
 ‣ メモリ以外のリソースの空き状況は関係しない

‣ 結果:空きメモリが潤沢でも他のリソースが枯渇する可能性
 ‣ GCが実行されない→finalizeメソッドも実行されない
 ‣ DoS攻撃の危険性



 注意!!
 finalizeメソッドは C++ の destructor とは違います



                     42
リソース一般の後処理には使えない
‣ リソース一般の後処理には Closeable インタフェースと try-with-
  resources 構文を活用すべき


 ‣ リソース... 使用開始時にオープン/使用終了時にクローズするもの
    ‣ ストリームのclose メソッド, Timerのcancel メソッド,
      Graphics の dispose メソッドなど
 ‣ Closeable インタフェースを実装... close() メソッドを持っている




              try-with-resources て東京セミナpart3 で
              ちらっと紹介したよね!




                         43
finalize()を使う場合の注意点

‣ 時間のかかる処理を行うべきではない
‣ 明示的に行うべきクローズ処理の最終チェック手
  段として使う
‣ finalize() メソッドをオーバライドする場合, 親ク
  ラスの finalize() 呼び出しを忘れずに行う




               44
finalizer guardian

サブクラスで finalize() メソッドをオーバライドしている状況
で, 親クラスの finalize() 呼び出しを保証するための手法

public class Foo {

    private final Object finalizerGuardian
      = new Object() {
          @Override protected void finalize()
                                     throws Throwable {
            ...... 外側のオブジェクトをファイナライズする ......
             }
        };

    ......
}




                           45
ファイナライザに関連するコーディングルール

‣ FIO04-J. 不要になったらリソースを解放する
‣ FIO14-J. プログラムの終了時には適切なクリーンアップを行う
‣ MET12-J. ファイナライザは使わない




                   46
攻撃手法の紹介:
ファイナライザー攻撃



      47
概要
‣ ライセンス認証を行うサンプルアプリケーションに対し、Java
  コードを追加するだけで認証回避を行う攻撃手法




‣ finalize()メソッドを悪用するため、「ファイナライザー攻撃」
  と呼ばれる手法




                48
サンプルアプリケーションの構成
‣ アプリ本体: Application クラス
‣ アプリ本体の実行に先立って、ライセンス認証を行う
  ‣ LicenseManagerクラス: ライセンス情報の確認
  ‣ SecuritySystemクラス: 認証完了したことを記録


LicenseManager
 コンストラクタ中に
 ライセンス確認処理

                 SecuritySystem
                 LicenseManagerの
                 インスタンスを登録

                                   Application
                                     本体実行


                       49
サンプルアプリケーション(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

                                                      50
サンプルアプリケーション(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");
    }
}



‣ 正しいライセンス情報を持っていないと......
  ‣ LicenseManagerのインスタンス生成時に例外発生
‣ LicenseManager のインスタンスを登録しないと......
  ‣ SecuritySystem.register() で例外発生
‣
                               51
サンプルアプリケーション実行例


% ls *.java
Application.java   LicenseManager.java   SecuritySystem.java
% javac *.java
% java Application
License Manager invalid!
%
                                   たしかに認証失敗している




                              52
サンプルアプリケーションを攻撃する
‣ 攻撃目的
 ‣ LicenseManager のセキュリティチェックを回避し、
  Application.main() を実行する
‣ 前提条件
  ‣ これらのクラスはすべて変更できないものとする

‣ 攻撃方針
 ‣ LicenseManagerのサブクラスを作成し、攻撃者のアプリ(後
  述のAttackerApp)に脆弱なアプリApplicationを読み込む
 ‣ 問題
   ‣ LicenseManagerのサブクラスを作っても、サブクラスで
    は、親クラスでスローされる例外をキャッチできない…


                    53
親クラスでスローされる例外を悪用できれば…

public class MyApplication {
  public static void main(String[] args) {
    MyLicenseManager lm;
    try {
      lm = new MyLicenseManager();
    } catch(SecurityException ex) {
      lm = null;
    }
    SecuritySystem.register(lm);
    // Applicationのメインメソッドを呼ぶ
        Application.main(args);
    }
}

public class MyLicenseManager extends LicenseManager {
  public MyLicenseManager() {
    System.out.println("Created MyLicenseManager");
  }
}



‣ MyApplication を実行すると…                                  このやり方ではうまく
    ‣ License Manager invalid!                            攻撃できない



                                       54
finalize()メソッドの悪用
‣ SecuritySystem に LicenseManager のインスタンスを登
    録できれば勝ち
    ‣ しかもサンプルアプリケーションではLicenseManagerのイ
     ンスタンスの中身はチェックしていない
‣ LicenseManagerのインスタンス欲しい
‣    ライセンス情報を持っていない場合、コンストラクタ実行中
    に例外が発生するので、生成途中で捨てられている
‣ finalize()を使えば、GCされる直前に拾うことができる!




                     55
ファイナライザー攻撃を行うコード
                                                                    攻撃コード
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) {                           finalize()メソッド
       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");
    }
}


                                           56
ファイナライザー攻撃を行うコード
                                                           攻撃コード
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);
  }
}



                              LicenseManagerInterceptor.make()の返り値は、
                             GC直前に拾い上げたLicenseManagerInterceptor
                                            のインスタンス




                                    57
ファイナライザ攻撃の流れ

LicenseManagerInterceptor                   例外を捕捉し、GCが
                                     finalize()メソッドを起動するのを待つ
   親クラスLicenseManagerの
   ライセンス確認処理で例外発生




        初期化途中だったLicenseManager              やがて、GCによって
             のインスタンスを取得                      finalize()起動




SecuritySystem                              SecuritySystemにはすでに
                            Application
                                          LicenseManagerのインスタンスが
 LicenseManagerの              本体実行
 インスタンスを登録                                登録されているため、ライセンス
                                           認証は完了したと思わされる


                               58
攻撃コード実行例

% 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
%




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




                 60

Más contenido relacionado

La actualidad más candente

ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用
nagise
 
PFDS 10.2.1 lists with efficient catenation
PFDS 10.2.1 lists with efficient catenationPFDS 10.2.1 lists with efficient catenation
PFDS 10.2.1 lists with efficient catenation
昌平 村山
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
Haruka Ozaki
 
Juliaによる予測モデル構築・評価
Juliaによる予測モデル構築・評価Juliaによる予測モデル構築・評価
Juliaによる予測モデル構築・評価
Shintaro Fukushima
 

La actualidad más candente (20)

Chapter 6: Computing on the language (R Language Definition)
Chapter 6: Computing on the language (R Language Definition)Chapter 6: Computing on the language (R Language Definition)
Chapter 6: Computing on the language (R Language Definition)
 
Project lambda
Project lambdaProject lambda
Project lambda
 
ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用
 
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
 
Active Directoryデータの Security Descriptor
Active Directoryデータの Security DescriptorActive Directoryデータの Security Descriptor
Active Directoryデータの Security Descriptor
 
Juliaで並列計算
Juliaで並列計算Juliaで並列計算
Juliaで並列計算
 
PFDS 10.2.1 lists with efficient catenation
PFDS 10.2.1 lists with efficient catenationPFDS 10.2.1 lists with efficient catenation
PFDS 10.2.1 lists with efficient catenation
 
Introduction Xtend
Introduction XtendIntroduction Xtend
Introduction Xtend
 
Metaprogramming in JuliaLang
Metaprogramming in JuliaLangMetaprogramming in JuliaLang
Metaprogramming in JuliaLang
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPI
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
 
Java8のstreamをダラダラまとめてみる
Java8のstreamをダラダラまとめてみるJava8のstreamをダラダラまとめてみる
Java8のstreamをダラダラまとめてみる
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
 
Scala with DDD
Scala with DDDScala with DDD
Scala with DDD
 
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fallジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
 
Actor&stm
Actor&stmActor&stm
Actor&stm
 
Java8勉強会
Java8勉強会Java8勉強会
Java8勉強会
 
Juliaによる予測モデル構築・評価
Juliaによる予測モデル構築・評価Juliaによる予測モデル構築・評価
Juliaによる予測モデル構築・評価
 

Similar a Javaセキュアコーディングセミナー東京第4回講義

Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説
JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習
JPCERT Coordination Center
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会
Takinami Kei
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 
Java puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta JapanJava puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta Japan
Yoshio Terada
 
Javaセキュアコーディングセミナー東京第1回 演習
Javaセキュアコーディングセミナー東京第1回 演習Javaセキュアコーディングセミナー東京第1回 演習
Javaセキュアコーディングセミナー東京第1回 演習
JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説
JPCERT Coordination Center
 
G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)
Nobuhiro Sue
 
Javaプログラミング入門【第6回】
Javaプログラミング入門【第6回】Javaプログラミング入門【第6回】
Javaプログラミング入門【第6回】
Yukiko Kato
 
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについてAndroidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
Shoichi Takagi
 

Similar a Javaセキュアコーディングセミナー東京第4回講義 (20)

Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会
 
Junit4
Junit4Junit4
Junit4
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
from old Java to modern Java
from old Java to modern Javafrom old Java to modern Java
from old Java to modern Java
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016
 
Java puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta JapanJava puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta Japan
 
Javaセキュアコーディングセミナー東京第1回 演習
Javaセキュアコーディングセミナー東京第1回 演習Javaセキュアコーディングセミナー東京第1回 演習
Javaセキュアコーディングセミナー東京第1回 演習
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRuby
 
Template method #dezapatan
Template method #dezapatanTemplate method #dezapatan
Template method #dezapatan
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
 
Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使う
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~
 
G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)
 
Javaプログラミング入門【第6回】
Javaプログラミング入門【第6回】Javaプログラミング入門【第6回】
Javaプログラミング入門【第6回】
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについてAndroidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
 
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512
 

Más de JPCERT Coordination Center

デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
JPCERT Coordination Center
 
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
JPCERT Coordination Center
 
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
JPCERT Coordination Center
 

Más de JPCERT Coordination Center (20)

いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
 
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
 
DLL読み込みの問題を読み解く
DLL読み込みの問題を読み解くDLL読み込みの問題を読み解く
DLL読み込みの問題を読み解く
 
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
 
脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる
 
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
 
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
 
クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
 
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデル
 
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL VulnerabilitiesLessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
 
Android Secure Coding
Android Secure CodingAndroid Secure Coding
Android Secure Coding
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
 
Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備
 
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
 
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
 

Javaセキュアコーディングセミナー東京第4回講義