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;      Strin...
コンパイルすると...$ javac testCatFile_CantCompile.javatestCatFile_CantCompile.java:19: error: unreported exception IOException;mu...
修正例その1class CatFile {  public static void cat(File file) {            cat メソッドのなかで      RandomAccessFile input = null;    ...
修正例その2 (JavaSE7)class CatFile {  public static void cat(File file) {    try (RandomAccessFile input = new RandomAccessFile...
Hands-on Exercise(2)(A)以下の testListOfNumbers.java について、コンパイル  実行できるようにコードを修正せよ(B) ListOfNumbers クラスで出力されるファイル  OutFile.txt...
testListOfNumbers.java (1/3)/* * Copyright (c) 1995, 2008, Oracle and/or its affiliates. * All rights reserved. */import j...
testListOfNumbers.java (2/3)    public void writeList() {        PrintWriter out = null;        try {             System.o...
testListOfNumbers.java (3/3)class testListOfNumbers {  public static void main(String[] args){    ListOfNumbers lon = new ...
Hands-on Exercise(2)(A)以下の testListOfNumbers.java について、コンパイル  実行できるようにコードを修正せよ(B) ListOfNumbers クラスで出力されるファイル    OutFile.t...
修正例 writeList()  public void writeList() {      PrintWriter out = null;      try {           System.out.println("Entering ...
Hands-on Exercise(2)(A)以下の testListOfNumbers.java について、コンパイル  実行できるようにコードを修正せよ(B) ListOfNumbers クラスで出力されるファイル  OutFile.txt...
コード例 sum.java (1/2)/* * sum.java *   call ListNumbers to generate outfile.txt *   read outfile.txt and compute and print t...
コード例 sum.java (2/2)class sum {  private static final String FILENAME = “OutFile.txt”;    public static void main(String[] ...
Hands-on Exercise(2)(A)以下の testListOfNumbers.java について、コンパイル  以下のコード例 sum1.java では   実行できるようにコードを修正せよ •main() メソッドの最初で, ファ...
コード例 sum1.javaclass sum1 {  private static final String FILENAME = “OutFile.txt”;    public static void main(String[] args...
Upcoming SlideShare
Loading in...5
×

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

222

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
222
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

  1. 1. Javaセキュアコーディングセミナー東京第3回入出力と例外時の動作演習の解説2012年11月11日(日)JPCERTコーディネーションセンター脆弱性解析チーム戸田 洋三 1
  2. 2. ‣Hands-on Exercises ‣ コンパイルエラーに対処しよう ‣ ファイルからのデータ入力を実装しよう 2
  3. 3. Hands-on Exercise(1) サンプルコードの コンパイルエラーに対処しよう 3
  4. 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. 5. コンパイルすると...$ javac testCatFile_CantCompile.javatestCatFile_CantCompile.java:19: error: unreported exception IOException;must be caught or declared to be thrown input.close(); ^testCatFile_CantCompile.java:12: error: unreported exceptionFileNotFoundException; 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. 6. 修正例その1class 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. 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. 8. Hands-on Exercise(2)(A)以下の testListOfNumbers.java について、コンパイル 実行できるようにコードを修正せよ(B) ListOfNumbers クラスで出力されるファイル OutFile.txt から整数を読み込み, その総和を計算す るコードを書け(C)データを読み込んだ後の OutFile.txt を削除するよ うに修正せよ. symlink 攻撃を防ぐにはどうすればよ いか? 8
  9. 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. 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. 11. testListOfNumbers.java (3/3)class testListOfNumbers { public static void main(String[] args){ ListOfNumbers lon = new ListOfNumbers(); lon.writeList(); }} 11
  12. 12. Hands-on Exercise(2)(A)以下の testListOfNumbers.java について、コンパイル 実行できるようにコードを修正せよ(B) ListOfNumbers クラスで出力されるファイル OutFile.txt から整数を読み込み, その総和を計算す •FileWriter() が IOException をスローする可能性 るコードを書け •elementAt() メソッドが(C)データを読み込んだ後の OutFile.txt を削除するよ ArrayIndexOutOfBoundsException をスローする可能性 うに修正せよ. symlink 攻撃を防ぐにはどうすればよ いか? 12
  13. 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. 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. 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. 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. 17. Hands-on Exercise(2)(A)以下の testListOfNumbers.java について、コンパイル 以下のコード例 sum1.java では 実行できるようにコードを修正せよ •main() メソッドの最初で, ファイル操作を行うディレクトリが セキュアディレクトリであることを確認 (具体的なコードにつ(B) ListOfNumbers クラスで出力されるファイル いては FIO00-J を参照) OutFile.txt から整数を読み込み, その総和を計算す •main() メソッドの最後でファイルを削除 るコードを書け(C)データを読み込んだ後の OutFile.txt を削除するよ うに修正せよ. symlink 攻撃を防ぐにはどうすればよ いか? 17
  18. 18. コード例 sum1.javaclass 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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×