これらは、特にバッファ オーバーフローやフォーマット文字列攻撃を受けやすい C 関数です。
通常、Java にはこれらの問題はありませんが、同じ経験則が適用されます。つまり、入力を信頼しないでください。
リフレクションとシリアル化
Java のリフレクション API は、脆弱性の原因となる可能性があります。
攻撃者が提供する文字列の一部をクラス、メソッド、またはプロパティ名として扱わせることができる場合、多くの場合、攻撃者は意図しないことをプログラムに実行させる可能性があります。
例えば、
ObjectInputStream in = ...;
MyType x = (MyType) in.readObject();
コンテンツを制御する攻撃者がin
、CLASSPATH 上の任意のクラスのロードと初期化を引き起こし、CLASSPATH 上のシリアル化可能なクラスの任意のコンストラクターを呼び出すことを可能にします。たとえば、CLASSPATH に JS または Python インタープリターがある場合、Java リフレクションを介してより強力なメソッドにアクセスできる場所から、String -> JavaScript/Python 関数クラスにアクセスできる可能性があります。 .
javax.script
javax.script
は Java 6 で利用可能で、組み込みスクリプト言語で文字列をソース コードに変換できます。信頼できない入力がこれらのシンクに到達すると、スクリプト エンジンの Java リフレクションへのアクセスを使用してファイル システムまたはシェルに到達し、現在のプロセスの所有者の権限で任意のユーザーリング命令を実行できる可能性があります。
XML
Java は、XML 入力の外部エンティティを使用してローカル ネットワークの URL のコンテンツを含めることができる他の言語と同様に、外部エンティティ攻撃に対して脆弱です。
発信接続をフィルター処理するためにフックjava.net.SocketFactory
または使用しない場合SecurityManager
、DTD に表示される URL をホワイトリストに登録できない XML 解析メソッドは脆弱です。
ランタイム / プロセスビルダー
また、Java 固有ではありませんが、ローカル ファイル システム上の実行可能ファイルへのアクセスを許可しますRuntime
。ProcessBuilder
これらに到達する攻撃者が制御する文字列は、アクセス許可の昇格に使用される可能性があります。