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을 갖지 못합니다.

액세스 제어 문제를 해결하는 한 가지 방법은 Worker 개체가 액세스 제어 검사 수행을 담당하게 만드는 것입니다. 리팩터링된 코드의 예제는 다음과 같습니다.


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
공격자는 응용 프로그램이 호출할 메서드나 인스턴스화할 클래스를 결정하는 데 사용하는 값을 제공할 수 있는 경우 응용 프로그램을 통과하는 예상치 못한 제어 흐름 경로를 생성할 수 있습니다. 그러면 인증 또는 액세스 제어 검사를 우회할 수도 있고, 응용 프로그램의 예상치 못한 동작을 야기할 수도 있습니다.
예제: 다음 작업 메서드는 외부 웹 서비스에 대한 비동기 요청을 시작하고 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을 갖지 못합니다.

액세스 제어 문제를 해결하는 한 가지 방법은 Worker 개체가 액세스 제어 검사 수행을 담당하게 만드는 것입니다. 리팩터링된 코드의 예제는 다음과 같습니다.


...
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를 사용하는 공통된 이유는 자신만의 명령 디스패처를 구현하기 위해서입니다. 다음 예제는 리플렉션을 사용하여 CGI 요청에서 읽은 값으로 식별하는 Java 메서드를 실행하는 JNI 명령 디스패처를 보여 줍니다. 이 구현으로 공격자는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 검사를 무시하거나 응용 프로그램이 오작동을 일으키도록 합니다. 임의의 메서드나 생성자에게 전달되는 인수를 제어하는 기능도 교활한 공격자에게 공격을 성공시키는 데 필요한 유리한 조건을 제공할 수 있습니다.

이런 상황은 공격자가 응용 프로그램의 classpath에 있는 위치에 파일을 업로드하거나 응용 프로그램의 classpath에 새 항목을 추가하게 되면 최악의 시나리오가 됩니다. 어느 쪽이든 공격자는 리플렉션을 사용하여 응용 프로그램에 새로운 악의적인 동작을 주입할 수 있습니다.
예제: 프로그래머가 리플렉션 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을 갖지 못합니다.

액세스 제어 문제를 해결하는 한 가지 방법은 Worker 개체가 액세스 제어 검사 수행을 담당하게 만드는 것입니다. 리팩터링된 코드의 예제는 다음과 같습니다.


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 인터페이스를 구현하지 않는 경우 ClassCastExceptionao에 할당되기 전에 발생하지만 생성자가 공격자에게 유리한 작업을 수행하는 경우 이미 피해를 입은 것입니다. 이 시나리오는 간단한 응용 프로그램에서는 비교적 피해 정도가 약하지만 아주 복잡한 큰 응용 프로그램에서는 공격자가 얼마든지 생성자를 찾아 공격 도구로 이용할 수 있습니다.

즉각적인 호출자의 클래스 로더 검사 사용 작업을 수행하는 특정 Java API가 리플렉션 호출로 인해 반환된 신뢰할 수 없는 개체에서 호출되는 경우 접근 검사가 코드 실행 체인을 더욱 손상시킬수도 있습니다. 이러한 Java API는 실행 체인의 모든 호출자가 필요한 보안 권한을 갖도록 보장하는 SecurityManager 검사를 무시합니다. 리플렉션에 의해 반환된 신뢰할 수 없는 개체에서 API가 호출되지 않도록 주의해야 합니다. 이러한 API는 보안 접근 검사를 무시하고 시스템이 원격 공격에 취약해지도록 할 수 있기 때문입니다. 이러한 Java API에 대한 자세한 내용은 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를 사용하는 일반적인 이유는 자신만의 명령 디스패처를 구현하기 위해서입니다. 다음 예제는 리플렉션을 사용하여 사용자 지정 URL 스키마 요청에서 읽은 값으로 식별하는 임의의 메서드를 실행하는 Objective-C 명령 디스패처를 보여 줍니다. 이 구현으로 공격자는 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 검사를 무시하거나 응용 프로그램이 오작동을 일으키도록 합니다. 임의의 메서드나 생성자에게 전달되는 인수를 제어하는 기능도 교활한 공격자에게 공격을 성공시키는 데 필요한 유리한 조건을 제공할 수 있습니다.

이런 상황은 공격자가 응용 프로그램의 classpath에 있는 위치에 파일을 업로드하거나 응용 프로그램의 classpath에 새 항목을 추가하게 되면 최악의 시나리오가 됩니다. 어느 쪽이든 공격자는 리플렉션을 사용하여 응용 프로그램에 새로운 악의적인 동작을 주입할 수 있습니다.
예제: 프로그래머가 리플렉션 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을 갖지 못합니다.

