45 見つかった項目
脆弱性
Abstract
攻撃者はセキュリティチェックを回避して、アプリケーションに想定外の制御フローパスを作成できる可能性があります。
Explanation
インスタンス化すべきクラスや、呼び出すべきメソッドを決定するためにアプリケーションが使用する値を攻撃者が指定できる場合、アプリケーション開発者の想定外の制御フローパスを攻撃者が作成できる可能性があります。この攻撃手段では、攻撃者は Authentication や Access Control チェックなどを回避できるので、本来意図されていない行動をアプリケーションにさせることができます。特定のメソッドまたはコンストラクタに渡される引数の制御さえできれば、狡猾な攻撃者は攻撃を仕掛けるきっかけを得られる可能性があります。

例: プログラマがリフレクション技術を使用する一般的な理由は、独自のコマンドディスパッチャを実装するためです。次の例は、リフレクションを使用しないコマンドディスパッチャです。


var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var ctl:String = String(params["ctl"]);
var ao:Worker;
if (ctl == "Add) {
ao = new AddCommand();
} else if (ctl == "Modify") {
ao = new ModifyCommand();
} else {
throw new UnknownActionError();
}
ao.doAction(params);


プログラマはこのコードを以下のようにリフレクションを使用するためにリファクタリングすることがあります。


var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var ctl:String = String(params["ctl"]);
var ao:Worker;
var cmdClass:Class = getDefinitionByName(ctl + "Command") as Class;
ao = new cmdClass();
ao.doAction(params);


リファクタリングの実行によって数々の利点が得られるように最初は思われます。コードラインが少なく、if/else ブロックは完全に削除され、コマンドディスパッチャを修正しなくとも新しいコマンドタイプを追加することができるからです。

しかし、リファクタリングによって攻撃者は Worker インターフェイスを実装する任意のオブジェクトのインスタンスを作成することができます。コマンドディスパッチャが依然として Access Control の原因である場合、プログラマは Worker インターフェイスを実装する新規クラスを作成するたびに、ディスパッチャの Access Control コードを忘れずに修正する必要があります。Access Control コードの修正を怠った場合、一部の Worker クラスに対して一切の Access Control が適用されなくなります。

この Access Control の問題を解決する 1 つの方法は、Worker オブジェクトに Access Control のチェックを実行させることです。リファクタリングされたコードの例を次に示します。


var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var ctl:String = String(params["ctl"]);
var ao:Worker;
var cmdClass:Class = getDefinitionByName(ctl + "Command") as Class;
ao = new cmdClass();
ao.checkAccessControl(params);
ao.doAction(params);


これは改良点ではありますが、Access Control への分散アプローチを推奨することになるため、プログラマが Access Control の失敗を犯しやすくなります。
desc.dataflow.actionscript.unsafe_reflection
Abstract
未検証の入力による Continuation オブジェクトのコールバック メソッドの決定を許可すると、攻撃者がアプリケーションを介して予期せぬ制御フロー パスを作成できてしまい、セキュリティ チェックをすり抜けてしまう可能性があります。
Explanation
攻撃者が値を指定し、アプリケーションがそれを使用してどのクラスをインスタンス化するかや、どのメソッドを呼び出すかを決定できてしまうと、攻撃者はアプリケーションを介して予期せぬ制御フロー パスを作成できてしまう可能性があります。これにより、攻撃者が認証チェックやアクセス制御チェックをすり抜けたり、アプリケーションが予期しない方法で動作したりする可能性があります。
例: 次のアクション メソッドは、外部 Web サービスへの非同期要求を開始し、continuationMethod プロパティを設定します。これは、応答を受信したときに呼び出されるメソッドの名前を決定します。

public Object startRequest() {
Continuation con = new Continuation(40);
Map<String,String> params = ApexPages.currentPage().getParameters();
if (params.containsKey('contMethod')) {
con.continuationMethod = params.get('contMethod');
} else {
con.continuationMethod = 'processResponse';
}
HttpRequest req = new HttpRequest();
req.setMethod('GET');
req.setEndpoint(LONG_RUNNING_SERVICE_URL);
this.requestLabel = con.addHttpRequest(req);
return con;
}

この実装により、continuationMethod プロパティをランタイム リクエスト パラメーターで設定できるようになり、攻撃者が、名前と一致する関数を呼び出すことが可能になります。
desc.dataflow.apex.unsafe_reflection
Abstract
攻撃者はセキュリティチェックを回避して、アプリケーションに想定外の制御フローパスを作成できる可能性があります。
Explanation
インスタンス化すべきクラスや、呼び出すべきメソッドを決定するためにアプリケーションが使用する値を攻撃者が指定できる場合、アプリケーション開発者の想定外の制御フローパスを攻撃者が作成できる可能性があります。この攻撃手段では、攻撃者は Authentication や Access Control チェックなどを回避できるので、本来意図されていない行動をアプリケーションにさせることができます。特定のメソッドまたはコンストラクタに渡される引数の制御さえできれば、狡猾な攻撃者は攻撃を仕掛けるきっかけを得られる可能性があります。

例: プログラマは、リフレクションを使用して、コマンド ディスパッチャを実装することがよくあります。次の例は、リフレクションを使用しないコマンドディスパッチャです。


...
Dim ctl As String
Dim ao As New Worker()
ctl = Request.Form("ctl")
If (String.Compare(ctl,"Add") = 0) Then
ao.DoAddCommand(Request)
Else If (String.Compare(ctl,"Modify") = 0) Then
ao.DoModifyCommand(Request)
Else
App.EventLog("No Action Found", 4)
End If
...


プログラマはこのコードを以下のようにリフレクションを使用するためにリファクタリングすることがあります。


...
Dim ctl As String
Dim ao As New Worker()
ctl = Request.Form("ctl")
CallByName(ao, ctl, vbMethod, Request)
...


リファクタリングの実行によって数々の利点が得られるように最初は思われます。コードラインが少なく、if/else ブロックは完全に削除され、コマンドディスパッチャを修正しなくとも新しいコマンドタイプを追加することができるからです。

しかし、リファクタリングによって攻撃者は Worker オブジェクトによって実装された任意のメソッドを呼び出すことができます。コマンドディスパッチャが Access Control の原因である場合、プログラマは Worker クラス内に新規メソッドを作成するたびに、ディスパッチャの Access Control ロジックを忘れずに修正する必要があります。この Access Control ロジックが古くなると、いくつかの Worker メソッドにはいずれの Access Control も関連付けられなくなります。

この Access Control の問題を解決する 1 つの方法は、Worker オブジェクトに Access Control のチェックを実行させることです。リファクタリングされたコードの例を次に示します。


...
Dim ctl As String
Dim ao As New Worker()
ctl = Request.Form("ctl")
If (ao.checkAccessControl(ctl,Request) = True) Then
CallByName(ao, "Do" & ctl & "Command", vbMethod, Request)
End If
...


これは改良点ではありますが、Access Control への分散アプローチを推奨することになるため、プログラマが Access Control の失敗を犯しやすくなります。
desc.dataflow.dotnet.unsafe_reflection
Abstract
攻撃者はセキュリティチェックを回避して、アプリケーションに想定外の制御フローパスを作成できる可能性があります。
Explanation
インスタンス化すべきクラスや、呼び出すべきメソッドを決定するためにアプリケーションが使用する値を攻撃者が指定できる場合、アプリケーション開発者の想定外の制御フローパスを攻撃者が作成できる可能性があります。この攻撃手段では、攻撃者は Authentication や Access Control チェックなどを回避できるので、本来意図されていない行動をアプリケーションにさせることができます。

このような状況が発生した場合、攻撃者がアプリケーション パスやライブラリ パスが示す場所にファイルをアップロードすることが可能になると、致命的な結果を招きます。このいずれかの条件下では、攻撃者はリフレクションを使用して、悪意あるものである可能性が高い新しい動作をアプリケーションに持ち込むことができます。
例: プログラマがリフレクション API を使用する一般的な理由は、独自のコマンド ディスパッチャを実装するためです。次の JNI コマンドディスパッチャの例では、リフレクションを使用して、CGI リクエストから読み込んだ値によって認識された Java メソッドを実行しています。この実装により、攻撃者は clazz で定義された任意の関数をコールできるようになります。


