2010-12-02 10 views
21

この質問はExploitable PHP Functionsに似ています。悪用可能なJava関数

汚染されたデータは、ユーザー、より具体的には攻撃者からのものです。汚染された変数がシンク関数に達すると、脆弱性が存在します。たとえば、SQLクエリを実行する関数はシンクで、GET/POST変数は汚染の原因です。

Javaクラスライブラリ内のすべてのシンク関数(Javaのフレーバ用)は何ですか?私は脆弱性を導入する機能、すなわちsoftware weaknessを探しています。私は特にリモートでコードが実行される脆弱性に興味があります。ハッカーが影響を与えたいと思う厄介な機能を含むクラス/ライブラリ全体がありますか?人々が誤って危険なJavaコードをどうやって作りますか?

+3

*すべてのシンク関数?このリストは無限である。なぜなら、このような関数を任意に多数定義することができるからである。 – meriton

+0

@meriton PHPのために作成したリストが見えましたか? – rook

+2

私は彼がJavaライブラリのコードを地下のライブラリではないと言います。 – Woot4Moo

答えて

8

コード実行の脆弱性:

  1. プライベート反射が、汚染されたデータは、それが
  2. 十分なパラメータだ検証しません
  3. ネイティブ相互運用コード危険な方法でそこを取得することは珍しいですデシリアライザ。信頼できないデータからデシリアライズしたい場合があるので、おそらく最も危険です。いくつかのシリアライザは比較的安全で、publicコンストラクタ/セッタのみを使用しますが、他のシリアライザはプライベートフィールドにアクセスします。また、タイプホワイトリストがない場合は、任意のタイプをインスタンス化し、それらにセッターを呼び出すことがあります。
  4. 任意の形式のIO、特にファイル
  5. ライブラリの動的ローディング。特に、相対パスを使用します。作業ディレクトリに特定の相対的な実行ファイルの代わりにディレクトリ

で(これは程度.netのですが、私はJavaは非常に似ていると期待して)

データ注入

続いています通常は文字列ではなく、特殊なライブラリ関数を使用することで防ぐことができる関数の注入ファミリです。それらは通常、任意のコードの注入につながることはありません。

  1. HTML injectiong/XSS
  2. SQLインジェクションを(主に(おそらく)異なるタイプを使用して出力し、きれいに脱出し、分離する非エスケープ文字列を自動的にエスケープビューエンジンによって防止)(準備されたステートメントによって防止)
  3. ファイル・パスの注入
+0

+1 deserialzationとファイルI/Oのために –

7

私は本当の弱点を見つけることに掘ると、このリストが成長すると確信しています:

  1. Spring classloader

  2. 飲み込ま例外 - 例外直接搾取を起こさないかもしれないが、それは搾取の非発見につながる可能性を嚥下指摘したように。

  3. String[] commands = {args[0]};
    Runtime.getRuntime().exec(commands);

    私はそれは些細なアイテムであることを認識しますが、上記のようなコードを実行すると、あなたはこのような何か渡しできるようにすることができます:Windows上または;rm -rf /場合の* nix上&& del /

最大危険なJavaコードを作成する方法は、怠け者にすることです。あなたがそれを実行する前にユーザーの入力をクレンジングしていないと述べた。

+0

+1私も実際の悪用を見つけます:) – rook

+2

@Rook Apache Tomcatですが、ベンダーがそれを解決するまでここに掲載しません。 – Woot4Moo

27

ここでは、クライアント側のJavaセキュリティの一般的な調査と、Eclipse IDEを使用したSecurityManagerのチェック方法のリストを示します。

クラスローダーは、クラス(=任意のJavaコードが実行される)を定義:信頼できないソースからロードするクラスにクラスローダーをそらすことができる

java.lang.ClassLoader.defineClass 
java.net.URLClassLoader 

=コード実行

のJavaビーンズイントロスペクションexample vuln - cve-2010-1622

java.beans.Instrospector.getBeanInfo 

=コード実行

ファイルアクセス

java.io.File (constructor) 
java.io.File.delete 
java.io.File.renameTo 
java.io.File.listFiles 
java.io.File.list 

リスト=削除/リネームファイル、ディレクトリ

ファイルストリーム/リーダークラス

java.io.FileInputStream 
java.io.FileOutputStream 
java.io.FileReader 
java.io.FileWriter 
java.io.RandomAccessFile 

=ファイルの読み取り/書き込みアクセス

のJavaシステムプロパティ

System.setProperty 
System.getProperties 
System.getProperty 

=一部のシステム・プロパティは、ほとんど敏感だいくつかの情報が含まれている可能性があり、いくつかのシステムプロパティは、重要なものの実行が、私は例を持っていない変えるかもしれ

かかわらずネイティブライブラリをロード

System.load 
System.loadLibrary 

=任意のコードの実行

実行するオペレーティングシステムの実行可能ファイル

Runtime.exec 
ProcessBuilder (constructor) 

生成ネイティブシステム入力イベント

java.awt.Robot.keyPress/keyRelease 
java.awt.Robot.mouseMove/mousePress/mouseRelease 

(サーバーもグラフィカル環境を持っていない可能性がありますので、たぶん、こじつけ)

Javaのリフレクション - 任意のアクセス(even最終的なコードが実行される機密情報の開示から秘密)フィールドとメソッド

java.lang.Class.getDeclaredMethod 
java.lang.Class.getDeclaredField 
java.lang.reflection.Method.invoke 
java.lang.reflection.Field.set 
java.lang.reflection.Field.get 

=、状況に応じて

Javaスクリプトエンジン

javax.script.ScriptEngine.eval 

=任意のコード実行

+0

+ 1x4素晴らしい投稿 – rook

+0

@Rook:ありがとう!私はその質問が優れていると思う。私はこの厳密な角度からJavaのセキュリティを見たことはありません。 –

+0

+1 - 偉大な仕事と悪用可能なメソッドの本当の網羅的なセット:) – vstoyanov

関連する問題