SlideShare a Scribd company logo
1 of 18
Download to read offline
Javaセキュアコーディングセミナー東京
第2回
数値データの取扱いと入力値の検証
演習解説

2012年10月14日(日)
JPCERTコーディネーションセンター
脆弱性解析チーム
戸田 洋三




                      1
‣Hands-on Exercises
 ‣ サンプルコード Unzip を修正しよう
 ‣ サンプルコード AltConst を修正しよう




                2
Hands-on Exercise(1)

‣サンプルコード Unzip を
‣修正しよう




                       3
ZipBombの影響を受けるコード例
class Unzip {
 static final int BUFFER = 512;

    public static void main(String[] args) throws FileNotFoundException,IOException {
      BufferedOutputStream dest = null;
      ZipInputStream zis =
          new ZipInputStream(new BufferedInputStream(new FileInputStream(args[0])));
      ZipEntry entry;
      while ((entry = zis.getNextEntry()) != null){
         System.out.println(“Extracting: “ + entry);
         int count;
         byte data[] = new byte[BUFFER];
         FileOutputStream fos = new FileOutputStream(entry.getName());
         dest = new BufferedOutputStream(fos, BUFFER);
         while ((count=zis.read(data,0,BUFFER)) != -1){
            dest.write(data, 0, count);
         }
         dest.flush();
         dest.close();
      }
      zis.close();
    }
}

                                                  4
コード例 Unzip の問題点

(A) 解凍後のサイズをチェックしていない
(B) 例外 ArrayIndexOutOfBoundsException が発生
  する可能性がある
(C) 既存ファイルを上書きする可能性がある
(D) その他?




          これらの問題点を解決せよ!!



                    5
コード例 Unzip の問題点

(A) 解凍後のサイズをチェックしていない
(B) 例外 ArrayIndexOutOfBoundsException が発生
   する可能性がある
 (A)の対応
(C) 既存ファイルを上書きする可能性がある
 セミナ内で説明済み
(D) その他?




                    6
コード例 Unzip の問題点

(A) 解凍後のサイズをチェックしていない
(B) 例外 ArrayIndexOutOfBoundsException が発生
  する可能性がある
(C) 既存ファイルを上書きする可能性がある
(B)の対応
(D) その他?
例外 ArrayIndexOutOfBoundsException の発生原因は?
⇒ コマンドライン引数にファイル名が与えられることを想定して
いるため, 引数がない場合に例外が発生する
⇒ 引数の数をチェックしましょう




                    7
コード例 Unzip の問題点

(A) 解凍後のサイズをチェックしていない
(B) 例外 ArrayIndexOutOfBoundsException が発生
  する可能性がある
(C) 既存ファイルを上書きする可能性がある
(B)の対応
(D) その他?
例外 ArrayIndexOutOfBoundsException の発生原因は?
⇒ コマンドライン引数にファイル名が与えられることを想定して
いるため, 引数がない場合に例外が発生する
⇒ 引数の数をチェックしましょう


          あるいは…
          引数の数だけ処理を繰り返す
          (引数がなければそのまま終了)

                    8
コード例 Unzip の問題点

(A) 解凍後のサイズをチェックしていない
(B) 例外 ArrayIndexOutOfBoundsException が発生
  する可能性がある
(C) 既存ファイルを上書きする可能性がある
(D) その他?

(C)の対応
ファイル出力の前に, すでにファイルが存在していないかどう
かチェックする




                    9
修正コード例(1/2)
class Unzip {
 static final int TOOBIG = 10000000;
 static final int BUFFER = 512;

 public static void main(String[] args) throws FileNotFoundException,IOException {
  if (args.length <= 0) return;
  BufferedOutputStream dest = null;
  ZipInputStream zis =
     new ZipInputStream(new BufferedInputStream(new FileInputStream(args[0])));
  ZipEntry entry;
  while ((entry = zis.getNextEntry()) != null){
     if (entry.getSize () > TOOBIG) {
         throw new IllegalStateException(
                         “uncompressed size too huge: “ + entry.getName());
     }
     if (entry.getSize() == -1){
          throw new IllegalStateException(“uncompressed size unknown”);
     }

(…次のページに続く…)


                                               10
修正コード例(2/2)


(… 前のページから…)
          System.out.println(“Extracting: “ + entry);
          int count;
          byte data[] = new byte[BUFFER];
           Path path = FileSystems.getDefault().getPath(entry.getName());
           Files.createFile(path); // exception if file already exists
          FileOutputStream fos = new FileOutputStream(entry.getName());
          dest = new BufferedOutputStream(fos, BUFFER);
          while ((count=zis.read(data,0,BUFFER)) != -1){
             dest.write(data, 0, count);
          }
          dest.flush();
          dest.close();
        }
        zis.close();
    }
}




                                                        11