char* ctl = getenv("ctl");
...
jmethodID mid = GetMethodID(clazz, ctl, sig);
status = CallIntMethod(env, clazz, mid, JAVA_ARGS);
...
desc.dataflow.cpp.unsafe_reflection
Abstract
攻撃者はセキュリティチェックを回避して、アプリケーションに想定外の制御フローパスを作成できる可能性があります。
Explanation
インスタンス化すべきクラスや、呼び出すべきメソッドを決定するためにアプリケーションが使用する値を攻撃者が指定できる場合、アプリケーション開発者の想定外の制御フローパスを攻撃者が作成できる可能性があります。この攻撃手段では、攻撃者は Authentication や Access Control チェックなどを回避できるので、本来意図されていない行動をアプリケーションにさせることができます。特定のメソッドまたはコンストラクタに渡される引数の制御さえできれば、狡猾な攻撃者は攻撃を仕掛けるきっかけを得られる可能性があります。

攻撃者がファイルをアプリケーションのクラスパス上に表示される場所にアップロードできる、または新しいエントリをアプリケーションのクラスパス上に追加できる場合、これは最悪のシナリオになってしまいます。このいずれかの条件下では、攻撃者はリフレクションを使用して、悪意あるものである可能性が高い新しい動作をアプリケーションに持ち込むことができます。
例: プログラマがリフレクション API を使用する一般的な理由は、独自のコマンド ディスパッチャを実装するためです。次の例は、リフレクションを使用しないコマンドディスパッチャです。


String ctl = request.getParameter("ctl");
Worker ao = null;
if (ctl.equals("Add")) {
ao = new AddCommand();
} else if (ctl.equals("Modify")) {
ao = new ModifyCommand();
} else {
throw new UnknownActionError();
}
ao.doAction(request);


プログラマはこのコードを以下のようにリフレクションを使用するためにリファクタリングすることがあります。


String ctl = request.getParameter("ctl");
Class cmdClass = Class.forName(ctl + "Command");
Worker ao = (Worker) cmdClass.newInstance();
ao.doAction(request);


リファクタリングの実行によって数々の利点が得られるように最初は思われます。コードラインが少なく、if/else ブロックは完全に削除され、コマンドディスパッチャを修正しなくとも新しいコマンドタイプを追加することができるからです。

しかし、リファクタリングによって攻撃者は Worker インターフェイスを実装する任意のオブジェクトのインスタンスを作成することができます。コマンドディスパッチャが依然として Access Control の原因である場合、プログラマは Worker インターフェイスを実装する新規クラスを作成するたびに、ディスパッチャの Access Control コードを忘れずに修正する必要があります。Access Control コードの修正を怠った場合、一部の Worker クラスに対して一切の Access Control が適用されなくなります。

この Access Control の問題を解決する 1 つの方法は、Worker オブジェクトに Access Control のチェックを実行させることです。リファクタリングされたコードの例を次に示します。


String ctl = request.getParameter("ctl");
Class cmdClass = Class.forName(ctl + "Command");
Worker ao = (Worker) cmdClass.newInstance();
ao.checkAccessControl(request);
ao.doAction(request);


これは改良点ではありますが、Access Control への分散アプローチを推奨することになるため、プログラマが Access Control の失敗を犯しやすくなります。

また、このコードは、コマンド ディスパッチャをビルドするためにリフレクションを使用する別のセキュリティ問題を浮き彫りにします。攻撃者は任意の種類のオブジェクトにデフォルトコンストラクタを呼び出すことができます。実際に、攻撃者は Worker インターフェイスを実装するオブジェクトにすら制約を受けず、システム内の任意のオブジェクトのデフォルト コンストラクタを呼び出すことができます。オブジェクトが Worker インターフェイスを実装しない場合、ao への割り当て前に ClassCastException が発生しますが、コンストラクタが攻撃者に有利に働く操作を実行すると、すでに被害を被ったことになります。このシナリオは、簡単なアプリケーションの場合被害は比較的少なくて済みますが、複雑度が飛躍的に増す大規模アプリケーションの場合では攻撃者は攻撃に利用できるコンストラクタを見つけられると考えるのが妥当です。

直接呼び出し元のクラスローダーチェックを使用してタスクを実行する一部のJava APIが、リフレクションコールで返された信頼のないオブジェクトに対して呼び出された場合には、アクセスチェックがコード実行チェーンのセキュリティにより有効に働く場合があります。これらのJava APIは、実行チェーン内のすべての呼び出し元が必要なセキュリティ権限を持っていることを確認するSecurityManagerチェックをバイパスします。これらのAPIは、セキュリティアクセスチェックをバイパスして、リモートの攻撃に対するシステム脆弱性を残す可能性があるため、リフレクションで返される信頼のないオブジェクトには呼び出さないように注意する必要があります。Java APIの詳細については、『The Secure Coding Guidelines for the Java Programming Language』の「Guideline 9」を参照してください。
References
[1] Secure Coding Guidelines for the Java Programming Language, Version 4.0
desc.dataflow.java.unsafe_reflection
Abstract
攻撃者は performSelector メソッドの引数を制御できるため、セキュリティ チェックを回避して、アプリケーションに想定外の制御フロー パスを作成できる可能性があります。
Explanation
インスタンス化すべきクラスや、呼び出すべきメソッドを決定するためにアプリケーションが使用する値を攻撃者が指定できる場合、アプリケーション開発者の想定外の制御フローパスを攻撃者が作成できる可能性があります。この攻撃手段では、攻撃者は Authentication や Access Control チェックなどを回避できるので、本来意図されていない行動をアプリケーションにさせることができます。

例 1: プログラマがセレクター API を使用する一般的な理由は、独自のコマンド ディスパッチャを実装するためです。次の Objective-C コマンドディスパッチャの例では、リフレクションを使用して、カスタム URL スキームリクエストから読み込んだ値によって認識される任意のメソッドを実行しています。この実装により、攻撃者は UIApplicationDelegate クラスで定義されたメソッド シグネチャに一致する任意の関数をコールできるようになります。


