SlideShare a Scribd company logo
Javaセキュアコーディングセミナー東京
第3回
入出力と例外時の動作
演習の解説

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




                      1
‣Hands-on Exercises
 ‣ コンパイルエラーに対処しよう
 ‣ ファイルからのデータ入力を実装しよう




              2
Hands-on Exercise(1)

 サンプルコードの
 コンパイルエラーに対処しよう




                       3
以下のコードをコンパイルできるように修正せよ.
class CatFile {
  public static void cat(File file) {
      RandomAccessFile input = null;
      String line = null;

      try {
          input = new RandomAccessFile(file, "r");
          while ((line = input.readLine()) != null) {
              System.out.println(line);
          }
          return;
      } finally {
          if (input != null) {
              input.close();
          }
      }
  }
}
class testCatFile {
  public static void main(String[] args){
    if (args.length >= 1) {
      CatFile.cat(new File(args[0]));
    }
  }
}


                                        4
コンパイルすると...
$ javac testCatFile_CantCompile.java
testCatFile_CantCompile.java:19: error: unreported exception IOException;
must be caught or declared to be thrown
              input.close();
                         ^
testCatFile_CantCompile.java:12: error: unreported exception
FileNotFoundException; must be caught or declared to be thrown
          input = new RandomAccessFile(file, "r");
                  ^