Hands-on Exercise(2)

‣サンプルコード AltConst を
‣修正しよう




                       12
Q. 以下のコードの問題点は何か?
class AltConst {
  int i;
  AltConst(){ this(10); }
  AltConst(int i0){
    if (checkarg(i0)) {
      this.i = i0;
    }
  }
  boolean checkarg(int i) throws IllegalArgumentException {
    if (i<0 || 100<i) {
      throw new IllegalArgumentException("arg should be positive < 100.");
    }
    return true;
                     (A) コンパイルエラーに なる
  }
}
                     (B) checkarg() による引数のチェックは役に立たない
             (C) コンストラクタが二つ定義されている
             (D) フィールド i に初期化子がない



                                   13
A. 以下のコードの問題点は何か?
class AltConst {
  int i;
  AltConst(){ this(10); }
  AltConst(int i0){
    if (checkarg(i0)) {
      this.i = i0;
    }
  }
  boolean checkarg(int i) throws IllegalArgumentException {
    if (i<0 || 100<i) {
      throw new IllegalArgumentException("arg should be positive < 100.");
    }
    return true;
                     (A) コンパイルエラーに なる
  }
}
                     (B) checkarg() による引数のチェックは役に立たない
             (C) コンストラクタが二つ定義されている
             (D) フィールド i に初期化子がない



                                   14
A. 以下のコードの問題点は何か?

AltConst のサブクラスをつくることにより, checkarg() による
チェックの後でフィールド i の値を変更できる.

class attack extends AltConst {
  attack(int arg) {
    super();
    this.i = arg;
  }
  public static void main(String[] args) {
    AltConst a = new attack(101);
    System.out.println("attack.i: " + a.i);
  }
}


                                    15
A. 以下のコードの問題点は何か?

AltConst のサブクラスをつくることにより, checkarg() による
チェックの後でフィールド i の値を変更できる.

class attack extends AltConst {
  attack(int arg) {
    super();
                              サブクラス化による攻撃への対策を
    this.i = arg;
                                            行え!!
  }
  public static void main(String[] args) {
    AltConst a = new attack(101);
    System.out.println("attack.i: " + a.i);
  }
}


                     16
サブクラス化による攻撃への対策

A) サブクラスをつくれないように final ク
   ラスにする
B) 初期化後の i フィールドを変更されない
   よう final 宣言あるいは private 宣言する
         B)の場合, checkarg() もオーバーライ
          ドされないように final 宣言すべし




                17
Altconst クラスに対するコメント

         そもそも checkarg() メソッドって検証成
         功で true を返し, 検証失敗では例外を投
         げるってなんかアンバランスだよね.

検証結果を true/false で返すか, void型の
メソッドにして検証失敗のときは例外を
投げるってしたほうがきれいだよね.


         例外を投げるタイプだと, オブジェクトの
         初期化が途中終了しちゃうからファイナ
         ライザ攻撃の危険あるかもね.


                  18

More Related Content

What's hot

LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLShinichiAoyagi
 
Unit test in android
Unit test in androidUnit test in android
Unit test in androidTatsuya Maki
 
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 201512Takefumi MIYOSHI
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」Mr. Vengineer
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Mr. Vengineer
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習JPCERT Coordination Center
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALegtra
 
64ビット対応Dllインジェクション
64ビット対応Dllインジェクション64ビット対応Dllインジェクション
64ビット対応DllインジェクションShinichi Hirauchi
 
