質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • Java

    16760questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Java自体の脆弱性ってどんなものがあるんですか?

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 5
  • VIEW 3,749

grovion

score 143

 質問内容

Javaの脆弱性はものすごい数上がっていますよね?具体的にどんな脆弱性があるんですか?
どういう風に攻撃されるのかも予測がつかないので、具体的に教えていただけると嬉しいです。

CVE(?)とかで報告されているJava自体の脆弱性とはどんなものがあるのか、教えていただきたいです。

 背景

Javaをプログラミング言語として利用しています。
「java cve」などと検索して、以下のようなサイトに行っても、「ネットワーク越しに攻撃されるのかな?」程度にしかわかりません。
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-3289

知りたいことは、

  • どんなコードを書いたら脆弱性になるか
  • どこにある脆弱性なのか(Javaの標準ライブラリあるのですか?)
  • 具体的な攻撃方法

攻撃方法に関して記述できない場合はしょうがないです。
ですが、具体的な攻撃のイメージがわかないことが、Javaの脆弱性に対する理解が妨げにもなっています。

 知識

説明していただけるときの、参考になれば幸いです。

  • Java SE(?)を使っている(SEとかあまりわかっていません)
  • java.net.ServerSocketを使ったことはある
  • これでも恥ずかしながらセキュリティスペシャリストの資格がある
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+5

Javaの脆弱性で多いのは、サンドボックスという機能に関するものです。
Javaが出た当初、Javaアプレットというものがよく使われていました。これは、Javaのプログラムをブラウザ上で動作させるための仕掛けです。
インターネット上のウェブサイトに置かれたプログラムが勝手に動作すると、非常に危険です。たとえば、悪い人が作ったプログラムが、パソコンのローカルファイルの内容を読み書きできると、情報が簡単に漏洩します。このため、アプレットからはJavaのごく一部の機能だけが利用できるように制限されています。この制限機能のことを「サンドボックス」といいます。
このサンドボックス機能にしばしば脆弱性があり、「アプレットからはできないはずのことができてしまう」というのが、Javaの脆弱性の典型例です。この種の脆弱性は、ウェブサイト上の「ウイルスに感染する仕組み」として悪用されることが多く、「サイトを閲覧しただけでウイルスに感染する」という結果をもたらします。ただし、パソコン側でJREを無効化していたり、JREの脆弱性のないバージョンを使っている場合は問題ありません。
ウイルス感染が心配なのでJREを無効化しましょう、という意見がありますが、これは上記のような文脈からです。


追記します。
サーバー側でのJava本体の脆弱性による侵入というのは、あまりないと思います。
NTTデータ先端技術株式会社にて、さまざまな脆弱性の侵入実験を公表していますが、Javaに関するものは、すべて端末側で脆弱性が動いています。

site:www.intellilink.co.jp/article/vulner/ java - Google 検索

サーバーに関係するものとしては、古いですが、UTF-8の非最短形式の扱いに関するものがあります。

参考: 文字コードの脆弱性はこの3年間でどの程度対策されたか? 

この問題は、Java SE 5 Update 17 および Java SE 6 Update 11 で修正されています。
一応これはJavaの脆弱性として認識されているものですが、アプリケーション側でも対処は可能で、Javaとアプリケーションのどちらに責任があるかというと、グレーゾーンに属すると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/12 17:07

    ご回答ありがとうございます

    ご丁寧な説明ありがとうございます。Javaのアプレットで、
    > パソコンのローカルファイルの内容を読み書きできると、情報が簡単に漏洩
    とかの話は耳にしたことがあります。

    > Javaの脆弱性で多いのは、サンドボックスという機能に関するものです。
    ということはほとんどがアプレット関連ということですか?

    「アプレット=問題のあるやつ」という認識が浸透している時期にJavaでのプログラミングをし始めたので、
    アプレット以外にもJavaの脆弱性に関することをお聞きできたらうれしいです。

    キャンセル

  • 2017/02/13 11:53

    追記とても感謝します。

    > Javaとアプリケーションのどちらに責任があるかというと、グレーゾーンに属すると思います。
    確かにそう思いました

    ぼくの理解では、以下のコードは

    ```java
    new String("..À¯..À¯bo".getBytes("ISO-8859-1"), "UTF-8")
    ```
    ("..À¯..À¯bo"はスライド内ではfileBodyです)

    文字コードが「ISO-8859-1のbyte配列」を「UTF8のbyte配列」だと思って文字列にしているということですよね。

    これは利用者(プログラマ)の使い方の問題に思えました。
    しかし、JavaのUpdateでこの問題を修正しているということが知れて、「こういう脆弱性を生みそうなところをつぶすこともやっているんだな」と思いました。

    ちなみに、ここのページに来ていただいた方に、

    コードの実行結果はこうなりました。
    ```java
    new String("..À¯..À¯bo".getBytes("ISO-8859-1"), "UTF-8")
    => ..��..��bo
    ```
    文字化けの?みたいなのが、混ざっています。
    どうやってbyte列からダメな文字を識別しているか少し疑問ですが、その疑問で、実際にJava(?), JDK(?)のソースの差分を見ればいいのかなと思いました。


    ちなみに、Javaのバージョンは修正はとっくしてある

    $ java -version
    java version "1.8.0_65"
    Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
    Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)

    $ javac -version
    javac 1.8.0_65

    です

    キャンセル

  • 2017/02/13 22:06

    >文字コードが「ISO-8859-1のbyte配列」を「UTF8のbyte配列」だと思って文字列にしているということですよね。
    >これは利用者(プログラマ)の使い方の問題に思えました。

    いや、そこが問題ではありません。これは、Servlet等で、UTF-8形式の文字列を受け取る古い書き方であり、古いだけでここ単体では問題ありません。
    問題は、getNameeメソッドを読んでから文字コードの処理をしているところで、正しい手順は、文字コードの処理をしてからgetNameメソッドを呼ぶべきところです。「アプリケーションの責任」というのは、このことです。
    ただ、この種の間違いにより、TomcatやIIS等著名ソフトが脆弱性を作り込んでいるので、文字コードの変換処理側でも対処すべきだという流れになっており、主要な言語ではすべて対応しているはずです。

    キャンセル

