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

Similar documents
Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

Microsoft PowerPoint ppt

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

Javaセキュアコーディングセミナー東京 第4回 メソッドとセキュリティ 演習解説

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

PowerPoint プレゼンテーション

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Javaプログラムの実行手順

JAVA入門

Prog2_9th

プログラミング入門1

JavaプログラミングⅠ

プログラミング基礎I(再)

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

JavaプログラミングⅠ

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

Microsoft PowerPoint - prog03.ppt

JavaプログラミングⅠ

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

オブジェクト指向プログラミング・同演習 5月21日演習課題

基本情報STEP UP演習Java対策

JavaプログラミングⅠ

Java知識テスト問題

PowerPoint プレゼンテーション

DVIOUT-exer

Microsoft PowerPoint - chap10_OOP.ppt

JavaプログラミングⅠ

2

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

IT プロジェクト

新・明解Java入門

Java言語 第1回

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 2 回オブジェクト指向 テクノロジックアート 瀬 嘉秀

Prog1_10th

PowerPoint Presentation

Microsoft PowerPoint - prog09.ppt

Microsoft PowerPoint - prog04.ppt

GEC-Java

Microsoft PowerPoint - prog09.ppt

JavaプログラミングⅠ

PowerPoint プレゼンテーション

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

226

Prog1_6th

Microsoft Word - problem3.doc

ÿþ˜u#u·0¹0Æ0à0

Java学習教材

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

Java講座

ガイダンス

Prog2_12th

Java (9) 1 Lesson Java System.out.println() 1 Java API 1 Java Java 1

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

JAVA とテンプレート

問題1 以下に示すプログラムは、次の処理をするプログラムである

ガイダンス

ALG ppt

Prog1_15th

Prog2_9th

untitled

Microsoft PowerPoint - lec06 [互換モード]

JavaプログラミングⅠ

メソッドのまとめ

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

5 p Point int Java p Point Point p; p = new Point(); Point instance, p Point int 2 Point Point p = new Point(); p.x = 1; p.y = 2;

デジタル表現論・第4回

ガイダンス

JavaプログラミングⅠ

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

GUIプログラムⅣ

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

GEC-Java

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

問題1 以下に示すプログラムは、次の処理をするプログラムである

デジタル表現論・第6回

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

ガイダンス

Make the Future Java FY13 PPT Template

Java演習(4) -- 変数と型 --

Prog2_10th

Java (7) Lesson = (1) 1 m 3 /s m 2 5 m 2 4 m 2 1 m 3 m 1 m 0.5 m 3 /ms 0.3 m 3 /ms 0.6 m 3 /ms 1 1 3

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

Microsoft Word - NonGenTree.doc

JEB Plugin 開発チュートリアル 第4回