[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long
[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long
[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin LongCODE BLUE
 
Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説JPCERT Coordination Center
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36Tatsuki SHIMIZU
 
LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!Kouji Matsui
 
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Uehara Junji
 

What's hot (20)

LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
Unit test in android
Unit test in androidUnit test in android
Unit test in 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
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析
 
Junit4
Junit4Junit4
Junit4
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
 
VerilatorとSystemC
VerilatorとSystemCVerilatorとSystemC
VerilatorとSystemC
 
64ビット対応Dllインジェクション
64ビット対応Dllインジェクション64ビット対応Dllインジェクション
64ビット対応Dllインジェクション
 
[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long
[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long
[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long
 
Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36
 
Effective modern-c++#9
Effective modern-c++#9Effective modern-c++#9
Effective modern-c++#9
 
Sharing Deep Dive
Sharing Deep DiveSharing Deep Dive
Sharing Deep Dive
 
LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!
 
Rx java x retrofit
Rx java x retrofitRx java x retrofit
Rx java x retrofit
 
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418
 

Viewers also liked

Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)JPCERT Coordination Center
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルJPCERT Coordination Center
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性JPCERT Coordination Center
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)JPCERT Coordination Center
 
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」JPCERT Coordination Center
 
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...JPCERT Coordination Center
 
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)JPCERT Coordination Center
 
クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策JPCERT Coordination Center
 

Viewers also liked (9)

Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデル
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
 
脆弱性事例に学ぶセキュアコーディング「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証明書検証の現状と対策」
 
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
 
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
 
脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる
 
クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策
 

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

Javaセキュアコーディングセミナー東京第1回 演習
Javaセキュアコーディングセミナー東京第1回 演習Javaセキュアコーディングセミナー東京第1回 演習
Javaセキュアコーディングセミナー東京第1回 演習JPCERT Coordination Center
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyHiroshi Nakamura
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccYujiSoftware
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Yoshio Terada
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会Koichi Sakata
 
ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すAromaBlack
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Yuki Higuchi
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。Satoshi Mimura
 
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義JPCERT Coordination Center
 
Zynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチZynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチMr. Vengineer
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 TipsTakaaki Suzuki
 
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
“Design and Implementation of Generics for the .NET Common Language Runtime”他...“Design and Implementation of Generics for the .NET Common Language Runtime”他...
“Design and Implementation of Generics for the .NET Common Language Runtime”他...Masahiro Sakai
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)Takuya Tsuchida
 

Similar to Javaセキュアコーディングセミナー東京第2回演習の解説 (20)

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
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
C#6.0の新機能紹介
C#6.0の新機能紹介C#6.0の新機能紹介
C#6.0の新機能紹介
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会
 
Boost Tour 1.53.0 merge
Boost Tour 1.53.0 mergeBoost Tour 1.53.0 merge
Boost Tour 1.53.0 merge
 
ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指す
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
 
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義
 
20010901
2001090120010901
20010901
 
Zynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチZynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチ
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
“Design and Implementation of Generics for the .NET Common Language Runtime”他...“Design and Implementation of Generics for the .NET Common Language Runtime”他...
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
 

More from JPCERT Coordination Center

いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~JPCERT Coordination Center
 
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)JPCERT Coordination Center
 
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』JPCERT Coordination Center
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)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
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)JPCERT Coordination Center
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)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
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)JPCERT Coordination Center
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JPCERT Coordination Center
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性JPCERT Coordination Center
 
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性JPCERT Coordination Center
 
Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性JPCERT Coordination Center
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説JPCERT Coordination Center
 

More from JPCERT Coordination Center (19)

いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
 
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (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)
 
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)の脆弱性
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性
 
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性
 
Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
 
Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説
 

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

  • 2. ‣Hands-on Exercises ‣ サンプルコード Unzip を修正しよう ‣ サンプルコード AltConst を修正しよう 2
  • 4. ZipBombの影響を受けるコード例 class Unzip { static final int BUFFER = 512; public static void main(String[] args) throws FileNotFoundException,IOException { BufferedOutputStream dest = null; ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(args[0]))); ZipEntry entry; while ((entry = zis.getNextEntry()) != null){ System.out.println(“Extracting: “ + entry); int count; byte data[] = new byte[BUFFER]; FileOutputStream fos = new FileOutputStream(entry.getName()); dest = new BufferedOutputStream(fos, BUFFER); while ((count=zis.read(data,0,BUFFER)) != -1){ dest.write(data, 0, count); } dest.flush(); dest.close(); } zis.close(); } } 4
  • 5. コード例 Unzip の問題点 (A) 解凍後のサイズをチェックしていない (B) 例外 ArrayIndexOutOfBoundsException が発生 する可能性がある (C) 既存ファイルを上書きする可能性がある (D) その他? これらの問題点を解決せよ!! 5
  • 6. コード例 Unzip の問題点 (A) 解凍後のサイズをチェックしていない (B) 例外 ArrayIndexOutOfBoundsException が発生 する可能性がある (A)の対応 (C) 既存ファイルを上書きする可能性がある セミナ内で説明済み (D) その他? 6
  • 7. コード例 Unzip の問題点 (A) 解凍後のサイズをチェックしていない (B) 例外 ArrayIndexOutOfBoundsException が発生 する可能性がある (C) 既存ファイルを上書きする可能性がある (B)の対応 (D) その他? 例外 ArrayIndexOutOfBoundsException の発生原因は? ⇒ コマンドライン引数にファイル名が与えられることを想定して いるため, 引数がない場合に例外が発生する ⇒ 引数の数をチェックしましょう 7
  • 8. コード例 Unzip の問題点 (A) 解凍後のサイズをチェックしていない (B) 例外 ArrayIndexOutOfBoundsException が発生 する可能性がある (C) 既存ファイルを上書きする可能性がある (B)の対応 (D) その他? 例外 ArrayIndexOutOfBoundsException の発生原因は? ⇒ コマンドライン引数にファイル名が与えられることを想定して いるため, 引数がない場合に例外が発生する ⇒ 引数の数をチェックしましょう あるいは… 引数の数だけ処理を繰り返す (引数がなければそのまま終了) 8
  • 9. コード例 Unzip の問題点 (A) 解凍後のサイズをチェックしていない (B) 例外 ArrayIndexOutOfBoundsException が発生 する可能性がある (C) 既存ファイルを上書きする可能性がある (D) その他? (C)の対応 ファイル出力の前に, すでにファイルが存在していないかどう かチェックする 9
  • 10. 修正コード例(1/2) class Unzip { static final int TOOBIG = 10000000; static final int BUFFER = 512; public static void main(String[] args) throws FileNotFoundException,IOException { if (args.length <= 0) return; BufferedOutputStream dest = null; ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(args[0]))); ZipEntry entry; while ((entry = zis.getNextEntry()) != null){ if (entry.getSize () > TOOBIG) { throw new IllegalStateException( “uncompressed size too huge: “ + entry.getName()); } if (entry.getSize() == -1){ throw new IllegalStateException(“uncompressed size unknown”); } (…次のページに続く…) 10
  • 11. 修正コード例(2/2) (… 前のページから…) System.out.println(“Extracting: “ + entry); int count; byte data[] = new byte[BUFFER]; Path path = FileSystems.getDefault().getPath(entry.getName()); Files.createFile(path); // exception if file already exists FileOutputStream fos = new FileOutputStream(entry.getName()); dest = new BufferedOutputStream(fos, BUFFER); while ((count=zis.read(data,0,BUFFER)) != -1){ dest.write(data, 0, count); } dest.flush(); dest.close(); } zis.close(); } } 11
  • 13. Q. 以下のコードの問題点は何か? class AltConst { int i; AltConst(){ this(10); } AltConst(int i0){ if (checkarg(i0)) { this.i = i0; } } boolean checkarg(int i) throws IllegalArgumentException { if (i<0 || 100<i) { throw new IllegalArgumentException("arg should be positive < 100."); } return true; (A) コンパイルエラーに なる } } (B) checkarg() による引数のチェックは役に立たない (C) コンストラクタが二つ定義されている (D) フィールド i に初期化子がない 13
  • 14. A. 以下のコードの問題点は何か? class AltConst { int i; AltConst(){ this(10); } AltConst(int i0){ if (checkarg(i0)) { this.i = i0; } } boolean checkarg(int i) throws IllegalArgumentException { if (i<0 || 100<i) { throw new IllegalArgumentException("arg should be positive < 100."); } return true; (A) コンパイルエラーに なる } } (B) checkarg() による引数のチェックは役に立たない (C) コンストラクタが二つ定義されている (D) フィールド i に初期化子がない 14
  • 15. A. 以下のコードの問題点は何か? AltConst のサブクラスをつくることにより, checkarg() による チェックの後でフィールド i の値を変更できる. class attack extends AltConst { attack(int arg) { super(); this.i = arg; } public static void main(String[] args) { AltConst a = new attack(101); System.out.println("attack.i: " + a.i); } } 15
  • 16. A. 以下のコードの問題点は何か? AltConst のサブクラスをつくることにより, checkarg() による チェックの後でフィールド i の値を変更できる. class attack extends AltConst { attack(int arg) { super(); サブクラス化による攻撃への対策を this.i = arg; 行え!! } public static void main(String[] args) { AltConst a = new attack(101); System.out.println("attack.i: " + a.i); } } 16
  • 17. サブクラス化による攻撃への対策 A) サブクラスをつくれないように final ク ラスにする B) 初期化後の i フィールドを変更されない よう final 宣言あるいは private 宣言する B)の場合, checkarg() もオーバーライ ドされないように final 宣言すべし 17
  • 18. Altconst クラスに対するコメント そもそも checkarg() メソッドって検証成 功で true を返し, 検証失敗では例外を投 げるってなんかアンバランスだよね. 検証結果を true/false で返すか, void型の メソッドにして検証失敗のときは例外を 投げるってしたほうがきれいだよね. 例外を投げるタイプだと, オブジェクトの 初期化が途中終了しちゃうからファイナ ライザ攻撃の危険あるかもね. 18