...
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {

NSString *query = [url query];
NSString *pathExt = [url pathExtension];
[self performSelector:NSSelectorFromString(pathExt) withObject:query];
...
desc.dataflow.objc.unsafe_reflection
Abstract
攻撃者はセキュリティチェックを回避して、アプリケーションに想定外の制御フローパスを作成できる可能性があります。
Explanation
インスタンス化すべきクラスや、呼び出すべきメソッドを決定するためにアプリケーションが使用する値を攻撃者が指定できる場合、アプリケーション開発者の想定外の制御フローパスを攻撃者が作成できる可能性があります。この攻撃手段では、攻撃者は Authentication や Access Control チェックなどを回避できるので、本来意図されていない行動をアプリケーションにさせることができます。特定のメソッドまたはコンストラクタに渡される引数の制御さえできれば、狡猾な攻撃者は攻撃を仕掛けるきっかけを得られる可能性があります。

攻撃者がファイルをアプリケーションのクラスパス上に表示される場所にアップロードできる、または新しいエントリをアプリケーションのクラスパス上に追加できる場合、これは最悪のシナリオになってしまいます。このいずれかの条件下では、攻撃者はリフレクションを使用して、悪意あるものである可能性が高い新しい動作をアプリケーションに持ち込むことができます。
例: プログラマがリフレクション API を使用する一般的な理由は、独自のコマンド ディスパッチャを実装するためです。次の例は、リフレクションを使用しないコマンドディスパッチャです。


$ctl = $_GET["ctl"];
$ao = null;
if (ctl->equals("Add")) {
$ao = new AddCommand();
} else if ($ctl.equals("Modify")) {
$ao = new ModifyCommand();
} else {
throw new UnknownActionError();
}
$ao->doAction(request);


プログラマはこのコードを以下のようにリフレクションを使用するためにリファクタリングすることがあります。


$ctl = $_GET["ctl"];
$args = $_GET["args"];
$cmdClass = new ReflectionClass(ctl . "Command");
$ao = $cmdClass->newInstance($args);
$ao->doAction(request);


リファクタリングの実行によって数々の利点が得られるように最初は思われます。コードラインが少なく、if/else ブロックは完全に削除され、コマンドディスパッチャを修正しなくとも新しいコマンドタイプを追加することができるからです。

しかし、リファクタリングによって攻撃者は Worker インターフェイスを実装する任意のオブジェクトのインスタンスを作成することができます。コマンドディスパッチャが依然として Access Control の原因である場合、プログラマは Worker インターフェイスを実装する新規クラスを作成するたびに、ディスパッチャの Access Control コードを忘れずに修正する必要があります。Access Control コードの修正を怠った場合、一部の Worker クラスに対して一切の Access Control が適用されなくなります。

この Access Control の問題を解決する 1 つの方法は、Worker オブジェクトに Access Control のチェックを実行させることです。リファクタリングされたコードの例を次に示します。


$ctl = $_GET["ctl"];
$args = $_GET["args"];
$cmdClass = new ReflectionClass(ctl . "Command");
$ao = $cmdClass->newInstance($args);
$ao->checkAccessControl(request);
ao->doAction(request);


これは改良点ではありますが、Access Control への分散アプローチを推奨することになるため、プログラマが Access Control の失敗を犯しやすくなります。

また、このコードは、コマンド ディスパッチャをビルドするためにリフレクションを使用する別のセキュリティ問題を浮き彫りにします。攻撃者は任意の種類のオブジェクトにデフォルトコンストラクタを呼び出すことができます。実際に、攻撃者は Worker インターフェイスを実装するオブジェクトにすら制約を受けず、システム内の任意のオブジェクトのデフォルト コンストラクタを呼び出すことができます。オブジェクトが Worker インターフェイスを実装しない場合、$ao への割り当て前に ClassCastException が発生しますが、コンストラクタが攻撃者に有利に働く操作を実行すると、すでに被害を被ったことになります。このシナリオは、簡単なアプリケーションの場合被害は比較的少なくて済みますが、複雑度が飛躍的に増す大規模アプリケーションの場合では攻撃者は攻撃に利用できるコンストラクタを見つけられると考えるのが妥当です。
desc.dataflow.php.unsafe_reflection
Abstract
攻撃者はセキュリティチェックを回避して、アプリケーションに想定外の制御フローパスを作成できる可能性があります。
Explanation
インスタンス化すべきクラスや、呼び出すべきメソッドを決定するためにアプリケーションが使用する値を攻撃者が指定できる場合、アプリケーション開発者の想定外の制御フローパスを攻撃者が作成できる可能性があります。この攻撃手段では、攻撃者は Authentication や Access Control チェックなどを回避できるので、本来意図されていない行動をアプリケーションにさせることができます。特定のメソッドまたはコンストラクタに渡される引数の制御さえできれば、狡猾な攻撃者は攻撃を仕掛けるきっかけを得られる可能性があります。

攻撃者がファイルをアプリケーションのクラスパス上に表示される場所にアップロードできる、または新しいエントリをアプリケーションのクラスパス上に追加できる場合、これは最悪のシナリオになってしまいます。このいずれかの条件下では、攻撃者はリフレクションを使用して、悪意あるものである可能性が高い新しい動作をアプリケーションに持ち込むことができます。
desc.dataflow.python.unsafe_reflection
Abstract
攻撃者はセキュリティチェックを回避して、アプリケーションに想定外の制御フローパスを作成できる可能性があります。
Explanation
インスタンス化すべきクラスや、呼び出すべきメソッドを決定するためにアプリケーションが使用する値を攻撃者が指定できる場合、アプリケーション開発者の想定外の制御フローパスを攻撃者が作成できる可能性があります。この攻撃手段では、攻撃者は Authentication や Access Control チェックを回避したり、本来意図されていない行動をアプリケーションにさせたりすることができます。特定のメソッドまたはコンストラクタに渡される引数の制御さえできれば、狡猾な攻撃者は攻撃を仕掛けるきっかけを得られる可能性があります。

攻撃者がファイルをアプリケーションのロード パス上に現れる場所にアップロードできたり、新しいエントリをアプリケーションのロード パス上に追加できたりしたら、最悪のシナリオになってしまいます。このいずれかの条件下では、攻撃者はリフレクションを使用して、悪意あるものである可能性が高い新しい動作をアプリケーションに持ち込むことができます。
例: プログラマがリフレクションを使用する一般的な理由は、独自のコマンド ディスパッチャを実装するためです。次の例は、リフレクションを使用しないコマンドディスパッチャです。


ctl = req['ctl']
if ctl=='add'
addCommand(req)
elsif ctl=='modify'
modifyCommand(req)
else
raise UnknownCommandError.new
end


プログラマはこのコードを以下のようにリフレクションを使用するためにリファクタリングすることがあります。


ctl = req['ctl']
ctl << "Command"
send(ctl)


リファクタリングの実行によって数々の利点が得られるように最初は思われます。コードラインが少なく、if/else ブロックは完全に削除され、コマンドディスパッチャを修正しなくとも新しいコマンドタイプを追加することができるからです。

しかし、リファクタリングによって攻撃者は「Command」という単語で終わる任意のメソッドを実行できます。コマンド ディスパッチャが依然として Access Control を担う場合、プログラマは「Command」で終わる新規メソッドを作成するたびに、ディスパッチャの Access Control コードを忘れずに修正する必要があります。その場合でも、似た名前を持つ複数のメソッドがある場合の一般的な対処方法は、これらを define_method() を使用して動的に作成するか、missing_method() の上書きによってコールすることです。こうした状況とそこでアクセス制御コードがどう使用されるかを監査し、追跡するのは非常に困難です。また、他のどのライブラリ コードがロードされたかにも依存することを考えると、この作業をこの方法で適切に行うことはほぼ不可能です。
desc.dataflow.ruby.unsafe_reflection
Abstract
攻撃者はセキュリティチェックを回避して、アプリケーションに想定外の制御フローパスを作成できる可能性があります。
Explanation
インスタンス化すべきクラスや、呼び出すべきメソッドを決定するためにアプリケーションが使用する値を攻撃者が指定できる場合、アプリケーション開発者の想定外の制御フローパスを攻撃者が作成できる可能性があります。この攻撃手段では、攻撃者は Authentication や Access Control チェックなどを回避できるので、本来意図されていない行動をアプリケーションにさせることができます。特定のメソッドまたはコンストラクタに渡される引数の制御さえできれば、狡猾な攻撃者は攻撃を仕掛けるきっかけを得られる可能性があります。

攻撃者がファイルをアプリケーションのクラスパス上に表示される場所にアップロードできる、または新しいエントリをアプリケーションのクラスパス上に追加できる場合、これは最悪のシナリオになってしまいます。このいずれかの条件下では、攻撃者はリフレクションを使用して、悪意あるものである可能性が高い新しい動作をアプリケーションに持ち込むことができます。
例: プログラマがリフレクション API を使用する一般的な理由は、独自のコマンド ディスパッチャを実装するためです。次の例は、リフレクションを使用するコマンド ディスパッチャです。


def exec(ctl: String) = Action { request =>
val cmdClass = Platform.getClassForName(ctl + "Command")
Worker ao = (Worker) cmdClass.newInstance()
ao.doAction(request)
...
}


リファクタリングの実行によって数々の利点が得られるように最初は思われます。コード ラインが少なく、if/else ブロックは完全に削除され、コマンド ディスパッチャを修正しなくとも新しいコマンド タイプを追加することができるからです。

しかし、リファクタリングによって攻撃者は Worker インターフェイスを実装する任意のオブジェクトのインスタンスを作成することができます。コマンド ディスパッチャが依然として Access Control の原因である場合、プログラマは Worker インターフェイスを実装する新規クラスを作成するたびに、ディスパッチャの Access Control コードを忘れずに修正する必要があります。Access Control コードの修正を怠った場合、一部の Worker クラスに対して一切の Access Control が適用されなくなります。

この Access Control の問題を解決する 1 つの方法は、Worker オブジェクトに Access Control のチェックを実行させることです。リファクタリングされたコードの例を次に示します。


def exec(ctl: String) = Action { request =>
val cmdClass = Platform.getClassForName(ctl + "Command")
Worker ao = (Worker) cmdClass.newInstance()
ao.checkAccessControl(request);
ao.doAction(request)
...
}


これは改良点ではありますが、Access Control への分散アプローチを推奨することになるため、プログラマが Access Control の失敗を犯しやすくなります。

また、このコードは、コマンド ディスパッチャをビルドするためにリフレクションを使用する別のセキュリティ問題を浮き彫りにします。攻撃者は任意の種類のオブジェクトにデフォルトコンストラクタを呼び出すことができます。実際に、攻撃者は Worker インターフェイスを実装するオブジェクトにすら制約を受けず、システム内の任意のオブジェクトのデフォルト コンストラクタを呼び出すことができます。オブジェクトが Worker インターフェイスを実装しない場合、ao への割り当て前に ClassCastException が発生しますが、コンストラクタが攻撃者に有利に働く操作を実行すると、すでに被害を被ったことになります。このシナリオは、簡単なアプリケーションの場合被害は比較的少なくて済みますが、複雑度が飛躍的に増す大規模アプリケーションの場合では攻撃者は攻撃に利用できるコンストラクタを見つけられると考えるのが妥当です。

直接呼び出し元のクラスローダーチェックを使用してタスクを実行する一部のJava APIが、リフレクションコールで返された信頼のないオブジェクトに対して呼び出された場合には、アクセスチェックがコード実行チェーンのセキュリティにより有効に働く場合があります。これらのJava APIは、実行チェーン内のすべての呼び出し元が必要なセキュリティ権限を持っていることを確認するSecurityManagerチェックをバイパスします。これらのAPIは、セキュリティアクセスチェックをバイパスして、リモートの攻撃に対するシステム脆弱性を残す可能性があるため、リフレクションで返される信頼のないオブジェクトには呼び出さないように注意する必要があります。Java APIの詳細については、『The Secure Coding Guidelines for the Java Programming Language』の「Guideline 9」を参照してください。
References
[1] Secure Coding Guidelines for the Java Programming Language, Version 4.0
desc.dataflow.scala.unsafe_reflection
Abstract
攻撃者は performSelector メソッドの引数を制御できるため、セキュリティ チェックを回避して、アプリケーションに想定外の制御フロー パスを作成できる可能性があります。
Explanation
インスタンス化すべきクラスや、呼び出すべきメソッドを決定するためにアプリケーションが使用する値を攻撃者が指定できる場合、アプリケーション開発者の想定外の制御フローパスを攻撃者が作成できる可能性があります。この攻撃手段では、攻撃者は Authentication や Access Control チェックなどを回避できるので、本来意図されていない行動をアプリケーションにさせることができます。

例 1: プログラマがセレクター API を使用する一般的な理由は、独自のコマンド ディスパッチャを実装するためです。次の Swift コマンド ディスパッチャの例では、リフレクションを使用して、カスタム URL スキーム リクエストから読み込んだ値によって認識される任意のメソッドを実行しています。この実装により、攻撃者は UIApplicationDelegate クラスで定義されたメソッド シグネチャに一致する任意の関数をコールできるようになります。


func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
...
let query = url.query
let pathExt = url.pathExtension
let selector = NSSelectorFromString(pathExt!)
performSelector(selector, withObject:query)
...
}
desc.dataflow.swift.unsafe_reflection
Abstract
攻撃者はセキュリティチェックを回避して、アプリケーションに想定外の制御フローパスを作成できる可能性があります。
Explanation
インスタンス化すべきクラスや、呼び出すべきメソッドを決定するためにアプリケーションが使用する値を攻撃者が指定できる場合、アプリケーション開発者の想定外の制御フローパスを攻撃者が作成できる可能性があります。この攻撃手段では、攻撃者は Authentication や Access Control チェックなどを回避できるので、本来意図されていない行動をアプリケーションにさせることができます。特定のメソッドまたはコンストラクタに渡される引数の制御さえできれば、狡猾な攻撃者は攻撃を仕掛けるきっかけを得られる可能性があります。