+1

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/12 12:55

    有益なリンクのご提供ありがとうございます
    一覧でまとまっていて、とてもわかりやすいサイトで、ありがとうございます

    まだ目を通し感じですと、安全に考慮した書き方ですよね。
    勝手な推測ですが、CVEで公表される脆弱性は、安全に書いていても防げなく、Javaの最新版や今後のリリースで改善されるもので、Java自体が持つ脆弱性だと思うのですが、あっていますか?

    または、Javaの標準ライブラリのコードのが提供していただいたリンクに反する書き方により起こる脆弱性を抱えていることがあるということでしょうか?

    キャンセル

  • 2017/02/12 13:22

    redstoneさんのご指摘のように、参照先のドキュメントは、Javaの使い方による脆弱性の問題で、Java自体の脆弱性の話ではないと思います。

    キャンセル

  • 2017/02/12 13:59 編集

    すみません、質問を勘違いしてました。
    Java自体の脆弱性に関しては私もよく分からないです。

    軽く調べた感じだと攻撃が成立するような例は見当たりませんでした。探し方が悪いだけかもしれませんが…。
    概要以上のことを知るにはソースコードを読むとかメーリングリストを購読するとかしないといけないんですかね…。

    キャンセル

  • 2017/02/12 14:15 編集

    > 軽く調べた感じだと攻撃が成立するような例は見当たりませんでした。探し方が悪いだけかもしれませんが…。

    ぼくも同じで、探し方が悪いのかもしれないですが、見つけられなくて。でもJavaとかFlashとか脆弱性だらけなことを聞くので、長い間の疑問です。誤解のある内容だとわかったので、質問タイトルと内容を修正します

    キャンセル

+1

無数にあると思しき脆弱性の中のたった一つだけですが説明して見ます

Javaのデシリアライズ脆弱性について 

上のリンクにあるデシリアライズ時にコードが実行されるというのは実際には恐らく以下のコードでクラスυがデシリアライズされた時の状態です 実行するとυのスーパークラスであるΞのコンストラクタが実行されているのが分かります

別のクラスを継承したクラスをインスタンス化しシリアライズする場合、スーパークラスがSerializableをimplementsしていればそれを継承しているクラスのオブジェクトをシリアライズした後デシリアライズしてもコンストラクタは実行されません

しかし、サブクラスのみがSerializableをimplementsしていてそのサブクラスをインスタンス化しシリアライズする場合、デシリアライズ時にスーパークラスのコンストラクタが実行される事になります

データを転送するためにオブジェクトをシリアライズして送っているものを受け取る場合、以上のように
Serializableをimplementsしているが、スーパークラスはSerializableをimplementsしていないクラスのインスタンスがシリアライズされて送られて来た場合、デシリアライズする時にこのスーパークラスのコンストラクタ内のコードが実行されるのでその中に書かれた攻撃のコードが実行される可能性があるため、シリアライズされたデータを受け取ってデシリアライズする時には基本的に攻撃用コードが実行される事を常に予期していなければならない

これは、どういうコードを書くと脆弱性を突かれるという問題ではなく、