I HTML HashMap (i) (ii) :.java import java.net.*; import java.io.*; import java.util.hashmap; public class SimpleStopWatch { public static voi

GEC-Java

人工知能入門

SpringSecurity

JavaプログラミングⅠ

実行時のメモリ構造\(2\) Javaスタック内のフレーム間動作

HCI プログラミング 8 回目ボタン チェックボックス ラジオボタン 今日の講義で学ぶ内容 ボタンとアクションイベント ボタンのカスタマイズ チェックボックスとラジオボタン ボタンとアクションイベント 1 ボタンを配置してみましょう ボタンは ラベルと同じようにフォントやその色 画像の貼り付けなど

プログラミング入門1

intra-mart Accel Platform — 外部ソフトウェア接続モジュール 仕様書   第3版  

PowerPoint プレゼンテーション

2

Transcription:

Java セキュアコーディングセミナー東京 第 1 回オブジェクトの生成とセキュリティ 演習の解説 2012 年 9 月 9 日 ( 日 ) JPCERT コーディネーションセンター脆弱性解析チーム戸田洋三 1

演習 [1] 2

演習 [1] class Dog { public static void bark() { System.out.print("woof"); class Bulldog extends Dog { public static void bark() { A. どのような出力が得られるか? B. bark() メソッドが static 宣言されていない場合の出力は? C. メソッドがどのように実行されているか説明せよ public class Bark { public static void main(string args[]) { Dog d1 = new Dog(); Dog d2 = new Bulldog(); d1.bark(); d2.bark(); ヒント Java 言語仕様 15.12 Method Invocation Expressions 3

演習 [1] A. どのような出力が得られるか? $ java Bark woofwoof$ B. bark() メソッドが static 宣言されていない場合の出力は? $ java Bark woof$ C. メソッドがどのように実行されているか説明せよ 4

コンパイラおよび VM による処理 class Dog { public static void bark() { System.out.print("woof"); class Bulldog extends Dog { public static void bark() { (2) コンパイル時のチェック Dog のメソッド bark() は static 宣言されている (3) 実行時処理 Dog の static メソッド bark() を呼び出そう! public class Bark { public static void main(string args[]) { Dog d1 = new Dog(); Dog d2 = new Bulldog(); d1.bark(); d2.bark(); (1) コンパイル時のチェック - d1,d2 どちらも Dog 型の変数 - Dog のメソッド bark() があるので OK 5

コンパイラおよび VM による処理 (static メソッドでない場合 ) class Dog { public void bark() { System.out.print("woof"); class Bulldog extends Dog { public void bark() { public class Bark { public static void main(string args[]) { Dog d1 = new Dog(); Dog d2 = new Bulldog(); d1.bark(); d2.bark(); (2) コンパイル時のチェック Dog のメソッド bark() は virtual 呼び出しだ (3) 実行時処理 d1,d2 が参照しているインスタンスをチェック! (4) 実行時処理それぞれのインスタンスから辿ってメソッドを呼び出そう! (1) コンパイル時のチェック - d1,d2 どちらも Dog 型の変数 - Dog のメソッド bark() があるので OK 6

演習 [2] 7

演習 [2] class Point { protected final int x, y; private final String name; protected String makename() { return "[" + x + "," + y + "]"; public final String tostring() { return name; Point(int x, int y) { this.x = x; this.y = y; this.name = makename(); public class ColorPoint extends Point { private final String color; protected String makename() { return super.makename() + ":" + color; ColorPoint(int x, int y, String color) { super(x, y); this.color = color; public static void main(string[] args) { System.out.println(new ColorPoint(4, 2, "purple")); A. どのような出力が得られるか? B. なぜこのような出力が得られたのか説明せよ. C. 適切な出力が得られるようにコードを修正せよ. ヒント : Java 言語仕様 15.12 Method Invocation Expressions 8

演習 [2] A. どのような出力が得られるか? $ java ColorPoint [4,2]:null $ B. なぜこのような出力が得られたのか説明せよ. Point.toString() から出力 name の値 name には makename() の返り値が代入されている どの makename()? ColorPoint の makename() つまり... サブクラスのインスタンスが初期化される前にスーパークラスのコンストラクタがサブクラスのメソッドを呼び出した 9

実行の様子 10 class Point { protected final int x, y; private final String name; // Cached at construction time protected String makename() { return "[" + x + "," + y + "]"; public final String tostring() { return name; Point(int x, int y) { this.x = x; this.y = y; this.name = makename(); public class ColorPoint extends Point { private final String color; protected String makename() { return super.makename() + ":" + color; ColorPoint(int x, int y, String color) { super(x, y); this.color = color; public static void main(string[] args) { System.out.println(new ColorPoint(4, 2, "purple")); (3) ColorPoint の makename() が呼び出される (4) 初期化前の color にアクセス (2) Point のコンストラクタ呼出し (5) ここでようやく color の初期化 (1) ColorPoint のコンストラクタ呼出し

演習 [2] このコードの問題点 : 初期化される前の color にアクセスしている ( その結果, デフォルト値の null が出力されている ) 元々の意図は? 初期化された後の color の値を出力したい C. 適切な出力が得られるようにコードを修正せよ. 11

どのように修正するか? class Point { protected final int x, y; private final String name; // Cached at construction time protected String makename() { return "[" + x + "," + y + "]"; public final String tostring() { return name; Point(int x, int y) { this.x = x; this.y = y; this.name = makename(); public class ColorPoint extends Point { private final String color; protected String makename() { return super.makename() + ":" + color; ColorPoint(int x, int y, String color) { super(x, y); this.color = color; public static void main(string[] args) { System.out.println(new ColorPoint(4, 2, "purple")); 12

どのように修正するか? class Point { protected final int x, y; private String name; // 遅延初期化 ( 最初に使われたときにキャッシュされる ) protected String makename() { return "[" + x + "," + y + "]"; public final synchronized String tostring() { return (name == null? name = makename() : name); Point(int x, int y) { this.x = x; this.y = y; コンストラクタからの makename() 呼び出しを避ける public class ColorPoint extends Point { private final String color; protected String makename() { return super.makename() + ":" + color; ColorPoint(int x, int y, String color) { super(x, y); this.color = color; public static void main(string[] args) { System.out.println(new ColorPoint(4, 2, "purple")); 13

演習 [3] 14

演習 [3] class Purse { private int i; public Purse(int arg) { i = arg; public int get_i() { return i; public void set_i(int iarg) { i = iarg; class User { private Purse p; public User(Purse arg) { p = arg; public Purse get_p() { return p; A. User クラスのインスタンスを生成し, その private フィールド p が参照する Purse インスタンスの持つ値を変更する攻撃コードを書け. B. A. でつくった攻撃コードが動作しないように元のコードを修正せよ. 15

攻撃コード例 こんなことすると... class dc { public static void main(string[] args){ Purse newp = new Purse(9999); User u = new User(newp); System.out.println(u.get_p().get_i()); Purse p = u.get_p(); p.set_i(1099); System.out.println(u.get_p().get_i()); get_p() の返り値を使って u の private フィールドをいじることができる newp.set_i(999); System.out.println(u.get_p().get_i()); コンストラクタに渡したオブジェクトを使って u の private フィールドをいじることができる 16

修正例 class User { private Purse p; public User(Purse arg) { p = new Purse(arg.get_i()); public Purse get_p() { return new Purse(p.get_i()); 受け取ったオブジェクトはコピーを作って使う. 外に渡すオブジェクトはコピーを作って使う. defensive copy : デフェンシブコピー 17

修正例 (2) Purse クラスを公開する必要がなければ... class User { private class Purse { private int i; Purse(int arg) { i = arg; int get_i() { return i; void set_i(int iarg) { i = iarg; Purse クラスを入れ子クラスとして定義する. Purse の中身へのアクセスは必ず User クラスのメソッド経由とする. private Purse p; public User(int iarg) { p = new Purse(iarg); public int get_i() { return p.get_i(); public void set_i(int i) { p.set_i(i); 18

演習 [4] 19

演習 [4] class Authlet { int i; Authlet(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; class Auth { private static Authlet a0; public static void checkauth(authlet a){ if (a0 == null){ if (a == null){ System.out.println("invalid Authlet!"); System.exit(1); a0 = a; 20

演習 [4] class useauth { public static void main(string[] args){ Authlet au; try { au = new Authlet(Integer.parseInt(args[0])); catch(illegalargumentexception ex){ au = null; Auth.checkAuth(au); System.out.println("Authenticated!"); 訂正! SecurityException ではなく IllegalArgumentException A. checkarg() による入力値チェックを回避する攻撃コードを書け. B. A. で書いた攻撃コードに対する対策を行え. 21

プログラムの動作を確認する $ javac Authlet.java Auth.java useauth.java $ java useauth Exception in thread "main" java.lang.arrayindexoutofboundsexception: 0 at useauth.main(useauth.java:5) $ コマンドライン引数が必要 $ java useauth 101 invalid Authlet! $ checkarg() の入力値検査でエラー $ java useauth 50 Authenticated! $ checkarg() の検査をパス 22

Auth と Authlet の問題点 Authlet のサブクラスをつくり, checkarg() の検査の後でフィールド i の値を更新可能 Auth.checkAuth() は Authlet のインスタンスの中身をチェックしていない Authlet のサブクラスをつくり, フィールド i に任意の値を設定したインスタンスを作成可能 作成したインスタンスを Auth.checkAuth() にそのまま渡せば認証される

攻撃コード class exploitauthlet extends Authlet { exploitauthlet(int e){ super(10); this.i = e; checkarg() の後で i の値を再設定 public static void main(string[] args){ exploitauthlet eal = new exploitauthlet(102); Auth.checkAuth(eal); useauth.main(new String[]{ 1000 ); 不正な値で Authlet を作成, 登録 元の main メソッドにはダミーの引数を渡す 24

exploitauthlet の実行 $ javac exploitauth.java $ java exploitauth Authenticated! $ 値 102 の Authlet でパスしてしまう 対策 Authlet のサブクラスをつくれないようにする フィールド i の値を再設定できないようにする Auth.checkAuth() で渡された Authlet が持っている値をチェックする

修正例 26 final class Authlet { int i; Authlet(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."); class Auth { return true; private static Authlet a0; public static void checkauth(authlet a){ if (a0 == null){ if (a == null){ System.out.println("invalid Authlet!"); System.exit(1); a0 = a;