例: プログラマが CallByNam を使用する一般的な理由は、独自のコマンドディスパッチャを実装するためです。次の例は、CallByName 関数を使用しないコマンドディスパッチャです。


...
Dim ctl As String
Dim ao As new Worker
ctl = Request.Form("ctl")
If String.Compare(ctl,"Add") = 0 Then
ao.DoAddCommand Request
Else If String.Compare(ctl,"Modify") = 0 Then
ao.DoModifyCommand Request
Else
App.EventLog "No Action Found", 4
End If
...



プログラマはこのコードを以下のようにリフレクションを使用するためにリファクタリングすることがあります。


...
Dim ctl As String
Dim ao As Worker
ctl = Request.Form("ctl")
CallByName ao, ctl, vbMethod, Request
...




リファクタリングの実行によって数々の利点が得られるように最初は思われます。コードラインが少なく、if/else ブロックは完全に削除され、コマンドディスパッチャを修正しなくとも新しいコマンドタイプを追加することができるからです。

しかし、リファクタリングによって攻撃者は Worker オブジェクトによって実装された任意のメソッドを呼び出すことができます。コマンドディスパッチャが依然として Access Control の原因である場合、プログラマは Worker クラス内に新規メソッドを作成するたびに、ディスパッチャの Access Control コードを忘れずに修正する必要があります。Access Control コードの修正を怠った場合、一部の Worker メソッドに対して一切の Access Control が適用されなくなります。

この Access Control の問題を解決する 1 つの方法は、Worker オブジェクトに Access Control のチェックを実行させることです。リファクタリングされたコードの例を次に示します。


...
Dim ctl As String
Dim ao As Worker
ctl = Request.Form("ctl")
If ao.checkAccessControl(ctl,Request) = True Then
CallByName ao, "Do" & ctl & "Command", vbMethod, Request
End If
...



これは改良点ではありますが、Access Control への分散アプローチを推奨することになるため、プログラマが Access Control の失敗を犯しやすくなります。
desc.dataflow.vb.unsafe_reflection
Abstract
外部エンティティレゾリューションの回避も制限もしない設定の XML パーサーを使用すると、パーサーが XML External Entities 攻撃にさらされる可能性があります。
Explanation
XML External Entities 攻撃は、処理の際に動的にドキュメントを作成する XML の機能を利用しています。XML エンティティは、特定のリソースから動的にデータを取り込むことができます。外部エンティティでは、XML ドキュメントに外部 URI からのデータを含めることができます。別途設定をしない限り、外部エンティティは XML パーサーに URI で指定されたリソース (たとえば、ローカルマシンまたはリモートシステム上のファイル) へのアクセスを強制します。この動作は、アプリケーションを XML External Entity (XXE) 攻撃にさらします。この攻撃は、ローカルシステムサービスの拒否、ローカルマシン上のファイルへの未許可のアクセス、リモートマシンのスキャン、および、リモートシステムのサービスの拒否をするのに使用されます。

次の XML ドキュメントは、XXE 攻撃の例です。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/winnt/win.ini" >]><foo>&xxe;</foo>


この例では、XML パーサーがエンティティをファイルの内容と置き換えようとすると、C:\winnt\win.ini システムファイルの内容が公開される可能性があります。
References
[1] XML Denial of Service Attacks and Defenses MSDN Magazine
[2] XML External Entity (XXE) Processing OWASP
[3] Testing for XML Injection OWASP
[4] XML External Entities The Web Application Security Consortium
desc.controlflow.dotnet.xml_external_entity_injection
Abstract
この特定のメソッドは、外部エンティティの参照を許可しています。このコールにより、攻撃者は XML 外部エンティティを XML 文書に挿入して、ファイルの内容または内部ネットワークリソースを開示する可能性があります。
Explanation
次の場合に XML External Entity (XXE) injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。