액세스 제어 문제를 해결하는 한 가지 방법은 Worker 개체가 액세스 제어 검사 수행을 담당하게 만드는 것입니다. 리팩터링된 코드의 예제는 다음과 같습니다.


$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 인터페이스를 구현하지 않는 경우 ClassCastException$ao에 할당되기 전에 발생하지만 생성자가 공격자에게 유리한 작업을 수행하는 경우 이미 피해를 입은 것입니다. 이 시나리오는 간단한 응용 프로그램에서는 비교적 피해 정도가 약하지만 아주 복잡한 큰 응용 프로그램에서는 공격자가 얼마든지 생성자를 찾아 공격 도구로 이용할 수 있습니다.
desc.dataflow.php.unsafe_reflection
Abstract
공격자가 응용 프로그램을 통해 예기치 못한 제어 흐름 경로를 만들어 보안 검사를 무시할 수 있습니다.
Explanation
공격자가 응용 프로그램이 인스턴스화할 클래스 또는 호출할 메서드를 결정하는 데 사용할 값을 제공하게 되면 응용 프로그램을 통해 응용 프로그램 개발자가 의도하지 않은 제어 흐름 경로를 만들 가능성이 있습니다. 이 공격은 공격자가 authentication 또는 access control 검사를 무시하거나 응용 프로그램이 오작동을 일으키도록 합니다. 임의의 메서드나 생성자에게 전달되는 인수를 제어하는 기능도 교활한 공격자에게 공격을 성공시키는 데 필요한 유리한 조건을 제공할 수 있습니다.

이런 상황은 공격자가 응용 프로그램의 classpath에 있는 위치에 파일을 업로드하거나 응용 프로그램의 classpath에 새 항목을 추가하게 되면 최악의 시나리오가 됩니다. 어느 쪽이든 공격자는 리플렉션을 사용하여 응용 프로그램에 새로운 악의적인 동작을 주입할 수 있습니다.
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()의 오버라이드를 통해 이를 호출하는 것입니다. 이를 감사 및 추적하고 access control 코드를 여기에 사용하는 방법은 매우 까다롭고 어떤 다른 라이브러리 코드가 로드되는지에 따라 달라진다는 점을 고려하면 이 방식은 올바르게 수행하기가 거의 불가능할 수 있습니다.
desc.dataflow.ruby.unsafe_reflection
Abstract
공격자가 응용 프로그램을 통해 예기치 못한 제어 흐름 경로를 만들어 보안 검사를 무시할 수 있습니다.
Explanation
공격자가 응용 프로그램이 인스턴스화할 클래스 또는 호출할 메서드를 결정하는 데 사용할 값을 제공하게 되면 응용 프로그램을 통해 응용 프로그램 개발자가 의도하지 않은 제어 흐름 경로를 만들 가능성이 있습니다. 이 공격은 공격자가 authentication 또는 access control 검사를 무시하거나 응용 프로그램이 오작동을 일으키도록 합니다. 임의의 메서드나 생성자에게 전달되는 인수를 제어하는 기능도 교활한 공격자에게 공격을 성공시키는 데 필요한 유리한 조건을 제공할 수 있습니다.

이런 상황은 공격자가 응용 프로그램의 classpath에 있는 위치에 파일을 업로드하거나 응용 프로그램의 classpath에 새 항목을 추가하게 되면 최악의 시나리오가 됩니다. 어느 쪽이든 공격자는 리플렉션을 사용하여 응용 프로그램에 새로운 악의적인 동작을 주입할 수 있습니다.
예제: 프로그래머가 리플렉션 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을 갖지 못합니다.

액세스 제어 문제를 해결하는 한 가지 방법은 Worker 개체가 액세스 제어 검사 수행을 담당하게 만드는 것입니다. 리팩터링된 코드의 예제는 다음과 같습니다.


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 인터페이스를 구현하지 않는 경우 ClassCastExceptionao에 할당되기 전에 발생하지만 생성자가 공격자에게 유리한 작업을 수행하는 경우 이미 피해를 입은 것입니다. 이 시나리오는 간단한 응용 프로그램에서는 비교적 피해 정도가 약하지만 아주 복잡한 큰 응용 프로그램에서는 공격자가 얼마든지 생성자를 찾아 공격 도구로 이용할 수 있습니다.

