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

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

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

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

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

JEB Plugin 開発チュートリアル 第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

Microsoft PowerPoint ppt

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

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

新・明解Java入門

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

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

untitled

Prog2_9th

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

ALG ppt

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

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

JavaプログラミングⅠ

Microsoft Word - NonGenTree.doc

グラフの探索 JAVA での実装

Microsoft Word - NonGenList.doc

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

Microsoft PowerPoint - prog09.ppt

Microsoft PowerPoint - prog09.ppt

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

Prog1_15th

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

Java知識テスト問題

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

I java A

Microsoft PowerPoint - lec06 [互換モード]

PowerPoint プレゼンテーション

Microsoft Word - keisankigairon.ch doc

PowerPoint プレゼンテーション

人工知能入門

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

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

Prog1_10th

K227 Java 2

Microsoft PowerPoint - chap10_OOP.ppt

PowerPoint プレゼンテーション

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

JavaプログラミングⅠ

JAVA とテンプレート

基本情報STEP UP演習Java対策

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

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

SpringSecurity

ログを活用したActive Directoryに対する攻撃の検知と対策

JAVA入門

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

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

Programming-C-9.key

GUIプログラムⅣ

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

解きながら学ぶJava入門編

Java (5) 1 Lesson 3: x 2 +4x +5 f(x) =x 2 +4x +5 x f(10) x Java , 3.0,..., 10.0, 1.0, 2.0,... flow rate (m**3/s) "flow

JavaプログラミングⅠ

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

Java講座

< F2D B838A835882CC8CF68EAE2E6A7464>

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

GEC-Java

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

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

デジタル表現論・第4回

226

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

PowerPoint Presentation

PowerPoint プレゼンテーション

Java言語 第1回

シミュレーションの簡単な例 GUI 無しのシミュレーションを作る GUI を作る パラメタを設定するデモンストレーションをする 2 オブジェクト指向プログラミング特論

< F2D834F838C A815B A CC>


Microsoft PowerPoint - prog03.ppt

Thread

3 Java 3.1 Hello World! Hello World public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World");

PowerPoint Presentation

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

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

Javaの作成の前に

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

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

WTM2019SingleSignOn

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

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

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

文字列操作と正規表現

Java演習(2) -- 簡単なプログラム --

リファレンス,配列 例外処理

JAVA H13 OISA JAVA 1

8 if switch for while do while 2

IT プロジェクト

GUIプログラムⅤ

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

メソッドのまとめ

2

6 p.1 6 Java GUI GUI paintcomponent GUI mouseclicked, keypressed, actionperformed mouseclicked paintcomponent thread, 1 GUI 6.0.2, mutlithread C

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:37:15 +09'00' Javaセキュアコーディングセミナー東京 第4回 メソッドとセキュリティ 演習解説 2012年12月16日(日) JPCERTコーディネーションセンター 脆弱性解析チーム 熊谷 裕志 戸田 洋三 1

Hands-on Exercise finalizer 攻撃を阻止しよう 他のクラスから ht に入っているキー 1 の エントリを消せるか? 2

Hands-on Exercise(1) finalizer 攻撃を阻止しよう 3