2. データは XML 文書内の DTD (Document Type Definition) の<ENTITY> 要素に書き込まれます。

アプリケーションは、通常、XML を使用してデータを保存したりメッセージを送信したりします。XML がデータの保存に使用される場合、XML 文書はデータベースのように扱われ、重要な情報が含まれる場合があります。XML メッセージは、Web サービスでも頻繁に使用されており、重要な情報を送信するときにも使用される場合があります。XML メッセージは、認証情報を送信するときに使用されることさえあります。

攻撃者にユーザー加工前の XML への書き込みができる場合、XML 文書およびメッセージのセマンティクスが改変される場合があります。最も害のない場合でも、攻撃者はネスト化されたエンティティ参照を挿入し、XML パーサーに大量の CPU リソースを消費させ続けることができます。より悪質な XML External Entity Injection の場合、攻撃者は、ローカルの File System リソースの内容を開示したり内部ネットワーク リソースの存在を明らかにしたりする XML 要素を追加できる可能性があります。

例 1: XXE 攻撃に対して脆弱な Objective-C コードの例を次に示します。


- (void) parseSomeXML: (NSString *) rawXml {

BOOL success;
NSData *rawXmlConvToData = [rawXml dataUsingEncoding:NSUTF8StringEncoding];
NSXMLParser *myParser = [[NSXMLParser alloc] initWithData:rawXmlConvToData];
[myParser setShouldResolveExternalEntities:YES];
[myParser setDelegate:self];
}


次のような XML で攻撃者が rawXml を制御できると考えてみます。


<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>


XML がサーバーによって評価される場合、<foo> 要素には boot.ini ファイルの内容が含まれます。
desc.semantic.cpp.xml_external_entity_injection
Abstract
外部エンティティレゾリューションの回避も制限もしない設定の XML パーサーを使用すると、パーサーが XML External Entities 攻撃にさらされる可能性があります。
Explanation
XML External Entities 攻撃は、処理の際に動的にドキュメントを作成する XML の機能を利用しています。XML エンティティは、特定のリソースから動的にデータを取り込むことができます。外部エンティティでは、XML ドキュメントに外部 URI からのデータを含めることができます。別途設定をしない限り、外部エンティティは XML パーサーに URI で指定されたリソース (たとえば、ローカルマシンまたはリモートシステム上のファイル) へのアクセスを強制します。この動作は、アプリケーションを XML External Entity (XXE) 攻撃にさらします。この攻撃は、ローカルシステムサービスの拒否、ローカルマシン上のファイルへの未許可のアクセス、リモートマシンのスキャン、および、リモートシステムのサービスの拒否をするのに使用されます。

次の XML ドキュメントは、XXE 攻撃の例です。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>


この例では、XML パーサーがエンティティを /dev/random ファイルの内容に置き換えようとすると、サーバー (UNIX システム) がクラッシュする可能性があります。
References
[1] XML External Entity (XXE) Processing OWASP
[2] Testing for XML Injection OWASP
[3] XML External Entities The Web Application Security Consortium
[4] IDS17-J. Prevent XML External Entity Attacks CERT
[5] DOS-1: Beware of activities that may use disproportionate resources Oracle
[6] INJECT-5: Restrict XML inclusion Oracle
desc.semantic.java.xxe_injection
Abstract
この特定のメソッドは、外部エンティティの参照を許可しています。このコールにより、攻撃者は XML 外部エンティティを XML 文書に挿入して、ファイルの内容または内部ネットワークリソースを開示する可能性があります。
Explanation
次の場合に XML External Entity (XXE) injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。

2. XML 文書内の DTD (Document Type Definition) の <ENTITY> 要素にデータが書き込まれた場合。

アプリケーションは、通常、XML を使用してデータを保存したりメッセージを送信したりします。XML がデータの保存に使用される場合、XML 文書はデータベースのように扱われ、重要な情報が含まれる場合があります。XML メッセージは、Web サービスでも頻繁に使用されており、重要な情報を送信するときにも使用される場合があります。XML メッセージは、認証情報を送信するときに使用されることさえあります。

攻撃者にユーザー加工前の XML への書き込みができる場合、XML 文書およびメッセージのセマンティクスが改変される場合があります。最も害のない場合でも、攻撃者はネスト化されたエンティティ参照を挿入し、XML パーサーに大量の CPU リソースを消費させ続けることができます。より悪質な XML External Entity Injection の場合、攻撃者は、ローカルの File System リソースの内容を開示したり内部ネットワーク リソースの存在を明らかにしたりする XML 要素を追加できる可能性があります。

例 1: XXE 攻撃に対して脆弱なコードの例を次に示します。


- (void) parseSomeXML: (NSString *) rawXml {

BOOL success;
NSData *rawXmlConvToData = [rawXml dataUsingEncoding:NSUTF8StringEncoding];
NSXMLParser *myParser = [[NSXMLParser alloc] initWithData:rawXmlConvToData];
[myParser setShouldResolveExternalEntities:YES];
[myParser setDelegate:self];
}


次のような XML で攻撃者が rawXml を制御できると考えてみます。


<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>


XML がサーバーによって評価される場合、<foo> 要素には boot.ini ファイルの内容が含まれます。
desc.semantic.objc.xml_external_entity_injection
Abstract
未検証の XML 文書を処理することによって、攻撃者が、XML の構造およびコンテンツを改竄したり、ホストサーバーのポートをスキャンしたり、内部ネットワークをホストスキャンしたり、ファイルシステム内の任意のファイルや、アプリケーションの Denial of Service の原因を組み込む可能性があります。
Explanation
次の場合に XML External Entity (XXE) injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。

2. このデータは、XML 文書に書き込まれます。

アプリケーションは、通常、XML を使用してデータを保存したりメッセージを送信したりします。XML がデータの保存に使用される場合、XML 文書はデータベースのように扱われ、重要な情報が含まれる場合があります。XML メッセージは、Web サービスでも頻繁に使用されており、重要な情報を送信するときにも使用される場合があります。XML メッセージは、認証情報を送信するときに使用されることさえあります。

攻撃者にユーザー加工前の XML への書き込みができる場合、XML 文書およびメッセージのセマンティクスが改変される場合があります。最も害のない場合でも、攻撃者はネスト化されたエンティティ参照を挿入し、XML パーサーに大量の CPU リソースを消費させ続けることができます。より悪質な XML External Entity Injection の場合、攻撃者はローカルの File System リソースの内容を開示したり、内部ネットワーク リソースの存在を明らかにしたり、バックエンド コンテンツ自体を危険にさらす XML 要素を追加できる可能性があります。

例 1: XXE 攻撃に対して脆弱なコードの例を次に示します。

攻撃者は以下のコードへの XML 入力を制御できるものと仮定します。


...
<?php
$goodXML = $_GET["key"];
$doc = simplexml_load_string($goodXml);
echo $doc->testing;
?>
...


ここで、攻撃者からExample 2 のコードに以下の XML が渡されると仮定してください。



<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>



この XML を処理するとき、<foo> 要素のコンテンツにはシステムの boot.ini ファイルのコンテンツが埋め込まれます。攻撃者は、データを盗み出したり、ネットワーク リソースの存在に関する情報を取得するために、クライアントに返される XML 要素を利用することができます。
desc.dataflow.php.xml_external_entity_injection
Abstract
外部エンティティ レゾリューションの回避も制限もしない XML プロセッサーを使用すると、アプリケーションが XML External Entities 攻撃にさらされる可能性があります。
Explanation
XML External Entities 攻撃は、実行時にドキュメントを動的に作成する XML の機能を利用しています。XML エンティティは、特定のリソースからデータを動的に取り込めるようにします。外部エンティティでは、XML ドキュメントに外部 URI からのデータを含めることができます。別途設定をしない限り、外部エンティティは XML パーサーに対し、URI で指定されたリソース (ローカル マシン上またはリモート システム上のファイルなど) へのアクセスを強制します。この動作は、アプリケーションを XML External Entity (XXE) 攻撃にさらします。これは攻撃者が、ローカル システムのサービス妨害、ローカル マシン上のファイルへの未許可のアクセス、リモート マシンのスキャン、リモート システムのサービス妨害をするのに使用します。