즉각적인 호출자의 클래스 로더 검사 사용 작업을 수행하는 특정 Java API가 리플렉션 호출로 인해 반환된 신뢰할 수 없는 개체에서 호출되는 경우 접근 검사가 코드 실행 체인을 더욱 손상시킬 수도 있습니다. 이러한 Java API는 실행 체인의 모든 호출자가 필요한 보안 권한을 갖도록 보장하는 SecurityManager 검사를 무시합니다. 리플렉션에 의해 반환된 신뢰할 수 없는 개체에서 API가 호출되지 않도록 주의해야 합니다. 이러한 API는 보안 접근 검사를 무시하고 시스템이 원격 공격에 취약해지도록 할 수 있기 때문입니다. 이러한 Java API에 대한 자세한 내용은 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를 사용하는 일반적인 이유는 자신만의 명령 디스패처를 구현하기 위해서입니다. 다음 예제는 리플렉션을 사용하여 사용자 지정 URL 스키마 요청에서 읽은 값으로 식별하는 임의의 메서드를 실행하는 Swift 명령 디스패처를 보여 줍니다. 이 구현으로 공격자는 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 검사를 무시하거나 응용 프로그램이 오작동을 일으키도록 합니다. 임의의 메서드나 생성자에게 전달되는 인수를 제어하는 기능도 교활한 공격자에게 공격을 성공시키는 데 필요한 유리한 조건을 제공할 수 있습니다.

예제: 프로그래머가 CallByName을 사용하는 공통된 이유는 자신만의 명령 디스패처를 구현하기 위해서입니다. 다음 예제는 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을 갖지 못합니다.

액세스 제어 문제를 해결하는 한 가지 방법은 Worker 개체가 액세스 제어 검사 수행을 담당하게 만드는 것입니다. 리팩터링된 코드의 예제는 다음과 같습니다.


...
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 외부 엔터티 공격에 노출될 수 있습니다
Explanation
XML 외부 엔터티 공격에서는 XML 기능을 활용하여 처리 시점에 동적으로 문서를 구성합니다. XML 엔터티를 사용하면 지정된 리소스에서 동적으로 데이터를 포함할 수 있습니다. 외부 엔터티를 사용하면 XML 문서에 외부 URI의 데이터를 포함할 수 있습니다. 다른 방식으로 처리하도록 구성하지 않는 한 외부 엔터티는 XML 파서가 URI로 지정된 리소스(예: 로컬 컴퓨터 또는 원격 시스템의 파일)에 접근하게 만듭니다. 이 동작으로 인해 응용 프로그램이 XML 외부 엔터티(XXE) 공격에 노출되고, 이를 통해 로컬 시스템에서 denial of service를 발생시키고, 로컬 컴퓨터의 파일에 무단으로 접근, 원격 컴퓨터를 스캔하고, 원격 시스템에서 denial of service를 발생시킬 수 있습니다.

다음 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
XXE(XML 외부 엔터티) 삽입은 다음과 같은 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

2. 데이터는 XML 문서 내 DTD(Document Type Definition)의 <ENTITY> 요소에 작성됩니다.

일반적으로 응용 프로그램은 XML을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터를 저장하는 데 사용할 경우, XML 문서는 주로 데이터베이스와 같이 다뤄지며 민감한 정보를 포함할 수 있습니다. XML 메시지는 주로 웹 서비스에서 사용하며 민감한 정보를 전송하는 데에도 사용할 수 있습니다. XML 메시지는 인증 자격 증명을 전송하는 데 사용할 수도 있습니다.

공격자가 원시 XML을 작성할 수 있는 경우, XML 문서 및 메시지의 의미를 변경할 수 있습니다. 대부분의 경우 공격자는 중첩된 엔터티 참조를 삽입하고 XML 파서가 점점 더 많은 CPU 리소스를 소모하도록 할 수 있습니다. 더 악의적인 XML 외부 엔터티 injection의 경우 공격자가 로컬 파일 시스템 리소스의 내용을 노출하거나 내부 네트워크 리소스의 존재를 알리는 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 외부 엔터티 공격에 노출될 수 있습니다
Explanation
XML 외부 엔터티 공격에서는 XML 기능을 활용하여 처리 시점에 동적으로 문서를 구성합니다. XML 엔터티를 사용하면 지정된 리소스에서 동적으로 데이터를 포함시킬 수 있습니다. 외부 엔터티를 사용하면 XML 문서에 외부 URI의 데이터를 포함할 수 있습니다. 다른 방식으로 처리하도록 구성하지 않은 경우 외부 엔터티는 XML 파서가 URI로 지정된 리소스(예: 로컬 컴퓨터 또는 원격 시스템의 파일)를 접근하게 만듭니다. 이 동작으로 인해 응용 프로그램이 XML 외부 엔터티(XXE) 공격에 노출되고, 이를 통해 로컬 시스템에서 denial of service를 발생시키고, 로컬 컴퓨터의 파일에 무단으로 접근하고, 원격 컴퓨터를 스캔하고, 원격 시스템에서 denial of service를 발생시킬 수 있습니다.

