SlideShare a Scribd company logo
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

More Related Content

PPTX
C#を始めたばかりの人へのLINQ to Objects
PDF
ゆるふわJava8入門
PDF
Android Lecture #03 @PRO&BSC Inc.
PDF
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
PDF
from old java to java8 - KanJava Edition
PDF
Javaセキュアコーディングセミナー東京第1回演習の解説
PPTX
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
PPTX
Chapter 6: Computing on the language (R Language Definition)
C#を始めたばかりの人へのLINQ to Objects
ゆるふわJava8入門
Android Lecture #03 @PRO&BSC Inc.
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
from old java to java8 - KanJava Edition
Javaセキュアコーディングセミナー東京第1回演習の解説
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
Chapter 6: Computing on the language (R Language Definition)

What's hot (20)

PPTX
PPT
ジェネリクスの基礎と クラス設計への応用
PPTX
CakePHP+Smartyハイブリッドによるラクラク開発
PDF
JavaのGenericsとは?
PPTX
Active Directoryデータの Security Descriptor
PDF
Juliaで並列計算
PDF
PFDS 10.2.1 lists with efficient catenation
PDF
Introduction Xtend
PDF
Metaprogramming in JuliaLang
PPTX
Javaプログラミング入門【第2回】
PDF
Pythonで始めるDropboxAPI
PDF
Scala の関数型プログラミングを支える技術
PDF
Java8のstreamをダラダラまとめてみる
PPT
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
PDF
Scala with DDD
PPT
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
KEY
Actor&stm
PPTX
Java8勉強会
PDF
Juliaによる予測モデル構築・評価
PDF
XP寺子屋第9回「シンプル・プログラミング」
ジェネリクスの基礎と クラス設計への応用
CakePHP+Smartyハイブリッドによるラクラク開発
JavaのGenericsとは?
Active Directoryデータの Security Descriptor
Juliaで並列計算
PFDS 10.2.1 lists with efficient catenation
Introduction Xtend
Metaprogramming in JuliaLang
Javaプログラミング入門【第2回】
Pythonで始めるDropboxAPI
Scala の関数型プログラミングを支える技術
Java8のstreamをダラダラまとめてみる
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
Scala with DDD
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
Actor&stm
Java8勉強会
Juliaによる予測モデル構築・評価
XP寺子屋第9回「シンプル・プログラミング」
Ad

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

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

More from JPCERT Coordination Center (20)

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

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