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

PDF
Javaセキュアコーディングセミナー東京第2回演習
PDF
Javaセキュアコーディングセミナー東京第3回演習の解説
PDF
Async design with Unity3D
PPTX
An other world awaits you
PDF
Javaセキュアコーディングセミナー東京第3回講義
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PDF
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
Javaセキュアコーディングセミナー東京第2回演習
Javaセキュアコーディングセミナー東京第3回演習の解説
Async design with Unity3D
An other world awaits you
Javaセキュアコーディングセミナー東京第3回講義
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020

What's hot (20)

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

Viewers also liked (9)

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

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

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

More from JPCERT Coordination Center (19)

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