다음 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
XXE(XML 외부 엔터티) 삽입은 다음과 같은 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

2. 데이터는 XML 문서에서 DTD(Document Type Definition)의 <ENTITY> 요소에 작성됩니다.

일반적으로 응용 프로그램은 XML을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터를 저장하는 데 사용할 경우, XML 문서는 주로 데이터베이스와 같이 다뤄지며 민감한 정보를 포함할 수 있습니다. XML 메시지는 주로 웹 서비스에서 사용하며 민감한 정보를 전송하는 데에도 사용할 수 있습니다. XML 메시지는 인증 자격 증명을 전송하는 데 사용할 수도 있습니다.

공격자가 원시 XML을 작성할 수 있는 경우, XML 문서 및 메시지의 의미를 변경할 수 있습니다. 대부분의 경우 공격자는 중첩된 엔터티 참조를 삽입하고 XML 파서가 점점 더 많은 CPU 리소스를 소모하도록 할 수 있습니다. 더 악의적인 XML 외부 엔터티 injection의 경우 공격자가 로컬 파일 시스템 리소스의 내용을 노출하거나 내부 네트워크 리소스의 존재를 알리는 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(DoS)를 일으킬 수 있습니다.
Explanation
XXE(XML 외부 엔터티) 삽입은 다음과 같은 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

2. XML 문서에 데이터가 작성됩니다.

일반적으로 응용 프로그램은 XML을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터를 저장하는 데 사용할 경우, XML 문서는 주로 데이터베이스와 같이 다뤄지며 민감한 정보를 포함할 수 있습니다. XML 메시지는 주로 웹 서비스에서 사용하며 민감한 정보를 전송하는 데에도 사용할 수 있습니다. XML 메시지는 인증 자격 증명을 전송하는 데 사용할 수도 있습니다.

공격자가 원시 XML을 작성할 수 있는 경우, XML 문서 및 메시지의 의미를 변경할 수 있습니다. 대부분의 양호한 경우 공격자는 중첩된 엔터티 참조를 삽입하고 XML 파서가 점점 더 많은 CPU 리소스를 소모하도록 할 수 있습니다. 더 악의적인 XML 외부 엔터티 injection의 경우 공격자가 로컬 파일 시스템 리소스의 내용을 노출하거나 내부 네트워크 리소스의 존재를 알리거나 백엔드 콘텐트 자체를 노출하는 XML 요소를 추가할 수 있습니다.

예제 1:다음은 XXE 공격에 취약한 일부 코드입니다.

공격자는 다음과 같은 코드에 대한 입력 XML을 제어할 수 있다고 가정합니다.


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


이제 다음 XML이 공격자에 의해 Example 2의 코드에 전달된다고 가정해 봅니다.



<?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 외부 엔터티 공격에 노출될 수 있습니다.
Explanation
XML 외부 엔터티 공격에서는 XML 기능을 활용하여 런타임 시 동적으로 문서를 작성합니다. XML 엔터티를 사용하면 지정된 리소스에서 동적으로 데이터를 포함시킬 수 있습니다. 외부 엔터티를 사용하면 XML 문서에 외부 URI의 데이터를 포함할 수 있습니다. 다른 방식으로 처리하도록 구성하지 않은 경우 외부 엔터티는 XML 파서가 URI로 지정된 리소스(예: 로컬 컴퓨터 또는 원격 시스템의 파일)를 접근하게 만듭니다. 이 동작으로 인해 응용 프로그램이 XXE(XML 외부 엔터티) 공격에 노출되고, 공격자는 이를 사용하여 로컬 시스템에서 Denial of Service를 발생시키고, 로컬 컴퓨터의 파일에 무단으로 접근, 원격 컴퓨터를 스캔하고, 원격 시스템에서 Denial of Service를 발생시킬 수 있습니다.


예제 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 외부 엔터티 공격에 노출될 수 있습니다
Explanation
XML 외부 엔터티 공격에서는 XML 기능을 활용하여 처리 시점에 동적으로 문서를 구성합니다. XML 엔터티를 사용하면 지정된 리소스에서 동적으로 데이터를 포함시킬 수 있습니다. 외부 엔터티를 사용하면 XML 문서에 외부 URI의 데이터를 포함할 수 있습니다. 다른 방식으로 처리하도록 구성하지 않은 경우 외부 엔터티는 XML 파서가 URI로 지정된 리소스(예: 로컬 컴퓨터 또는 원격 시스템의 파일)를 접근하게 만듭니다. 이 동작으로 인해 응용 프로그램이 XML 외부 엔터티(XXE) 공격에 노출되고, 이를 통해 로컬 시스템에서 denial of service를 발생시키고, 로컬 컴퓨터의 파일에 무단으로 접근하고, 원격 컴퓨터를 스캔하고, 원격 시스템에서 denial of service를 발생시킬 수 있습니다.