例 1: 次の XML ドキュメントは、XXE 攻撃の例です。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>


この例では、XML パーサーがエンティティを /dev/random ファイルの内容に置き換えようとすると、サーバー (UNIX システム) がクラッシュする可能性があります。
References
[1] XML vulnerabilities
[2] Announcing defusedxml, Fixes for XML Security Issues
[3] defusedxml
[4] defusedexpat
[5] XML External Entity (XXE) Processing OWASP
[6] Testing for XML Injection (OWASP-DV-008) OWASP
[7] XML External Entities The Web Application Security Consortium
desc.dataflow.python.xxe_injection
Abstract
外部エンティティレゾリューションの回避も制限もしない設定の XML パーサーを使用すると、パーサーが XML External Entities 攻撃にさらされる可能性があります
Explanation
XML External Entities 攻撃は、処理の際に動的にドキュメントを作成する XML の機能を利用しています。XML エンティティは、特定のリソースから動的にデータを取り込むことができます。外部エンティティでは、XML ドキュメントに外部 URI からのデータを含めることができます。別途設定をしない限り、外部エンティティは XML パーサーに URI で指定されたリソース (たとえば、ローカルマシンまたはリモートシステム上のファイル) へのアクセスを強制します。この動作は、アプリケーションを XML External Entity (XXE) 攻撃にさらします。この攻撃は、ローカルシステムサービスの拒否、ローカルマシン上のファイルへの未許可のアクセス、リモートマシンのスキャン、および、リモートシステムのサービスの拒否をするのに使用されます。

次の XML ドキュメントは、XXE 攻撃の例です。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>


例の XML ドキュメントでは、/etc/passwd のコンテンツを読み込み、それらをドキュメントに含めます。

例 1: 次のコードでは、安全でない XML パーサーを使用して HTTP リクエストからの信頼されていない入力を処理します。


def readFile() = Action { request =>
val xml = request.cookies.get("doc")
val doc = XMLLoader.loadString(xml)
...
}
References
[1] XML External Entity (XXE) Processing OWASP
[2] Testing for XML Injection OWASP
[3] XML External Entities The Web Application Security Consortium
[4] IDS17-J. Prevent XML External Entity Attacks CERT
[5] DOS-1: Beware of activities that may use disproportionate resources Oracle
[6] INJECT-5: Restrict XML inclusion Oracle
desc.dataflow.scala.xml_external_entity_injection
Abstract
この特定のメソッドは、外部エンティティの参照を許可しています。このコールにより、攻撃者は XML 外部エンティティを XML 文書に挿入して、ファイルの内容または内部ネットワークリソースを開示する可能性があります。
Explanation
次の場合に XML External Entity (XXE) injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。

2. データは XML 文書内の DTD (Document Type Definition) の<ENTITY> 要素に書き込まれます。

アプリケーションは、通常、XML を使用してデータを保存したりメッセージを送信したりします。XML がデータの保存に使用される場合、XML 文書はデータベースのように扱われ、重要な情報が含まれる場合があります。XML メッセージは、Web サービスでも頻繁に使用されており、重要な情報を送信するときにも使用される場合があります。XML メッセージは、認証情報を送信するときに使用されることさえあります。

攻撃者にユーザー加工前の XML への書き込みができる場合、XML 文書およびメッセージのセマンティクスが改変される場合があります。最も害のない場合でも、攻撃者はネスト化されたエンティティ参照を挿入し、XML パーサーに大量の CPU リソースを消費させ続けることができます。より悪質な XML External Entity Injection の場合、攻撃者は、ローカルの File System リソースの内容を開示したり内部ネットワーク リソースの存在を明らかにしたりする XML 要素を追加できる可能性があります。

例 1: XXE 攻撃に対して脆弱なコードの例を次に示します。


func parseXML(xml: String) {
parser = NSXMLParser(data: rawXml.dataUsingEncoding(NSUTF8StringEncoding)!)
parser.delegate = self
parser.shouldResolveExternalEntities = true
parser.parse()
}


XML が以下のようになっている rawXml コンテンツを攻撃者が制御できる場合を考えてみましょう。


<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>


XML がサーバーによって評価される場合、<foo> 要素には boot.ini ファイルの内容が含まれます。
References
[1] XML External Entity (XXE) Processing OWASP
[2] Testing for XML Injection OWASP
[3] XML External Entities The Web Application Security Consortium
desc.structural.swift.xml_external_entity_injection
Abstract
XML 文書に未検証のデータを書き込むことによって、攻撃者に XML の構造およびコンテンツの改竄を許す可能性があります。
Explanation
次の場合に XML Injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。

2. このデータは、XML 文書に書き込まれます。

アプリケーションは、通常、XML を使用してデータを保存したりメッセージを送信したりします。XML がデータの保存に使用される場合、XML 文書はデータベースのように扱われ、重要な情報が含まれる場合があります。XML メッセージは、Web サービスでも頻繁に使用されており、重要な情報を送信するときにも使用される場合があります。XML メッセージは、認証情報を送信するときに使用されることさえあります。

攻撃者が XML に書き込みが可能な場合、XML 文書およびメッセージのセマンティクスが改変される場合があります。攻撃者は余分なタグを挿入して、XML パーサーで例外を発生させることもできます。悪質な場合、攻撃者は認証情報を変更する XML 要素を追加したり、XML を使用する e コマース データベースで価格を改変する可能性があります。また、XML Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1:

以下の XML の shoes を攻撃者が制御できる場合を考えてみましょう。

<order>
<price>100.00</price>
<item>shoes</item>
</order>


ここで、この XML がバックエンドの Web サービスリクエストに追加され、一足の靴が注文されるとします。攻撃者がリクエストを変更して、shoesshoes</item><price>1.00</price><item>shoes に置き換えるとします。新しい XML は以下のようになります。

<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>


SAX パーサーを使用すると、2 番目の <price> の値により最初の <price> タグの値が上書きされます。これにより、攻撃者は $100 の靴を $1 で購入できます。
desc.dataflow.dotnet.xml_injection
Abstract
この特定のメソッドは、未検証の XML 入力を書き込みます。このコールにより、攻撃者は任意の要素や属性を XML 文書に挿入する可能性があります。
Explanation
次の場合に XML Injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。


2. このデータは、XML 文書に書き込まれます。

アプリケーションは、通常、XML を使用してデータを保存したりメッセージを送信したりします。XML がデータの保存に使用される場合、XML 文書はデータベースのように扱われ、重要な情報が含まれる場合があります。XML メッセージは、Web サービスでも頻繁に使用されており、重要な情報を送信するときにも使用される場合があります。XML メッセージは、認証情報を送信するときに使用されることさえあります。

攻撃者が XML に書き込みが可能な場合、XML 文書およびメッセージのセマンティクスが改変される場合があります。攻撃者は余分なタグを挿入して、XML パーサーで例外を発生させることもできます。悪質な場合、攻撃者は認証情報を変更する XML 要素を追加したり、XML を使用する e コマース データベースで価格を改変する可能性があります。また、XML Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1:

以下の XML の shoes を攻撃者が制御できる場合を考えてみましょう。

<order>
<price>100.00</price>
<item>shoes</item>
</order>


ここで、この XML がバックエンドの Web サービスリクエストに追加され、一足の靴が注文されるとします。攻撃者がリクエストを変更して、shoesshoes</item><price>1.00</price><item>shoes に置き換えるとします。新しい XML は以下のようになります。

<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>


SAX パーサーを使用すると、2 番目の <price> の値により最初の <price> タグの値が上書きされます。これにより、攻撃者は $100 の靴を $1 で購入できます。
desc.dataflow.cpp.xml_injection
Abstract
XML 文書に未検証のデータを書き込むことによって、攻撃者に XML の構造およびコンテンツの改竄を許す可能性があります。
Explanation
次の場合に XML Injection が発生します。

1.信頼できないソースからデータがプログラムに入力された場合。

