質問内容
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
を使ったことはある- これでも恥ずかしながらセキュリティスペシャリストの資格がある
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
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 05:56
編集2017/02/12 22:24総合スコア11701
0
redstoneさんはじめ、皆さんも御存知とは思いますが。念のため。自分自身の備忘録としても。
ISECのサイトです。
https://www.ipa.go.jp/security/awareness/vendor/programmingv1/a03.html
投稿2017/02/13 00:05
総合スコア40
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
無数にあると思しき脆弱性の中のたった一つだけですが説明して見ます
上のリンクにあるデシリアライズ時にコードが実行されるというのは実際には恐らく以下のコードでクラスυがデシリアライズされた時の状態です 実行するとυのスーパークラスであるΞのコンストラクタが実行されているのが分かります
別のクラスを継承したクラスをインスタンス化しシリアライズする場合、スーパークラスがSerializableをimplementsしていればそれを継承しているクラスのオブジェクトをシリアライズした後デシリアライズしてもコンストラクタは実行されません
しかし、サブクラスのみがSerializableをimplementsしていてそのサブクラスをインスタンス化しシリアライズする場合、デシリアライズ時にスーパークラスのコンストラクタが実行される事になります
データを転送するためにオブジェクトをシリアライズして送っているものを受け取る場合、以上のように
Serializableをimplementsしているが、スーパークラスはSerializableをimplementsしていないクラスのインスタンスがシリアライズされて送られて来た場合、デシリアライズする時にこのスーパークラスのコンストラクタ内のコードが実行されるのでその中に書かれた攻撃のコードが実行される可能性があるため、シリアライズされたデータを受け取ってデシリアライズする時には基本的に攻撃用コードが実行される事を常に予期していなければならない
これは、どういうコードを書くと脆弱性を突かれるという問題ではなく、
Javaのシリアライズされたデータ全てがこの脆弱性を持つので、受け取ってデシリアライズする際にこの脆弱性を突かれた場合の対策を常にデシリアライズする側のコードに組み込んでおく必要がある
という事だと思います
java
1import java.io.*; 2class EA2{ 3 4public static void main(String[] args){ 5System.out.println("----υのオブジェクト生成----"); 6υ obj = new υ(); 7System.out.println("----υのオブジェクト生成終了----"); 8System.out.println("----τのオブジェクト生成----"); 9τ obj2 = new τ(); 10System.out.println("----τのオブジェクト生成終了----"); 11 12 try (ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("obj.txt")); 13 ObjectInputStream i = new ObjectInputStream(new FileInputStream("obj.txt"))){ 14 o.writeObject(obj2); 15 System.out.println("\nτのシリアライズ及び書き込み終わり\n"); 16 τ re2 = (τ)i.readObject(); 17 System.out.println("\nτの読み込み及びデシリアライズ終わり\n"); 18 System.out.println(re2.cont); 19 20 System.out.println("-------------------------------------------------------------"); 21 22 23 o.writeObject(obj); 24 System.out.println("\nυのシリアライズ及び書き込み終わり\n"); 25 υ re = (υ)i.readObject(); 26 System.out.println("\nυの読み込み及びデシリアライズ終わり\n"); 27 System.out.println(re.cont); 28 29 } catch (Exception e){ 30 e.printStackTrace(); 31 } 32 33} 34} 35 36//---------------------------------------------------------- 37class Ξ{ 38 39Ξ(){ 40System.out.println("Ξのコンストラクタ"); 41 42} 43 44} 45 46class υ extends Ξ implements Serializable{ 47 48String cont="オブジェクト内内容"; 49 50 51υ(){ 52System.out.println("υのコンストラクタ"); 53} 54 55} 56 57//--------------------------------------------------------- 58 59 60class η implements Serializable{ 61η(){ 62System.out.println("ηのコンストラクタ"); 63 64} 65} 66 67class τ extends η{ 68String cont="オブジェクト内内容"; 69 70τ(){ 71System.out.println("τのコンストラクタ"); 72 73} 74}
投稿2017/02/12 04:32
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/12 05:13
退会済みユーザー
2017/02/12 05:18
0
投稿2017/02/12 03:44
総合スコア740
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/12 03:55
2017/02/12 04:22
2017/02/12 05:01 編集
2017/02/12 05:17 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/12 08:07
2017/02/13 02:53
2017/02/13 13:06