다음 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: 다음 코드는 HTTP 요청의 신뢰할 수 없는 입력을 처리하기 위해 안전하지 않은 XML 파서를 사용합니다.


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
XXE(XML 외부 엔터티) 삽입은 다음과 같은 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

2. 데이터는 XML 문서 내 DTD(Document Type Definition)의 <ENTITY> 요소에 작성됩니다.

일반적으로 응용 프로그램은 XML을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터를 저장하는 데 사용할 경우, XML 문서는 주로 데이터베이스와 같이 다뤄지며 민감한 정보를 포함할 수 있습니다. XML 메시지는 주로 웹 서비스에서 사용하며 민감한 정보를 전송하는 데에도 사용할 수 있습니다. XML 메시지는 인증 자격 증명을 전송하는 데 사용할 수도 있습니다.

공격자가 원시 XML을 작성할 수 있는 경우, XML 문서 및 메시지의 의미를 변경할 수 있습니다. 대부분의 경우 공격자는 중첩된 엔터티 참조를 삽입하고 XML 파서가 점점 더 많은 CPU 리소스를 소모하도록 할 수 있습니다. 더 악의적인 XML 외부 엔터티 injection의 경우 공격자가 로컬 파일 시스템 리소스의 내용을 노출하거나 내부 네트워크 리소스의 존재를 알리는 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 메시지는 인증 자격 증명을 전송하는 데 사용할 수도 있습니다.

공격자가 원시 XML을 작성할 수 있는 경우, XML 문서 및 메시지의 의미를 변경할 수 있습니다. 대부분의 양호한 경우, 공격자는 외부에서 발생한 태그를 삽입할 수 있고 이로 인해 XML 파서에 예외가 발생할 수 있습니다. 더 악의적인 XML injection의 경우 공격자는 인증 자격 증명을 변경하거나 XML 전자상거래 데이터베이스에서 가격을 수정하는 XML 요소를 추가할 수 있습니다. XML injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1:

다음 XML에서 공격자가 shoes를 제어할 수 있다고 가정합니다.

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


이제 이 XML이 신발 한 켤레를 주문하는 백엔드(back end) 웹 서비스 요청에 포함됨을 가정해 보십시오. 공격자가 요청을 수정하고 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 구문 분석을 사용할 때, 두 번째 <price>의 값은 첫 번째 <price> 태그의 값을 덮어씁니다. 그러면 공격자는 한 켤레에 $100인 신발을 $1에 구입할 수 있습니다.
desc.dataflow.dotnet.xml_injection
Abstract
식별된 메서드는 확인되지 않은 XML 입력을 작성합니다. 이 호출로 공격자는 XML 문서에 임의의 요소나 속성을 삽입할 수 있습니다.
Explanation
XML injection은 다음과 같은 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.


2. XML 문서에 데이터가 작성됩니다.

일반적으로 응용 프로그램은 XML을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터를 저장하는 데 사용할 경우, XML 문서는 주로 데이터베이스와 같이 다뤄지며 민감한 정보를 포함할 수 있습니다. XML 메시지는 주로 웹 서비스에서 사용하며 민감한 정보를 전송하는 데에도 사용할 수 있습니다. XML 메시지는 인증 자격 증명을 전송하는 데 사용할 수도 있습니다.

공격자가 원시 XML을 작성할 수 있는 경우, XML 문서 및 메시지의 의미를 변경할 수 있습니다. 대부분의 양호한 경우, 공격자는 외부에서 발생한 태그를 삽입할 수 있고 이로 인해 XML 파서에 예외가 발생할 수 있습니다. 더 악의적인 XML injection의 경우 공격자는 인증 자격 증명을 변경하거나 XML 전자상거래 데이터베이스에서 가격을 수정하는 XML 요소를 추가할 수 있습니다. XML injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1:

다음 XML에서 공격자가 shoes를 제어할 수 있다고 가정합니다.

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