testCatFile_CantCompile.java:13: error: unreported exception IOException;
must be caught or declared to be thrown
          while ((line = input.readLine()) != null) {
                                        ^
3 errors
$



             チェック例外である IOException と
             FileNotFoundException の扱いを記述する
             必要がある.

                                     5
修正例その1
class CatFile {
  public static void cat(File file) {            cat メソッドのなかで
      RandomAccessFile input = null;
      String line = null;                       例外を処理する修正例.
       try {
           input = new RandomAccessFile(file, "r");
           while ((line = input.readLine()) != null) {
               System.out.println(line);
           }
           return;
       } catch (FileNotFoundException e) {
           System.err.println(e.toString());
       } catch (IOException e) {
           System.err.println(e.toString());
       } finally {
           if (input != null) {                      cat メソッドや
             try {
               input.close();                        testCatFile クラスの
             } catch (IOException e) {
                 System.err.println(e.toString());   main メソッドで
             }
 }}}
                                                  throws 宣言する方法も
}                                                 あり.
class testCatFile {
  ... 以下省略 ...

                                        6
修正例その2 (JavaSE7)
class CatFile {
  public static void cat(File file) {
    try (RandomAccessFile input = new RandomAccessFile(file, "r"); ) {

          String line = null;
          while ((line = input.readLine()) != null) {
              System.out.println(line);
          }
          return;
        } catch (FileNotFoundException e) {
              System.err.println(e.toString());
        } catch (IOException e) {
              System.err.println(e.toString());
        }
    }
}



                        try-with-resource 構文を使うことで, 明示的に
                        close() を呼び出す必要がなくなる.




                                         7
Hands-on Exercise(2)

(A)以下の testListOfNumbers.java について、コンパイル
  実行できるようにコードを修正せよ
(B) ListOfNumbers クラスで出力されるファイル
  OutFile.txt から整数を読み込み, その総和を計算す
  るコードを書け
(C)データを読み込んだ後の OutFile.txt を削除するよ
  うに修正せよ. symlink 攻撃を防ぐにはどうすればよ
  いか?


                       8
testListOfNumbers.java (1/3)
/*
 * Copyright (c) 1995, 2008, Oracle and/or its affiliates.
 * All rights reserved.
 */

import java.io.*;
import java.util.Vector;

class ListOfNumbers {
    private Vector<Integer> victor;
    private static final int SIZE = 10;

    public ListOfNumbers () {
        victor = new Vector<Integer>(SIZE);
        for (int i = 0; i < SIZE; i++)
            victor.addElement(new Integer(i));
    }




                                     9
testListOfNumbers.java (2/3)
    public void writeList() {
        PrintWriter out = null;
        try {
             System.out.println("Entering try statement");
             out = new PrintWriter(new FileWriter("OutFile.txt"));
             for (int i = 0; i < SIZE; i++)
                 out.println(victor.elementAt(i));
          } finally {
             if (out != null) {
                 System.out.println("Closing PrintWriter");
                 out.close();
             } else {
                 System.out.println("PrintWriter not open");
             }
        }
    }
}




                                    10
testListOfNumbers.java (3/3)
class testListOfNumbers {
  public static void main(String[] args){
    ListOfNumbers lon = new ListOfNumbers();
    lon.writeList();
  }
}




                                   11
Hands-on Exercise(2)

(A)以下の testListOfNumbers.java について、コンパイル
  実行できるようにコードを修正せよ
(B) ListOfNumbers クラスで出力されるファイル
    OutFile.txt から整数を読み込み, その総和を計算す
 •FileWriter() が IOException をスローする可能性
    るコードを書け
 •elementAt() メソッドが
(C)データを読み込んだ後の OutFile.txt を削除するよ
  ArrayIndexOutOfBoundsException をスローする可能性
    うに修正せよ. symlink 攻撃を防ぐにはどうすればよ
  いか?


                       12
修正例 writeList()
  public void writeList() {
      PrintWriter out = null;
      try {
           System.out.println("Entering try statement");
           out = new PrintWriter(new FileWriter("OutFile.txt"));
           for (int i = 0; i < SIZE; i++)
                out.println(victor.elementAt(i));
        } catch (ArrayIndexOutOfboundsException e) {
             System.err.println(“Caught ArrayIndexOutOfBoundsException: “
                              + e.getMessage());
        } catch (IOException e) {
             System.err.println(“Caught IOException: “ + e.getMessage());
        } finally {
           if (out != null) {
                System.out.println("Closing PrintWriter");
                out.close();
           } else {
                System.out.println("PrintWriter not open");
           }
      }
  }




                                  13
Hands-on Exercise(2)

(A)以下の testListOfNumbers.java について、コンパイル
  実行できるようにコードを修正せよ
(B) ListOfNumbers クラスで出力されるファイル
  OutFile.txt から整数を読み込み, その総和を計算す
  るコードを書け
(C)データを読み込んだ後のでは
   以下のコード例 sum.java OutFile.txt を削除するよ
   うに修正せよ. symlink 攻撃を防ぐにはどうすればよ
   •writeList() に対応して readList() をつくった
  いか?
  •main()メソッドで OutFile.txt を生成するところも
  一緒に入れた
                       14
コード例 sum.java (1/2)
/*
 * sum.java
 *   call ListNumbers to generate outfile.txt
 *   read outfile.txt and compute and print the sum of the numbers
 */

class readList {
  public Vector<Integer> readList(String filename) throws IOException {
    Vector<Integer> victor = new Vector<Integer>();
    try ( BufferedReader in =
                     new BufferedReader(new FileReader(filename)); ) {
        String line;
        while ((line = in.readLine()) != null) {
          victor.addElement(Integer.parseInt(line));
        }
    }
    return victor;
  }
}




                                   15
コード例 sum.java (2/2)
class sum {
  private static final String FILENAME = “OutFile.txt”;

    public static void main(String[] args) throws IOException {
      ListOfNumbers lon = new ListOfNumbers();
      lon.writeList(); // file generated

        System.out.println(“reading...”);
        readList rl = new readList();
        Vector<Integer> v = rl.readList(FILENAME);
        Integer total = 0;
        for (Integer i : v){ total = total + i; }
        System.out.println(“total: “ + total);
    }
}




                                       16
Hands-on Exercise(2)

(A)以下の testListOfNumbers.java について、コンパイル
  以下のコード例 sum1.java では
   実行できるようにコードを修正せよ
 •main() メソッドの最初で, ファイル操作を行うディレクトリが
  セキュアディレクトリであることを確認 (具体的なコードにつ
(B) ListOfNumbers クラスで出力されるファイル
 いては FIO00-J を参照)
  OutFile.txt から整数を読み込み, その総和を計算す
 •main() メソッドの最後でファイルを削除
   るコードを書け
(C)データを読み込んだ後の OutFile.txt を削除するよ
  うに修正せよ. symlink 攻撃を防ぐにはどうすればよ
  いか?


                       17
コード例 sum1.java
class sum1 {
  private static final String FILENAME = “OutFile.txt”;

    public static void main(String[] args) throws IOException {

        // まず最初に, カレントディレクトリがセキュアディレクトリであることを確認する
        // Java セキュアコーディングスタンダード FIO00-J で紹介している
        // isInSecureDir() メソッドを参照 (POSIX系のファイルシステムの場合)
        // https://www.jpcert.or.jp/java-rules/fio00-j.html

        ListOfNumbers lon = new ListOfNumbers();
        lon.writeList(); // file generated

        System.out.println(“reading...”);
        readList rl = new readList();
        Vector<Integer> v = rl.readList(FILENAME);
        Integer total = 0;
        for (Integer i : v){ total = total + i; }
        System.out.println(“total: “ + total);

        File outfile = new File(FILENAME);
        outfile.delete();
    }
}


                                       18

More Related Content

PDF
Javaセキュアコーディングセミナー東京第3回演習
PDF
from old Java to modern Java
PDF
from old java to java8 - KanJava Edition
PDF
Javaセキュアコーディングセミナー東京第3回講義
PDF
Javaセキュアコーディングセミナー東京第2回演習の解説
PPTX
Junit4
PDF
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
PDF
JavaのGenericsとは?
Javaセキュアコーディングセミナー東京第3回演習
from old Java to modern Java
from old java to java8 - KanJava Edition
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第2回演習の解説
Junit4
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
JavaのGenericsとは?

What's hot (20)

KEY
Java7再入門講座
PPT
ジェネリクスの基礎と クラス設計への応用
PDF
Effective java 勉強会
PPTX
Java Puzzlers JJUG CCC 2016
PPTX
Java8 Lambda chapter5
PPTX
C#を始めたばかりの人へのLINQ to Objects
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
ODP
Introduction of Python
PDF
Java puzzlers 2013 at JavaFesta Japan
PDF
Java SE 8 lambdaで変わる プログラミングスタイル
PPT
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
PDF
ECMAScript 6 Features(PDF 版)
PDF
Javaセキュアコーディングセミナー東京第1回 演習
PPTX
DBFlute2017フェスLT資料
PPTX
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
PDF
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
PPTX
【java8 勉強会】 怖くない!ラムダ式, Stream API
PDF
Fork/Join Framework。そしてLambdaへ。
PDF
Xtend - Javaの未来を今すぐ使う
PDF
Unit test in android
Java7再入門講座
ジェネリクスの基礎と クラス設計への応用
Effective java 勉強会
Java Puzzlers JJUG CCC 2016
Java8 Lambda chapter5
C#を始めたばかりの人へのLINQ to Objects
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
Introduction of Python
Java puzzlers 2013 at JavaFesta Japan
Java SE 8 lambdaで変わる プログラミングスタイル
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ECMAScript 6 Features(PDF 版)
Javaセキュアコーディングセミナー東京第1回 演習
DBFlute2017フェスLT資料
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
【java8 勉強会】 怖くない!ラムダ式, Stream API
Fork/Join Framework。そしてLambdaへ。
Xtend - Javaの未来を今すぐ使う
Unit test in android
Ad

Viewers also liked (7)

PDF
Javaセキュアコーディングセミナー東京第1回演習の解説
PDF
Lec 04 program development and programming languages
PDF
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
PPTX
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
PDF
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
PDF
Android Secure Coding
PDF
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
Javaセキュアコーディングセミナー東京第1回演習の解説
Lec 04 program development and programming languages
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
Android Secure Coding
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
Ad

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

PDF
Javaセキュアコーディングセミナー東京第4回講義
PDF
Javaセキュアコーディングセミナー東京第2回演習
PDF
第三回ありえる社内勉強会 「いわががのLombok」
PPTX
Javaプログラミング入門【第6回】
PPTX
PDF
Java SE 7 InvokeDynamic in JRuby
KEY
ひのきのぼうだけで全クリ目指す
PPTX
C#6.0の新機能紹介
PDF
VS勉強会 .NET Framework 入門
PDF
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
PPTX
Visual C++で使えるC++11
PDF
Rakuten tech conf
PDF
Replace Output Iterator and Extend Range JP
PDF
ゆるふわJava8入門
PPTX
20071030
PPTX
pecl-AOPの紹介
PPTX
Enshu8
PPTX
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
PDF
Java x Groovy: improve your java development life
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第2回演習
第三回ありえる社内勉強会 「いわががのLombok」
Javaプログラミング入門【第6回】
Java SE 7 InvokeDynamic in JRuby
ひのきのぼうだけで全クリ目指す
C#6.0の新機能紹介
VS勉強会 .NET Framework 入門
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
Visual C++で使えるC++11
Rakuten tech conf
Replace Output Iterator and Extend Range JP
ゆるふわJava8入門
20071030
pecl-AOPの紹介
Enshu8
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
Java x Groovy: improve your java development life

More from JPCERT Coordination Center (20)

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

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

  • 2. ‣Hands-on Exercises ‣ コンパイルエラーに対処しよう ‣ ファイルからのデータ入力を実装しよう 2
  • 3. Hands-on Exercise(1) サンプルコードの コンパイルエラーに対処しよう 3
  • 4. 以下のコードをコンパイルできるように修正せよ. class CatFile { public static void cat(File file) { RandomAccessFile input = null; String line = null; try { input = new RandomAccessFile(file, "r"); while ((line = input.readLine()) != null) { System.out.println(line); } return; } finally { if (input != null) { input.close(); } } } } class testCatFile { public static void main(String[] args){ if (args.length >= 1) { CatFile.cat(new File(args[0])); } } } 4
  • 5. コンパイルすると... $ javac testCatFile_CantCompile.java testCatFile_CantCompile.java:19: error: unreported exception IOException; must be caught or declared to be thrown input.close(); ^ testCatFile_CantCompile.java:12: error: unreported exception FileNotFoundException; must be caught or declared to be thrown input = new RandomAccessFile(file, "r"); ^ testCatFile_CantCompile.java:13: error: unreported exception IOException; must be caught or declared to be thrown while ((line = input.readLine()) != null) { ^ 3 errors $ チェック例外である IOException と FileNotFoundException の扱いを記述する 必要がある. 5
  • 6. 修正例その1 class CatFile { public static void cat(File file) { cat メソッドのなかで RandomAccessFile input = null; String line = null; 例外を処理する修正例. try { input = new RandomAccessFile(file, "r"); while ((line = input.readLine()) != null) { System.out.println(line); } return; } catch (FileNotFoundException e) { System.err.println(e.toString()); } catch (IOException e) { System.err.println(e.toString()); } finally { if (input != null) { cat メソッドや try { input.close(); testCatFile クラスの } catch (IOException e) { System.err.println(e.toString()); main メソッドで } }}} throws 宣言する方法も } あり. class testCatFile { ... 以下省略 ... 6
  • 7. 修正例その2 (JavaSE7) class CatFile { public static void cat(File file) { try (RandomAccessFile input = new RandomAccessFile(file, "r"); ) { String line = null; while ((line = input.readLine()) != null) { System.out.println(line); } return; } catch (FileNotFoundException e) { System.err.println(e.toString()); } catch (IOException e) { System.err.println(e.toString()); } } } try-with-resource 構文を使うことで, 明示的に close() を呼び出す必要がなくなる. 7
  • 8. Hands-on Exercise(2) (A)以下の testListOfNumbers.java について、コンパイル 実行できるようにコードを修正せよ (B) ListOfNumbers クラスで出力されるファイル OutFile.txt から整数を読み込み, その総和を計算す るコードを書け (C)データを読み込んだ後の OutFile.txt を削除するよ うに修正せよ. symlink 攻撃を防ぐにはどうすればよ いか? 8
  • 9. testListOfNumbers.java (1/3) /* * Copyright (c) 1995, 2008, Oracle and/or its affiliates. * All rights reserved. */ import java.io.*; import java.util.Vector; class ListOfNumbers { private Vector<Integer> victor; private static final int SIZE = 10; public ListOfNumbers () { victor = new Vector<Integer>(SIZE); for (int i = 0; i < SIZE; i++) victor.addElement(new Integer(i)); } 9
  • 10. testListOfNumbers.java (2/3) public void writeList() { PrintWriter out = null; try { System.out.println("Entering try statement"); out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < SIZE; i++) out.println(victor.elementAt(i)); } finally { if (out != null) { System.out.println("Closing PrintWriter"); out.close(); } else { System.out.println("PrintWriter not open"); } } } } 10
  • 11. testListOfNumbers.java (3/3) class testListOfNumbers { public static void main(String[] args){ ListOfNumbers lon = new ListOfNumbers(); lon.writeList(); } } 11
  • 12. Hands-on Exercise(2) (A)以下の testListOfNumbers.java について、コンパイル 実行できるようにコードを修正せよ (B) ListOfNumbers クラスで出力されるファイル OutFile.txt から整数を読み込み, その総和を計算す •FileWriter() が IOException をスローする可能性 るコードを書け •elementAt() メソッドが (C)データを読み込んだ後の OutFile.txt を削除するよ ArrayIndexOutOfBoundsException をスローする可能性 うに修正せよ. symlink 攻撃を防ぐにはどうすればよ いか? 12
  • 13. 修正例 writeList() public void writeList() { PrintWriter out = null; try { System.out.println("Entering try statement"); out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < SIZE; i++) out.println(victor.elementAt(i)); } catch (ArrayIndexOutOfboundsException e) { System.err.println(“Caught ArrayIndexOutOfBoundsException: “ + e.getMessage()); } catch (IOException e) { System.err.println(“Caught IOException: “ + e.getMessage()); } finally { if (out != null) { System.out.println("Closing PrintWriter"); out.close(); } else { System.out.println("PrintWriter not open"); } } } 13
  • 14. Hands-on Exercise(2) (A)以下の testListOfNumbers.java について、コンパイル 実行できるようにコードを修正せよ (B) ListOfNumbers クラスで出力されるファイル OutFile.txt から整数を読み込み, その総和を計算す るコードを書け (C)データを読み込んだ後のでは 以下のコード例 sum.java OutFile.txt を削除するよ うに修正せよ. symlink 攻撃を防ぐにはどうすればよ •writeList() に対応して readList() をつくった いか? •main()メソッドで OutFile.txt を生成するところも 一緒に入れた 14
  • 15. コード例 sum.java (1/2) /* * sum.java * call ListNumbers to generate outfile.txt * read outfile.txt and compute and print the sum of the numbers */ class readList { public Vector<Integer> readList(String filename) throws IOException { Vector<Integer> victor = new Vector<Integer>(); try ( BufferedReader in = new BufferedReader(new FileReader(filename)); ) { String line; while ((line = in.readLine()) != null) { victor.addElement(Integer.parseInt(line)); } } return victor; } } 15
  • 16. コード例 sum.java (2/2) class sum { private static final String FILENAME = “OutFile.txt”; public static void main(String[] args) throws IOException { ListOfNumbers lon = new ListOfNumbers(); lon.writeList(); // file generated System.out.println(“reading...”); readList rl = new readList(); Vector<Integer> v = rl.readList(FILENAME); Integer total = 0; for (Integer i : v){ total = total + i; } System.out.println(“total: “ + total); } } 16
  • 17. Hands-on Exercise(2) (A)以下の testListOfNumbers.java について、コンパイル 以下のコード例 sum1.java では 実行できるようにコードを修正せよ •main() メソッドの最初で, ファイル操作を行うディレクトリが セキュアディレクトリであることを確認 (具体的なコードにつ (B) ListOfNumbers クラスで出力されるファイル いては FIO00-J を参照) OutFile.txt から整数を読み込み, その総和を計算す •main() メソッドの最後でファイルを削除 るコードを書け (C)データを読み込んだ後の OutFile.txt を削除するよ うに修正せよ. symlink 攻撃を防ぐにはどうすればよ いか? 17
  • 18. コード例 sum1.java class sum1 { private static final String FILENAME = “OutFile.txt”; public static void main(String[] args) throws IOException { // まず最初に, カレントディレクトリがセキュアディレクトリであることを確認する // Java セキュアコーディングスタンダード FIO00-J で紹介している // isInSecureDir() メソッドを参照 (POSIX系のファイルシステムの場合) // https://www.jpcert.or.jp/java-rules/fio00-j.html ListOfNumbers lon = new ListOfNumbers(); lon.writeList(); // file generated System.out.println(“reading...”); readList rl = new readList(); Vector<Integer> v = rl.readList(FILENAME); Integer total = 0; for (Integer i : v){ total = total + i; } System.out.println(“total: “ + total); File outfile = new File(FILENAME); outfile.delete(); } } 18