2.このデータは、XML 文書に書き込まれます。

アプリケーションは、通常、XML を使用してデータを保存したりメッセージを送信したりします。XML がデータの保存に使用される場合、XML 文書はデータベースのように扱われ、重要な情報が含まれる場合があります。XML メッセージは、Web サービスでも頻繁に使用されており、重要な情報を送信するときにも使用される場合があります。XML メッセージは、認証情報を送信するときに使用されることさえあります。

攻撃者が XML に書き込みが可能な場合、XML 文書およびメッセージのセマンティクスが改変される場合があります。攻撃者は余分なタグを挿入して、XML パーサーで例外を発生させることもできます。悪質な場合、攻撃者は認証情報を変更する XML 要素を追加したり、XML を使用する e コマース データベースで価格を改変する可能性があります。また、XML Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1:

以下の XML の shoes を攻撃者が制御できる場合を考えてみましょう。

<order>
<price>100.00</price>
<item>shoes</item>
</order>


ここで、この XML がバックエンドの Web サービス リクエストに追加され、一足の靴が注文されるとします。攻撃者がリクエストを変更して、shoesshoes</item><price>1.00</price><item>shoes に置き換えるとします。新しい XML は以下のようになります。

<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>


SAX パーサーを使用すると、2 番目の <price> の値により最初の <price> タグの値が上書きされます。これにより、攻撃者は $100 の靴を $1 で購入できます。
desc.dataflow.golang.xml_injection
Abstract
XML 文書に未検証のデータを書き込むことによって、攻撃者に XML の構造およびコンテンツの改竄を許す可能性があります。
Explanation
次の場合に XML Injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。

2. このデータは、XML 文書に書き込まれます。

アプリケーションは、通常、XML を使用してデータを保存したりメッセージを送信したりします。XML がデータの保存に使用される場合、XML 文書はデータベースのように扱われ、重要な情報が含まれる場合があります。XML メッセージは、Web サービスでも頻繁に使用されており、重要な情報を送信するときにも使用される場合があります。XML メッセージは、認証情報を送信するときに使用されることさえあります。

攻撃者が XML に書き込みが可能な場合、XML 文書およびメッセージのセマンティクスが改変される場合があります。攻撃者は余分なタグを挿入して、XML パーサーで例外を発生させることもできます。悪質な場合、攻撃者は認証情報を変更する XML 要素を追加したり、XML を使用する e コマース データベースで価格を改変する可能性があります。また、XML Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1:

以下の XML の shoes を攻撃者が制御できる場合を考えてみましょう。

<order>
<price>100.00</price>
<item>shoes</item>
</order>


ここで、この XML がバックエンドの Web サービスリクエストに追加され、一足の靴が注文されるとします。攻撃者がリクエストを変更して、shoesshoes</item><price>1.00</price><item>shoes に置き換えるとします。新しい XML は以下のようになります。

<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>


SAX パーサーを使用すると、2 番目の <price> の値により最初の <price> タグの値が上書きされます。これにより、攻撃者は $100 の靴を $1 で購入できます。
References
[1] IDS16-J. Prevent XML Injection CERT
[2] INJECT-3: XML and HTML generation requires care Oracle
desc.dataflow.java.xml_injection
Abstract
XML 文書に未検証のデータを書き込むことによって、攻撃者に XML の構造およびコンテンツの改竄を許す可能性があります。
Explanation
次の場合に XML Injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。


2. このデータは、XML 文書に書き込まれます。

アプリケーションは、通常、XML を使用してデータを保存したりメッセージを送信したりします。XML がデータの保存に使用される場合、XML 文書はデータベースのように扱われ、重要な情報が含まれる場合があります。XML メッセージは、Web サービスでも頻繁に使用されており、重要な情報を送信するときにも使用される場合があります。XML メッセージは、認証情報を送信するときに使用されることさえあります。

攻撃者が XML に書き込みが可能な場合、XML 文書およびメッセージのセマンティクスが改変される場合があります。攻撃者は余分なタグを挿入して、XML パーサーで例外を発生させることもできます。悪質な場合、攻撃者は認証情報を変更する XML 要素を追加したり、XML を使用する e コマース データベースで価格を改変する可能性があります。また、XML Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1:

以下の XML の shoes を攻撃者が制御できる場合を考えてみましょう。

<order>
<price>100.00</price>
<item>shoes</item>
</order>


ここで、この XML がバックエンドの Web サービスリクエストに追加され、一足の靴が注文されるとします。攻撃者がリクエストを変更して、shoesshoes</item><price>1.00</price><item>shoes に置き換えるとします。新しい XML は以下のようになります。

<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>


これにより、攻撃者は $100 の靴を $1 で購入できてしまうことがあります。
desc.dataflow.javascript.xml_injection
Abstract
この特定のメソッドは、未検証の XML 入力を書き込みます。このコールにより、攻撃者は任意の要素や属性を XML 文書に挿入する可能性があります。
Explanation
次の場合に XML Injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。


2. このデータは、XML 文書に書き込まれます。

アプリケーションは、通常、XML を使用してデータを保存したりメッセージを送信したりします。XML がデータの保存に使用される場合、XML 文書はデータベースのように扱われ、重要な情報が含まれる場合があります。XML メッセージは、Web サービスでも頻繁に使用されており、重要な情報を送信するときにも使用される場合があります。XML メッセージは、認証情報を送信するときに使用されることさえあります。

攻撃者が XML に書き込みが可能な場合、XML 文書およびメッセージのセマンティクスが改変される場合があります。攻撃者は余分なタグを挿入して、XML パーサーで例外を発生させることもできます。悪質な場合、攻撃者は認証情報を変更する XML 要素を追加したり、XML を使用する e コマース データベースで価格を改変する可能性があります。また、XML Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1:

以下の XML の shoes を攻撃者が制御できる場合を考えてみましょう。

<order>
<price>100.00</price>
<item>shoes</item>
</order>


ここで、この XML がバックエンドの Web サービスリクエストに追加され、一足の靴が注文されるとします。攻撃者がリクエストを変更して、shoesshoes</item><price>1.00</price><item>shoes に置き換えるとします。新しい XML は以下のようになります。

<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>


SAX パーサーを使用すると、2 番目の <price> の値により最初の <price> タグの値が上書きされます。これにより、攻撃者は $100 の靴を $1 で購入できます。
desc.dataflow.objc.xml_injection
Abstract
XML 文書に未検証のデータを書き込むことによって、攻撃者に XML の構造およびコンテンツの改竄を許す可能性があります。
Explanation
次の場合に XML Injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。

2. このデータは、XML 文書に書き込まれます。

アプリケーションは、通常、XML を使用してデータを保存したりメッセージを送信したりします。XML がデータの保存に使用される場合、XML 文書はデータベースのように扱われ、重要な情報が含まれる場合があります。XML メッセージは、Web サービスでも頻繁に使用されており、重要な情報を送信するときにも使用される場合があります。XML メッセージは、認証情報を送信するときに使用されることさえあります。

攻撃者が XML に書き込みが可能な場合、XML 文書およびメッセージのセマンティクスが改変される場合があります。攻撃者は余分なタグを挿入して、XML パーサーで例外を発生させることもできます。悪質な場合、攻撃者は認証情報を変更する XML 要素を追加したり、XML を使用する e コマース データベースで価格を改変する可能性があります。また、XML Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1:

以下の XML の shoes を攻撃者が制御できる場合を考えてみましょう。

<order>
<price>100.00</price>
<item>shoes</item>
</order>


ここで、この XML がバックエンドの Web サービスリクエストに追加され、一足の靴が注文されるとします。攻撃者がリクエストを変更して、shoesshoes</item><price>1.00</price><item>shoes に置き換えるとします。新しい XML は以下のようになります。

<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>


XML パーサーを使用すると、2 番目の <price> の値により最初の <price> タグの値が上書きされます。これにより、攻撃者は $100 の靴を $1 で購入できます。


XML External Entity (XXE) Injection と呼ばれる、この攻撃のより深刻な状態が、攻撃者が解析される XML 文書のフロントまたはすべてを制御する際に発生します。

