SlideShare a Scribd company logo
Javaセキュアコーディングセミナー東京
第1回
オブジェクトの生成とセキュリティ
演習

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




                      1
演習[1]

class Dog {                      (A)どのような出力が得られるか?
  public static void bark() {    (B) bark()メソッドがstatic宣言されて
    System.out.print("woof");
  }                                 いない場合の出力は?
}                                (C)メソッドがどのように実行されて

class Bulldog extends Dog {         いるか説明せよ
  public static void bark() {}
}

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


                            2
演習[2]
                         (A)どのような出力が得られるか?
                         (B) なぜこのような出力が得られたのか説明せよ.

class Point {
                         (C)適切な出力が得られるようにコードを修正せよ.
  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"));
  }
}                                ヒント: Java言語仕様 §15.12 Method Invocation Expressions

                                       3
演習[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;
                             (A) User クラスのインスタンスを生成し,
  public User(Purse arg) {
      p = arg;                   その private フィールド p が参照する
  }                              Purse インスタンスの持つ値を変更す
  public Purse get_p() {
    return p;                    る攻撃コードを書け.
  }                          (B) (A) でつくった攻撃コードが動作しな
}
                                 いように元のコードを修正せよ.
                             4
演習[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.");
    }
                    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;
                        }
                      }
                    }
                                     5
演習[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!");
  }
}



       (A) checkarg() による入力値チェックを回避する攻撃
          コードを書け.
       (B) (A) で書いた攻撃コードに対する対策を行え.



                                     6

More Related Content

PDF
Javaセキュアコーディングセミナー東京第1回演習の解説
PDF
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PPTX
C#6.0の新機能紹介
PDF
Javaセキュアコーディングセミナー東京第2回演習
PDF
Javaセキュアコーディングセミナー東京第2回演習の解説
PPT
C++0x in programming competition
PPTX
メタプログラミング C#
Javaセキュアコーディングセミナー東京第1回演習の解説
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C#6.0の新機能紹介
Javaセキュアコーディングセミナー東京第2回演習
Javaセキュアコーディングセミナー東京第2回演習の解説
C++0x in programming competition
メタプログラミング C#

What's hot (20)

PPTX
C# LINQ ~深く知って、使いまくろう~
PDF
サーバーサイドでの非同期処理で色々やったよ
PDF
C++ lecture-1
PDF
C++0x in programming competition
PDF
error handling using expected
PDF
Javaセキュアコーディングセミナー東京第3回演習の解説
PPTX
C#を始めたばかりの人へのLINQ to Objects
PDF
JavaScript 勉強会 ― 変数・演算子・文
PDF
C++ ポインタ ブートキャンプ
PDF
C++入門?
PDF
C++ lecture-2
PDF
Java初心者勉強会(2015/08/07)資料
PDF
Boost.Coroutine
PDF
Emcjp item21
PDF
Java電卓勉強会資料
PPTX
競技プログラミングのためのC++入門
PDF
LINQソースでGO!
PDF
Fork/Join Framework。そしてLambdaへ。
PDF
Goをカンストさせる話
C# LINQ ~深く知って、使いまくろう~
サーバーサイドでの非同期処理で色々やったよ
C++ lecture-1
C++0x in programming competition
error handling using expected
Javaセキュアコーディングセミナー東京第3回演習の解説
C#を始めたばかりの人へのLINQ to Objects
JavaScript 勉強会 ― 変数・演算子・文
C++ ポインタ ブートキャンプ
C++入門?
C++ lecture-2
Java初心者勉強会(2015/08/07)資料
Boost.Coroutine
Emcjp item21
Java電卓勉強会資料
競技プログラミングのためのC++入門
LINQソースでGO!
Fork/Join Framework。そしてLambdaへ。
Goをカンストさせる話
Ad

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

PDF
Javaセキュアコーディングセミナー東京第4回講義
PDF
例外設計における大罪
PDF
Javaセキュアコーディングセミナー東京第1回 講義
PDF
Java/Androidセキュアコーディング
PDF
Apache Struts2 における任意の Java メソッド実行の脆弱性
PDF
JDK7 Quiz... @ JavaOne報告会 at Tokyo
PPTX
Enshu8
PDF
Javaセキュアコーディングセミナー東京第4回演習の解説
PDF
Effective java 勉強会
KEY
Java7再入門講座
PDF
(R1-1) いまさら Coin, されど Coin @ JJUG CCC 2012 Fall
PDF
Javaセキュアコーディングセミナー東京第3回講義
PDF
Var handles jjug_ccc_spring_2018
PPTX
演習:プログラミング言語処理をやってみよう
PDF
LITメンター研修_Android0212
PDF
Effective java2nd chap04
PPTX
PDF
Introduction to Spock
PDF
Hello, Guava ! samples
PPTX
Cve 2013-0422
Javaセキュアコーディングセミナー東京第4回講義
例外設計における大罪
Javaセキュアコーディングセミナー東京第1回 講義
Java/Androidセキュアコーディング
Apache Struts2 における任意の Java メソッド実行の脆弱性
JDK7 Quiz... @ JavaOne報告会 at Tokyo
Enshu8
Javaセキュアコーディングセミナー東京第4回演習の解説
Effective java 勉強会
Java7再入門講座
(R1-1) いまさら Coin, されど Coin @ JJUG CCC 2012 Fall
Javaセキュアコーディングセミナー東京第3回講義
Var handles jjug_ccc_spring_2018
演習:プログラミング言語処理をやってみよう
LITメンター研修_Android0212
Effective java2nd chap04
Introduction to Spock
Hello, Guava ! samples
Cve 2013-0422
Ad

More from JPCERT Coordination Center (20)

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

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

  • 2. 演習[1] class Dog { (A)どのような出力が得られるか? public static void bark() { (B) bark()メソッドがstatic宣言されて System.out.print("woof"); } いない場合の出力は? } (C)メソッドがどのように実行されて class Bulldog extends Dog { いるか説明せよ public static void bark() {} } 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 2
  • 3. 演習[2] (A)どのような出力が得られるか? (B) なぜこのような出力が得られたのか説明せよ. class Point { (C)適切な出力が得られるようにコードを修正せよ. 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")); } } ヒント: Java言語仕様 §15.12 Method Invocation Expressions 3
  • 4. 演習[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; (A) User クラスのインスタンスを生成し, public User(Purse arg) { p = arg; その private フィールド p が参照する } Purse インスタンスの持つ値を変更す public Purse get_p() { return p; る攻撃コードを書け. } (B) (A) でつくった攻撃コードが動作しな } いように元のコードを修正せよ. 4
  • 5. 演習[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."); } 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; } } } 5
  • 6. 演習[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!"); } } (A) checkarg() による入力値チェックを回避する攻撃 コードを書け. (B) (A) で書いた攻撃コードに対する対策を行え. 6