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

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

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

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

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

Microsoft PowerPoint ppt

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

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

JBoss Application Server におけるディレクトリトラバーサルの脆弱性

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 Presentation

PowerPoint プレゼンテーション

2

JavaプログラミングⅠ

PowerPoint プレゼンテーション

基本情報STEP UP演習Java対策

Prog2_9th

新・明解Java入門

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

MySQL Connector/J における SQL インジェクションの脆弱性

Apache ActiveMQ における認証処理不備の脆弱性

PowerPoint プレゼンテーション

Spacewalkにおけるクロスサイトフォージェリ(CSRF)の脆弱性

Microsoft PowerPoint - prog03.ppt

Oracle Java 標準ライブラリ AtomicReferenceArray クラスにおけるデシリアライズに関する脆弱性

ALG ppt

Javaプログラムの実行手順

untitled

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

JAVA入門

JavaプログラミングⅠ

Java知識テスト問題

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

JavaプログラミングⅠ

制御システムセキュリティアセスメントサービス

Microsoft Word - NonGenTree.doc

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

Prog2_10th

JavaプログラミングⅠ

人工知能入門

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

Microsoft PowerPoint - lec06 [互換モード]

JAVA 11.4 PrintWriter 11.5

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

Prog1_15th

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

GEC-Java

Prog1_10th

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

** 平成 16 年度 FE 午後問題 Java** 示現塾プロジェクトマネージャ テクニカルエンジニア ( ネットワーク ) など各種セミナーを開催中!! 開催日 受講料 カリキュラム等 詳しくは 今すぐアクセス!! 平成 16

HCI プログラミング 10 回目テキストフィールドとキーイベント 今日の講義で学ぶ内容 テキストフィールドの利用 キーイベントの処理 テキストフィールドの利用 1 テキストフィールドを配置してみましょう テキストフィールドを用いることにより 数値や文字列などのデータ入力が可能になります ソースファ

メソッドのまとめ

JavaプログラミングⅠ

Microsoft PowerPoint - prog09.ppt

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

Microsoft PowerPoint - prog09.ppt

アルゴリズムとデータ構造1

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

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

Javaの作成の前に

JUnit 概要 2015/4/16 版今泉俊幸 2015 bbreak Systems 1

JavaプログラミングⅠ

デジタル表現論・第4回

PowerPoint プレゼンテーション

JavaプログラミングⅠ

Programming-C-9.key

Java講座

Microsoft Word - NonGenList.doc

JAVA とテンプレート

Apache Tomcatにおけるクロスサイトリクエストフォージェリ(CSRF)保護メカニズム回避の脆弱性

Microsoft Word - keisankigairon.ch doc

K227 Java 2

JavaプログラミングⅠ

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

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

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

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

JavaプログラミングⅠ

PowerPoint Presentation

問題 01 以下は コンソールより年齢を入力させ その年齢にあった料金を表示するプログラムである 年齢ごとの金額は以下の通りである 年齢の範囲金額 0 歳以上 6 歳以下 120 円 7 歳以上 65 歳未満 200 円 65 歳以上無料 package j1.exam02; import java

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

JavaプログラミングⅠ

プログラミング入門1

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

DVIOUT-exer

解きながら学ぶJava入門編

プログラミングA

プログラミング入門1

Make the Future Java FY13 PPT Template

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


プログラミング入門1


Microsoft PowerPoint - chap10_OOP.ppt

文字列操作と正規表現

ALG ppt

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

Prog1_6th

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

プログラミング入門1

Transcription:

Japan Computer Emergency Response Team Coordination Center 電子署名者 : Japan Computer Emergency Response Team Coordination Center DN : c=jp, st=tokyo, l=chiyoda-ku, email=office@jpcert.or.jp, o=japan Computer Emergency Response Team Coordination Center, cn=japan Computer Emergency Response Team Coordination Center 日付 : 2013.06.26 14:05:48 +09'00' 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) 既存ファイルを上書きする可能性がある ZipBombの説明のなかで紹介済み (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

ZipBomb 対策に対するコメント ところで ZipEntry クラスの getsize() メソッドってどうやって展開後のサイズ調べてるのかな? ZIP ファイルのヘッダに書いてある値をそのまま使ってるんじゃないのかなぁ? 標準ライブラリのコードちゃんと追っかけてみないと分かんないけど ZipEntry クラスの実装がどうなってるかは知らないが, ZIP ファイルに記載されているメタ情報を信頼できないのであれば, 自分で圧縮データを展開して確認するというアプローチは必要になるんじゃないかな. 12

Hands-on Exercise(2) サンプルコード AltConst を 修正しよう 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 に初期化子がない 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 に初期化子がない 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. 以下のコードの問題点は何か? 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); サブクラス化による攻撃への 対策を行え!! 17

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

Altconst クラスに対するコメント そもそも checkarg() メソッドって検証成功で true を返し, 検証失敗では例外を投げるってなんかアンバランスだよね. 検証結果を true/false で返すか, void 型のメソッドにして検証失敗のときは例外を投げるってしたほうがきれいだよね. 例外を投げるタイプだと, オブジェクトの初期化が途中終了しちゃうからファイナライザ攻撃の危険あるかもね. 19