例 2: XXE 攻撃に対して脆弱なコードの例を次に示します。

攻撃者は以下のコードへの XML 入力を制御できるものと仮定します。


...
<?php
$goodXML = $_GET["key"];
$doc = simplexml_load_string($goodXml);
echo $doc->testing;
?>
...


ここで、攻撃者からExample 2 のコードに以下の XML が渡されると仮定してください。



<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>



この XML を処理するとき、<foo> 要素のコンテンツにはシステムの boot.ini ファイルのコンテンツが埋め込まれます。攻撃者は、データを盗み出したり、ネットワーク リソースの存在に関する情報を取得するために、クライアントに返される XML 要素を利用することができます。
desc.dataflow.php.xml_injection
Abstract
XML 文書に未検証のデータを書き込むことによって、攻撃者に XML の構造およびコンテンツの改竄を許す可能性があります。
Explanation
次の場合に XML Injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。

2. このデータは、XML 文書に書き込まれます。

アプリケーションは、通常、XML を使用してデータを保存したりメッセージを送信したりします。XML がデータの保存に使用される場合、XML 文書はデータベースのように扱われ、重要な情報が含まれる場合があります。XML メッセージは、Web サービスでも頻繁に使用されており、重要な情報を送信するときにも使用される場合があります。XML メッセージは、認証情報を送信するときに使用されることさえあります。

攻撃者が XML に書き込みが可能な場合、XML 文書およびメッセージのセマンティクスが改変される場合があります。攻撃者は余分なタグを挿入して、XML パーサーで例外を発生させることもできます。悪質な場合、攻撃者は認証情報を変更する XML 要素を追加したり、XML を使用する e コマース データベースで価格を改変する可能性があります。また、XML Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1:

以下の XML の shoes を攻撃者が制御できる場合を考えてみましょう。

<order>
<price>100.00</price>
<item>shoes</item>
</order>


ここで、この XML がバックエンドの Web サービスリクエストに追加され、一足の靴が注文されるとします。攻撃者がリクエストを変更して、shoesshoes</item><price>1.00</price><item>shoes に置き換えるとします。新しい XML は以下のようになります。

<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>


SAX パーサーを使用すると、2 番目の <price> の値により最初の <price> タグの値が上書きされます。これにより、攻撃者は $100 の靴を $1 で購入できます。
desc.dataflow.python.xml_injection
Abstract
XML 文書に未検証のデータを書き込むと、攻撃者に XML の構造やコンテンツの改竄を許可してしまいます。未検証の XML をパースすると、サービス妨害、機密情報の漏えい、さらにはリモートでのコードの実行を招くことがあります。
Explanation
次の場合に XML Injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。

2.このデータは、XML 文書に書き込まれるか、XML としてパースされます。

アプリケーションは、通常、XML を使用してデータを保存したりメッセージを送信したりします。XML がデータの保存に使用される場合、XML 文書はデータベースのように扱われ、重要な情報が含まれる場合があります。XML メッセージは、Web サービスでも頻繁に使用されており、重要な情報を送信するときにも使用される場合があります。XML メッセージは、認証情報を送信するときに使用されることさえあります。

攻撃者が XML に書き込みが可能な場合、XML 文書およびメッセージのセマンティクスが改変される場合があります。攻撃者は余分なタグを挿入して、XML パーサーで例外を発生させることもできます。悪質な場合、攻撃者は認証情報を変更する XML 要素を追加したり、XML を使用する e コマース データベースで価格を改変する可能性があります。また、XML Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1:

以下の XML の shoes を攻撃者が制御できる場合を考えてみましょう。

<order>
<price>100.00</price>
<item>shoes</item>
</order>


ここで、この XML がバックエンドの Web サービスリクエストに追加され、一足の靴が注文されるとします。攻撃者がリクエストを変更して、shoesshoes</item><price>1.00</price><item>shoes に置き換えるとします。新しい XML は以下のようになります。

<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>


SAX パーサーを使用すると、2 番目の <price> の値により最初の <price> タグの値が上書きされます。これにより、攻撃者は $100 の靴を $1 で購入できます。
References
[1] Introduction to Software Security: XML Injection Atacks University of Wisconsin-Madison
[2] Exploitation: XML External Entity (XXE) Injection Depth Security
desc.dataflow.ruby.xml_injection
Abstract
XML 文書に未検証のデータを書き込むと、攻撃者に XML の構造やコンテンツの改竄を許可してしまいます。未検証の XML をパースすると、サービス妨害、機密情報の漏えい、さらにはリモートでのコードの実行を招くことがあります。
Explanation
次の場合に XML Injection が発生します。

1.信頼できないソースからデータがプログラムに入り込んだ場合。

2.このデータは、XML 文書に書き込まれるか、XML としてパースされます。

アプリケーションは、通常、XML を使用してデータを保存したりメッセージを送信したりします。XML がデータの保存に使用される場合、XML 文書はデータベースのように扱われ、重要な情報が含まれる場合があります。XML メッセージは、Web サービスでも頻繁に使用されており、重要な情報を送信するときにも使用される場合があります。XML メッセージは、認証情報を送信するときに使用されることさえあります。

攻撃者が XML に書き込みが可能な場合、XML 文書およびメッセージのセマンティクスが改変される場合があります。攻撃者は余分なタグを挿入して、XML パーサーで例外を発生させることもできます。悪質な場合、攻撃者は認証情報を変更する XML 要素を追加したり、XML を使用する e コマース データベースで価格を改変する可能性があります。また、XML Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1:

以下の XML の shoes を攻撃者が制御できる場合を考えてみましょう。

<order>
<price>100.00</price>
<item>shoes</item>
</order>


ここで、この XML がバックエンドの Web サービスリクエストに追加され、一足の靴が注文されるとします。攻撃者がリクエストを変更して、shoesshoes</item><price>1.00</price><item>shoes に置き換えるとします。新しい XML は以下のようになります。

<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>


SAX パーサーを使用すると、2 番目の <price> の値により最初の <price> タグの値が上書きされます。これにより、攻撃者は $100 の靴を $1 で購入できます。
References
[1] IDS16-J. Prevent XML Injection CERT
[2] INJECT-3: XML and HTML generation requires care Oracle
desc.dataflow.scala.xml_injection
Abstract
この特定のメソッドは、未検証の XML 入力を書き込みます。このコールにより、攻撃者は任意の要素や属性を XML 文書に挿入する可能性があります。
Explanation
次の場合に XML Injection が発生します。

1. 信頼できないソースからデータがプログラムに入り込んだ場合。


2. このデータは、XML 文書に書き込まれます。

アプリケーションは、通常、XML を使用してデータを保存したりメッセージを送信したりします。XML がデータの保存に使用される場合、XML 文書はデータベースのように扱われ、重要な情報が含まれる場合があります。XML メッセージは、Web サービスでも頻繁に使用されており、重要な情報を送信するときにも使用される場合があります。XML メッセージは、認証情報を送信するときに使用されることさえあります。

攻撃者が XML に書き込みが可能な場合、XML 文書およびメッセージのセマンティクスが改変される場合があります。攻撃者は余分なタグを挿入して、XML パーサーで例外を発生させることもできます。悪質な場合、攻撃者は認証情報を変更する XML 要素を追加したり、XML を使用する e コマース データベースで価格を改変する可能性があります。また、XML Injection により、Cross-Site Scripting や Dynamic Code Evaluation が引き起こされる場合もあります。

例 1:

以下の XML の shoes を攻撃者が制御できる場合を考えてみましょう。

<order>
<price>100.00</price>
<item>shoes</item>
</order>


ここで、この XML がバックエンドの Web サービスリクエストに追加され、一足の靴が注文されるとします。攻撃者がリクエストを変更して、shoesshoes</item><price>1.00</price><item>shoes に置き換えるとします。新しい XML は以下のようになります。

<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>


SAX パーサーを使用すると、2 番目の <price> の値により最初の <price> タグの値が上書きされます。これにより、攻撃者は $100 の靴を $1 で購入できます。
desc.dataflow.swift.xml_injection