이제 이 XML이 신발 한 켤레를 주문하는 백엔드(back end) 웹 서비스 요청에 포함됨을 가정해 보십시오. 공격자가 요청을 수정하고 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 구문 분석을 사용할 때, 두 번째 <price>의 값은 첫 번째 <price> 태그의 값을 덮어씁니다. 그러면 공격자는 한 켤레에 $100인 신발을 $1에 구입할 수 있습니다.
desc.dataflow.cpp.xml_injection
Abstract
확인되지 않은 데이터를 XML 문서에 쓰면 공격자가 XML의 구조와 내용을 변경할 수 있습니다.
Explanation
XML injection은 다음과 같은 경우에 발생합니다.

1. 신뢰할 수 없는 소스의 데이터가 프로그램에 입력됩니다.

2. XML 문서에 데이터가 작성됩니다.

일반적으로 응용 프로그램은 XML을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터를 저장하는 데 사용할 경우, XML 문서는 주로 데이터베이스와 같이 다뤄지며 중요한 정보를 포함할 수 있습니다. XML 메시지는 주로 웹 서비스에서 사용하며 중요한 정보를 전송하는 데에도 사용할 수 있습니다. XML 메시지는 인증 자격 증명을 전송하는 데 사용할 수도 있습니다.

공격자가 원시 XML을 작성할 수 있는 경우, XML 문서 및 메시지의 의미를 변경할 수 있습니다. 대부분의 양호한 경우, 공격자는 외부에서 발생한 태그를 삽입할 수 있고 이로 인해 XML 파서에 예외가 발생할 수 있습니다. 더 악의적인 XML injection의 경우 공격자는 인증 자격 증명을 변경하거나 XML 전자상거래 데이터베이스에서 가격을 수정하는 XML 요소를 추가할 수 있습니다. XML injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1:

다음 XML에서 공격자가 shoes를 제어할 수 있다고 가정합니다.

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


이제 이 XML이 신발 한 켤레를 주문하는 백엔드(back end) 웹 서비스 요청에 포함됨을 가정해 보십시오. 공격자가 요청을 수정하고 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 구문 분석을 사용할 때, 두 번째 <price>의 값은 첫 번째 <price> 태그의 값을 오버라이드합니다. 그러면 공격자는 한 켤레에 $100인 신발을 $1에 구입할 수 있습니다.
desc.dataflow.golang.xml_injection
Abstract
확인되지 않은 데이터를 XML 문서에 쓰면 공격자가 XML의 구조와 내용을 변경할 수 있습니다.
Explanation
XML injection은 다음과 같은 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

2. XML 문서에 데이터가 작성됩니다.

일반적으로 응용 프로그램은 XML을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터를 저장하는 데 사용할 경우, XML 문서는 주로 데이터베이스와 같이 다뤄지며 민감한 정보를 포함할 수 있습니다. XML 메시지는 주로 웹 서비스에서 사용하며 민감한 정보를 전송하는 데에도 사용할 수 있습니다. XML 메시지는 인증 자격 증명을 전송하는 데 사용할 수도 있습니다.

공격자가 원시 XML을 작성할 수 있는 경우, XML 문서 및 메시지의 의미를 변경할 수 있습니다. 대부분의 양호한 경우, 공격자는 외부에서 발생한 태그를 삽입할 수 있고 이로 인해 XML 파서에 예외가 발생할 수 있습니다. 더 악의적인 XML injection의 경우 공격자는 인증 자격 증명을 변경하거나 XML 전자상거래 데이터베이스에서 가격을 수정하는 XML 요소를 추가할 수 있습니다. XML injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1:

다음 XML에서 공격자가 shoes를 제어할 수 있다고 가정합니다.

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


이제 이 XML이 신발 한 켤레를 주문하는 백엔드(back end) 웹 서비스 요청에 포함됨을 가정해 보십시오. 공격자가 요청을 수정하고 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 구문 분석을 사용할 때, 두 번째 <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 메시지는 인증 자격 증명을 전송하는 데 사용할 수도 있습니다.

공격자가 원시 XML을 작성할 수 있는 경우, XML 문서 및 메시지의 의미를 변경할 수 있습니다. 대부분의 양호한 경우, 공격자는 외부에서 발생한 태그를 삽입할 수 있고 이로 인해 XML 파서에 예외가 발생할 수 있습니다. 더 악의적인 XML injection의 경우 공격자는 인증 자격 증명을 변경하거나 XML 전자상거래 데이터베이스에서 가격을 수정하는 XML 요소를 추가할 수 있습니다. XML injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1:

다음 XML에서 공격자가 shoes를 제어할 수 있다고 가정합니다.

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


이제 이 XML이 신발 한 켤레를 주문하는 백엔드(back end) 웹 서비스 요청에 포함됨을 가정해 보십시오. 공격자가 요청을 수정하고 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 메시지는 인증 자격 증명을 전송하는 데 사용할 수도 있습니다.