Javaのシリアライズされたデータ全てがこの脆弱性を持つので、受け取ってデシリアライズする際にこの脆弱性を突かれた場合の対策を常にデシリアライズする側のコードに組み込んでおく必要がある

という事だと思います

import java.io.*;
class EA2{

public static void main(String[] args){
System.out.println("----υのオブジェクト生成----");
υ obj = new υ();
System.out.println("----υのオブジェクト生成終了----");
System.out.println("----τのオブジェクト生成----");
τ obj2 = new τ();
System.out.println("----τのオブジェクト生成終了----");

  try (ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("obj.txt"));
         ObjectInputStream i = new ObjectInputStream(new FileInputStream("obj.txt"))){
      o.writeObject(obj2);
      System.out.println("\nτのシリアライズ及び書き込み終わり\n");
      τ re2 = (τ)i.readObject();
      System.out.println("\nτの読み込み及びデシリアライズ終わり\n");
      System.out.println(re2.cont);

      System.out.println("-------------------------------------------------------------");


      o.writeObject(obj);
      System.out.println("\nυのシリアライズ及び書き込み終わり\n");
      υ re = (υ)i.readObject();
      System.out.println("\nυの読み込み及びデシリアライズ終わり\n");
      System.out.println(re.cont);

    } catch (Exception e){
      e.printStackTrace();
    }

}
}

//----------------------------------------------------------
class Ξ{

Ξ(){
System.out.println("Ξのコンストラクタ");

}

}

class υ extends Ξ implements Serializable{

String cont="オブジェクト内内容";


υ(){
System.out.println("υのコンストラクタ");
}

}

//---------------------------------------------------------


class η implements Serializable{
η(){
System.out.println("ηのコンストラクタ");

}
}

class τ extends η{
String cont="オブジェクト内内容";

τ(){
System.out.println("τのコンストラクタ");

}
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/12 14:13

    tetratailさんご回答感謝いたします

    このページに来た人のためとぼくが将来確認したくなるかもしれないので、実行結果をteratailさんコードの実行結果を載せさていただきます。

    ```
    ----υのオブジェクト生成----
    Ξのコンストラクタ
    υのコンストラクタ
    ----υのオブジェクト生成終了----
    ----τのオブジェクト生成----
    ηのコンストラクタ
    τのコンストラクタ
    ----τのオブジェクト生成終了----

    τのシリアライズ及び書き込み終わり


    τの読み込み及びデシリアライズ終わり

    オブジェクト内内容
    -------------------------------------------------------------

    υのシリアライズ及び書き込み終わり

    Ξのコンストラクタ <<<<< [勝手に追記] ここが大事なところですか? 対応コード:υ re = (υ) i.readObject();

    υの読み込み及びデシリアライズ終わり

    オブジェクト内内容
    ```

    理解できたか、自信ありませんが、

    上記の「ここが大事なところですか?」のところが
    >> スーパークラスのコンストラクタ内のコードが実行される
    が起こってるところであっていますか?


    * 脆弱性のあるコードがスーパークラスのコンストラクタに書いてない限り、大丈夫ではないんですか?
    * ライブラリにコンストラクタに脆弱性を持ったクラスと組み合わせて、攻撃するのでしょうか?
    * または、スーパーコンストラクタがデシリアライズ時に呼ばれることが想定外で、脆弱性を作ってしまうのでしょうか?

    理解できたか、自身がないので、わかりませんが、
    Java自体にある脆弱性というよりも、Javaの安全でないかもしれないコーディングのような
    気がしてしまいます。

    キャンセル

  • 2017/02/12 14:18

    >上記の「ここが大事なところですか?」のところが
    >> スーパークラスのコンストラクタ内のコードが実行される
    が起こってるところであっていますか?

    そうです 

    >脆弱性のあるコードがスーパークラスのコンストラクタに書いてない限り、大丈夫では
    そう言えばそうですね 

    >Java自体にある脆弱性というよりも、Javaの安全でないかもしれないコーディングのような
    気が

    そういえばそうですね 僕もこの脆弱性を使って攻撃する方法など思いつかないので
    >Javaの安全でないかもしれないコーディング
    に過ぎないのかも知れません

    キャンセル

+1

redstoneさんはじめ、皆さんも御存知とは思いますが。念のため。自分自身の備忘録としても。

ISECのサイトです。

https://www.ipa.go.jp/security/awareness/vendor/programmingv1/a03.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/13 11:58

    say_you2001さんありがとうございます
    ちなみに、ぼくはそのサイト知らなかったです。

    質問が分かりにくいのですが、
    「Javaで作った自分のシステムが脆弱性」ではなく
    「Java自体が持っている脆弱性」
    が知りたかったです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    16760questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。