サンプルアプリケーション (1/2) public class LicenseManager { public LicenseManager() { if (!licensevalidation()) { throw new SecurityException("License Invalid!"); private boolean licensevalidation() { // ライセンスファイルをリードしてチェックし ライセンスが正当なら true を返す return false; public class SecuritySystem { private static LicenseManager licensemanager = null; public static void register(licensemanager lm) { // licensemanager が初期化されていない場合のみ登録 if (licensemanager == null) { if (lm == null) { System.out.println("License Manager invalid!"); System.exit(1); licensemanager = lm; Heinz M. Kabutz. Exceptional Constructors - Ressurecting the dead. Java Specialists Newsletter. 2001 4

サンプルアプリケーション (2/2) public class Application { public static void main(string[] args) { LicenseManager lm; try { lm = new LicenseManager(); catch(securityexception ex) { lm = null; SecuritySystem.register(lm); System.out.println("Now let s get things started"); % ls *.java Application.java LicenseManager.java SecuritySystem.java % javac *.java % java Application License Manager invalid! % 5

ファイナライザー攻撃を行うコード (1/2) public class LicenseManagerInterceptor extends LicenseManager { private static LicenseManagerInterceptor instance = null; public static LicenseManagerInterceptor make() { try { new LicenseManagerInterceptor(); catch(exception ex) { // 例外を無視 try { synchronized(licensemanagerinterceptor.class) { while (instance == null) { System.gc(); LicenseManagerInterceptor.class.wait(100); catch(interruptedexception ex) { return null; return instance; public void finalize() { System.out.println("In finalize of " + this); synchronized(licensemanagerinterceptor.class) { instance = this; LicenseManagerInterceptor.class.notify(); public LicenseManagerInterceptor() { System.out.println("Created LicenseManagerInterceptor"); 攻撃コード 6

ファイナライザー攻撃を行うコード (2/2) 攻撃コード public class AttackerApp { public static void main(string[] args) { LicenseManagerInterceptor lm = LicenseManagerInterceptor.make(); SecuritySystem.register(lm); // now we call the other application Application.main(args); % ls Application.class LicenseManager.class SecuritySystem.class AttackerApp.java LicenseManagerInterceptor.java % javac *.java % java AttakerApp In finalize of LicenseManagerInterceptor@7dcb3cd Now let s get things started % 7

ファイナライザ攻撃対策 finalize() メソッドを上書きされないように定義 重要なインスタンスは 初期化の完了を必ず確認 サブクラス化による悪用を防ぐために クラスをfinal 宣言する サンプルコードを 修正してみよう! 8

ファイナライザ攻撃対策 解説編 finalize() メソッドを上書きされないように定義 重要なインスタンスは 初期化の完了を必ず確認 サブクラス化による悪用を防ぐために クラスをfinal 宣言する finalize() をサブクラスで上書きされないよう final 宣言つきで定義 LicenseManager クラスを final 宣言 9

LicenseManager の修正 解説編 public final class LicenseManager { public LicenseManager() { if (!licensevalidation()) { throw new SecurityException("License Invalid!"); private boolean licensevalidation() { // ライセンスファイルをリードしてチェックし ライセンスが正当なら true を返す return false; final 宣言を追加 @Override protected final void finalize(){ final 宣言つきで finalize() メソッドを定義 10

修正の効果 解説編 この修正により 攻撃コードはコンパイル できなくなる % javac AttackerApp.java LicenseManagerInterceptor.java LicenseManagerInterceptor.java:1: error: cannot inherit from final LicenseManager public class LicenseManagerInterceptor extends LicenseManager { ^ LicenseManagerInterceptor.java:19: error: finalize() in LicenseManagerInterceptor cannot override finalize() in LicenseManager public void finalize() { ^ overridden method is final 2 errors % 11

ファイナライザ攻撃対策 解説編 finalize() メソッドを上書きされないように定義 重要なインスタンスは 初期化の完了を必ず確認 サブクラス化による悪用を防ぐために クラスをfinal 宣言する LicenseManager のコンストラクタが正常終了したことを確認できるようにする 初期化完了フラグを設ける 12

LicenseManager の修正 解説編 public class LicenseManager { boolean init = false; 初期化完了フラグ public LicenseManager() { if (!licensevalidation()) { throw new SecurityException("License Invalid!"); init = true; private boolean licensevalidation() { // ライセンスファイルをリードしてチェックし ライセンスが正当なら変更する trueを返す return false; コンストラクタが正常終了する最後に初期化完了フラグの値を 13

SecuritySystem の修正 解説編 public class SecuritySystem { private static LicenseManager licensemanager = null; public static void register(licensemanager lm) { // licensemanager が初期化されていない場合のみ登録 if (licensemanager == null) { if (lm == null) { System.out.println("License Manager invalid!"); System.exit(1); if (lm.init == false) { System.out.println("incomplete License Manager!"); System.exit(2); licensemanager = lm; 渡されたインスタンスが正しく初期化されたものかどうかチェックする 14

修正の効果 解説編 この修正により 初期化完了していないイ ンスタンスを検出できるようになる % java AttackerApp In finalize of LicenseManagerInterceptor@2aa05bc3 incomplete License Manager! % しかしこれでは不十分! 攻撃コードで init の値を操作してしまえば... 15

攻撃コード ( 改 ) 解説編 攻撃コード public class AttackerApp { public static void main(string[] args) { LicenseManagerInterceptor lm = LicenseManagerInterceptor.make(); lm.init = true; SecuritySystem.register(lm); // now we call the other application Application.main(args); init の値を操作 % javac AttackerApp.java % java AttackerApp In finalize of LicenseManagerInterceptor@2aa05bc3 Now let s get things started % 攻撃成功! 初期化完了フラグを改変されないようにする 必要がある 16

LicenseManager をさらに修正 解説編 public class LicenseManager { private 宣言する private boolean init = false; public boolean is_init(){ return init; public LicenseManager() { if (!licensevalidation()) { throw new SecurityException("License Invalid!"); init = true; private boolean licensevalidation() { // ライセンスファイルをリードしてチェックし ライセンスが正当なら true を返す return false; init の値を調べるメソッドを追加 17

SecuritySystem をさらに修正 解説編 public class SecuritySystem { private static LicenseManager licensemanager = null; public static void register(licensemanager lm) { // licensemanager が初期化されていない場合のみ登録 if (licensemanager == null) { if (lm == null) { System.out.println("License Manager invalid!"); System.exit(1); if (lm.is_init() == false) { System.out.println("incomplete License Manager!"); System.exit(2); licensemanager = lm; 初期化完了のチェックはメソッドを呼び出す形に変更 18

さらなる修正の効果 解説編 AttackerApp から初期化フラグを改変でき なくなる % javac AttackerApp.java AttackerApp.java:4: error: init has private access in LicenseManager lm.init = true; ^ 1 error % 19

Hands-on Exercise(2) 他のクラスから ht に入っているキ ー 1 のエントリを消せるか? 20

Hands-on Exercise(2) 他のクラスから ht に入っているキー 1 のエントリを消せるか? import java.util.hashtable; import java.security.accesscontroller; import java.security.securitypermission; public final class SensitiveHash { private Hashtable<Integer,String> ht = new Hashtable<Integer,String>(); 問題のコード SensitiveHash() { ht.put(1, "one"); ht.put(2, "two"); ht.put(3, "three"); void removeentry(object key) { check("removekeypermission"); ht.remove(key); public void showentries() { System.out.println("" + ht.get(1)); System.out.println("" + ht.get(2)); System.out.println("" + ht.get(3)); 例えば SensitiveHash sh = new SensitiveHash(); sh.removeentry(1); sh.showentries(); セキュリティチェックされているためエントリーを消すことはできない private void check(string directive) { SecurityPermission sp = new SecurityPermission(directive); AccessController.checkPermission(sp); 21

Hands-on Exercise(2) 他のクラスから ht に入っているキー 1 のエントリを消せるか? やってみる 22

Hands-on Exercise(2) 他のクラスから ht に入っているキー 1 のエントリを消せるか? class AttackHash extends SensitiveHash { void removeentry(object key) { ht.remove(key); SensitiveHash クラスは final 宣言されているのでサブクラスは作れない import java.util.hashtable; public class Attack { public static void main(string[] args){ SensitiveHash sh = new SensitiveHash(); sh.removeentry(1); sh.showentries(); removekeypermission が許可されていないので removeentry は実行できない 23

Hands-on Exercise(2) 他のクラスから ht に入っているキー 1 のエントリを消せるか? リフレクションを使えば エントリーを消すことができる 24

Hands-on Exercise(2) 他のクラスから ht に入っているキー 1 のエントリを消せるか? import java.util.hashtable; import java.lang.reflect.field; import java.lang.reflect.method; public class AttackAns { public static void main(string[] args){ try { Class<SensitiveHash> c = SensitiveHash.class; SensitiveHash sh = new SensitiveHash(); Field field = c.getdeclaredfield("ht"); field.setaccessible(true); Hashtable hh = (Hashtable)field.get(sh); hh.remove(1); sh.showentries(); リフレクションを使って private フィールドにアクセスする Hashtable#remove で削除 catch (Exception ex) { ex.printstacktrace(system.out); 25

Hands-on Exercise(2) 他のクラスから ht に入っているキー 1 のエントリを消せるか? import java.util.hashtable; import java.security.accesscontroller; import java.security.securitypermission; 問題のコード public final class SensitiveHash { private Hashtable<Integer,String> ht = new Hashtable<Integer,String>(); SensitiveHash() { ht.put(1, "one"); ht.put(2, "two"); ht.put(3, "three"); void removeentry(object key) { check("removekeypermission"); ht.remove(key); public void showentries() { System.out.println("" + ht.get(1)); System.out.println("" + ht.get(2)); System.out.println("" + ht.get(3)); private void check(string directive) { SecurityPermission sp = new SecurityPermission(directive); AccessController.checkPermission(sp); removekeypermission の権限があるかどうかのチェックのみ セキュリティマネージャは有効になっていない 26

Hands-on Exercise(2) 他のクラスから ht に入っているキー 1 のエントリを消せるか? ということで リフレクションが使えて エントリーを消すことができる 27