공격자가 원시 XML을 작성할 수 있는 경우, XML 문서 및 메시지의 의미를 변경할 수 있습니다. 대부분의 양호한 경우, 공격자는 외부에서 발생한 태그를 삽입할 수 있고 이로 인해 XML 파서에 예외가 발생할 수 있습니다. 더 악의적인 XML injection의 경우 공격자는 인증 자격 증명을 변경하거나 XML 전자상거래 데이터베이스에서 가격을 수정하는 XML 요소를 추가할 수 있습니다. XML injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1:

다음 XML에서 공격자가 shoes를 제어할 수 있다고 가정합니다.

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


이제 이 XML이 신발 한 켤레를 주문하는 백엔드(back end) 웹 서비스 요청에 포함됨을 가정해 보십시오. 공격자가 요청을 수정하고 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 구문 분석을 사용할 때, 두 번째 <price>의 값은 첫 번째 <price> 태그의 값을 덮어씁니다. 그러면 공격자는 한 켤레에 $100인 신발을 $1에 구입할 수 있습니다.
desc.dataflow.objc.xml_injection
Abstract
확인되지 않은 데이터를 XML 문서에 쓰면 공격자가 XML의 구조와 내용을 변경할 수 있습니다.
Explanation
XML injection은 다음과 같은 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

2. XML 문서에 데이터가 작성됩니다.

일반적으로 응용 프로그램은 XML을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터를 저장하는 데 사용할 경우, XML 문서는 주로 데이터베이스와 같이 다뤄지며 민감한 정보를 포함할 수 있습니다. XML 메시지는 주로 웹 서비스에서 사용하며 민감한 정보를 전송하는 데에도 사용할 수 있습니다. XML 메시지는 인증 자격 증명을 전송하는 데 사용할 수도 있습니다.

공격자가 원시 XML을 작성할 수 있는 경우, XML 문서 및 메시지의 의미를 변경할 수 있습니다. 대부분의 양호한 경우, 공격자는 외부에서 발생한 태그를 삽입할 수 있고 이로 인해 XML 파서에 예외가 발생할 수 있습니다. 더 악의적인 XML injection의 경우 공격자는 인증 자격 증명을 변경하거나 XML 전자상거래 데이터베이스에서 가격을 수정하는 XML 요소를 추가할 수 있습니다. XML injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1:

다음 XML에서 공격자가 shoes를 제어할 수 있다고 가정합니다.

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


이제 이 XML이 신발 한 켤레를 주문하는 백엔드(back end) 웹 서비스 요청에 포함됨을 가정해 보십시오. 공격자가 요청을 수정하고 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 파서를 사용할 경우 두 번째 <price>의 값이 첫 번째 <price> 태그의 값을 덮어씁니다. 그러면 공격자는 한 켤레에 $100인 신발을 $1에 구입할 수 있습니다.


이 공격의 좀 더 심각한 형태인 XXE(XML 외부 엔터티) injection은 공격자가 구문 분석된 XML 문서의 앞 부분 또는 전체를 제어하는 경우에 발생할 수 있습니다.

예제 2:다음은 XXE 공격에 취약한 일부 코드입니다.

공격자는 다음과 같은 코드에 대한 입력 XML을 제어할 수 있다고 가정합니다.


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


이제 다음 XML이 공격자에 의해 Example 2의 코드에 전달된다고 가정해 봅니다.



<?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 메시지는 인증 자격 증명을 전송하는 데 사용할 수도 있습니다.

공격자가 원시 XML을 작성할 수 있는 경우, XML 문서 및 메시지의 의미를 변경할 수 있습니다. 대부분의 양호한 경우, 공격자는 외부에서 발생한 태그를 삽입할 수 있고 이로 인해 XML 파서에 예외가 발생할 수 있습니다. 더 악의적인 XML injection의 경우 공격자는 인증 자격 증명을 변경하거나 XML 전자상거래 데이터베이스에서 가격을 수정하는 XML 요소를 추가할 수 있습니다. XML injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1:

다음 XML에서 공격자가 shoes를 제어할 수 있다고 가정합니다.

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


이제 이 XML이 신발 한 켤레를 주문하는 백엔드(back end) 웹 서비스 요청에 포함됨을 가정해 보십시오. 공격자가 요청을 수정하고 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 구문 분석을 사용할 때, 두 번째 <price>의 값은 첫 번째 <price> 태그의 값을 덮어씁니다. 그러면 공격자는 한 켤레에 $100인 신발을 $1에 구입할 수 있습니다.
desc.dataflow.python.xml_injection
Abstract
확인되지 않은 데이터를 XML 문서에 쓰면 공격자가 XML의 구조와 내용을 변경할 수 있습니다. 검증되지 않은 XML을 구문 분석하면 Denial of Service, 중요한 정보의 노출 및 원격 코드 실행이 발생할 수 있습니다.
Explanation
XML injection은 다음과 같은 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

2. 데이터가 XML 문서에 작성되거나 XML로 구문 분석됩니다.

일반적으로 응용 프로그램은 XML을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터를 저장하는 데 사용할 경우, XML 문서는 주로 데이터베이스와 같이 다뤄지며 민감한 정보를 포함할 수 있습니다. XML 메시지는 주로 웹 서비스에서 사용하며 민감한 정보를 전송하는 데에도 사용할 수 있습니다. XML 메시지는 인증 자격 증명을 전송하는 데 사용할 수도 있습니다.

공격자가 원시 XML을 작성할 수 있는 경우, XML 문서 및 메시지의 의미를 변경할 수 있습니다. 대부분의 양호한 경우, 공격자는 외부에서 발생한 태그를 삽입할 수 있고 이로 인해 XML 파서에 예외가 발생할 수 있습니다. 더 악의적인 XML injection의 경우 공격자는 인증 자격 증명을 변경하거나 XML 전자상거래 데이터베이스에서 가격을 수정하는 XML 요소를 추가할 수 있습니다. XML injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1:

다음 XML에서 공격자가 shoes를 제어할 수 있다고 가정합니다.

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


이제 이 XML이 신발 한 켤레를 주문하는 백엔드(back end) 웹 서비스 요청에 포함됨을 가정해 보십시오. 공격자가 요청을 수정하고 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 구문 분석을 사용할 때, 두 번째 <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을 구문 분석하면 Denial of Service, 중요한 정보의 노출 및 원격 코드 실행이 발생할 수 있습니다.
Explanation
XML injection은 다음과 같은 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

2. 데이터가 XML 문서에 작성되거나 XML로 구문 분석됩니다.

일반적으로 응용 프로그램은 XML을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터를 저장하는 데 사용할 경우, XML 문서는 주로 데이터베이스와 같이 다뤄지며 중요한 정보를 포함할 수 있습니다. XML 메시지는 주로 웹 서비스에서 사용하며 중요한 정보를 전송하는 데에도 사용할 수 있습니다. XML 메시지는 인증 자격 증명을 전송하는 데 사용할 수도 있습니다.

공격자가 원시 XML을 작성할 수 있는 경우, XML 문서 및 메시지의 의미를 변경할 수 있습니다. 대부분의 양호한 경우, 공격자는 외부에서 발생한 태그를 삽입할 수 있고 이로 인해 XML 파서에 예외가 발생할 수 있습니다. 더 악의적인 XML injection의 경우 공격자는 인증 자격 증명을 변경하거나 XML 전자상거래 데이터베이스에서 가격을 수정하는 XML 요소를 추가할 수 있습니다. XML injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1:

다음 XML에서 공격자가 shoes를 제어할 수 있다고 가정합니다.

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


이제 이 XML이 신발 한 켤레를 주문하는 백엔드(back end) 웹 서비스 요청에 포함됨을 가정해 보십시오. 공격자가 요청을 수정하고 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 구문 분석을 사용할 때, 두 번째 <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 메시지는 인증 자격 증명을 전송하는 데 사용할 수도 있습니다.

공격자가 원시 XML을 작성할 수 있는 경우, XML 문서 및 메시지의 의미를 변경할 수 있습니다. 대부분의 양호한 경우, 공격자는 외부에서 발생한 태그를 삽입할 수 있고 이로 인해 XML 파서에 예외가 발생할 수 있습니다. 더 악의적인 XML injection의 경우 공격자는 인증 자격 증명을 변경하거나 XML 전자상거래 데이터베이스에서 가격을 수정하는 XML 요소를 추가할 수 있습니다. XML injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1:

다음 XML에서 공격자가 shoes를 제어할 수 있다고 가정합니다.

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


이제 이 XML이 신발 한 켤레를 주문하는 백엔드(back end) 웹 서비스 요청에 포함됨을 가정해 보십시오. 공격자가 요청을 수정하고 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 구문 분석을 사용할 때, 두 번째 <price>의 값은 첫 번째 <price> 태그의 값을 덮어씁니다. 그러면 공격자는 한 켤레에 $100인 신발을 $1에 구입할 수 있습니다.
desc.dataflow.swift.xml_injection