입력 검증 및 표현 문제는 메타 문자, 대체 인코딩 및 숫자 표현 때문에 발생합니다. 보안 문제는 입력을 신뢰하기 때문에 발생합니다. 문제로는 "Buffer Overflows", "Cross-Site Scripting" 공격, "SQL Injection", 그 외 여러 가지가 있습니다.
...
String address = request.getParameter("address");
Properties props = new Properties();
props.put(Provider_URL, "rmi://secure-server:1099/");
InitialContext ctx = new InitialContext(props);
ctx.lookup(address);
...
string name = Request["username"];
string template = "Hello @Model.Name! Welcome " + name + "!";
string result = Razor.Parse(template, new { Name = "World" });
...
operation
매개 변수가 무해한 값일 때 프로그램이 올바르게 동작합니다. 이 경우 result
변수에 "Hello World! Welcome John!"의 값이 할당됩니다. 그러나, 공격자가 올바르면서도 악의적인 언어 작업을 지정하면 해당 작업이 상위 프로세스의 전체 권한으로 실행됩니다. 이러한 공격은 기본 언어가 시스템 리소스에 대한 접근을 제공하거나 시스템 명령 실행을 허용할 때 더 위험합니다. 예를 들어, Razor는 C# 개체의 호출을 허용합니다. 공격자가 " @{ System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.EnableRaisingEvents=false; proc.StartInfo.FileName=\"calc\"; proc.Start(); }"를 name
의 값으로 지정하는 경우, 호스트 시스템에서 시스템 명령이 실행됩니다.
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps);
...
operation
매개 변수가 양의 값일 때 프로그램이 올바르게 동작합니다. 이 경우 result
변수에 22의 값이 할당됩니다. 그러나, 공격자가 올바르고 악의적인 언어 작업을 지정하면 해당 작업이 상위 프로세스의 전체 권한으로 실행됩니다. 이러한 공격은 기본 언어가 시스템 리소스에 대한 접근을 제공하거나 시스템 명령 실행을 허용할 때 더 위험합니다. 예를 들어, JavaScript는 Java 개체의 호출을 허용합니다. 공격자가 " java.lang.Runtime.getRuntime().exec("shutdown -h now")"를 operation
값으로 지정하는 경우 호스트 시스템에서 종료 명령이 실행됩니다.
...
userOp = form.operation.value;
calcResult = eval(userOp);
...
operation
매개 변수가 "8 + 7 * 2"와 같은 양의 값일 때 프로그램이 올바르게 동작합니다. 이 경우 calcResult
변수에 22 값이 할당됩니다. 그러나 공격자가 올바르면서도 악의적인 언어 작업을 지정하면 해당 작업이 상위 프로세스의 전체 권한으로 실행됩니다. 이러한 공격은 기본 언어가 시스템 리소스에 대한 액세스를 제공하거나 시스템 명령 실행을 허용할 때 더 위험합니다. JavaScript의 경우, 공격자는 이 취약점을 이용하여 cross-site scripting 공격을 수행할 수 있습니다.
...
strUserOp = Request.Form('operation')
strResult = Eval(strUserOp)
...
operation
매개 변수가 "8 + 7 * 2"인 예제에서 일어납니다. strResult
변수는 22의 값을 반환합니다. 그러나 사용자가 다른 유효한 언어 작업을 지정한 경우, 해당 작업은 실행될 뿐 아니라 상위 프로세스의 전체 권한으로 실행됩니다. 임의의 코드 실행은 기본 언어가 시스템 리소스에 대한 액세스를 제공하거나 시스템 명령 실행을 허용할 때 더 위험합니다. 예를 들어 공격자가 operation
을 "Shell('C:\WINDOWS\SYSTEM32\TSSHUTDN.EXE 0 /DELAY:0 /POWERDOWN')"로 지정하는 경우 호스트 시스템에서 종료 명령이 실행됩니다.Delegate
필드는 해당 클래스의 역직렬화 시점에 또는 그 이후에 임의의 코드 실행 취약점을 야기할 수 있습니다.Delegate
유형은 사용자 코드에서 나중에 호출될 수 있는 메서드 호출에 대한 참조를 유지하는 데 사용됩니다. .NET은 Delegate
유형을 직렬화하는 동안 사용자 지정 직렬화를 사용하고 System.DelegateSerializationHolder
클래스를 활용하여 Delegate
에 연결되었거나 가입된 메서드 정보를 저장합니다. 따라서 공격자가 메서드 정보를 악의적인 개체 그래프를 가리킬 수 있는 항목으로 대체하여 역직렬화 시점에 또는 그 이후에 호출될 때 임의의 코드 실행 취약점을 야기할 수 있기 때문에 Delegate
개체의 직렬화된 스트림은 지속적으로 저장하거나 원격 응용 프로그램에 전달하는 데 적합하지 않습니다.Delegate
필드를 포함하며 Executor
메서드에서 호출됩니다.
...
[Serializable]
class DynamicRunnner
{
Delegate _del;
string[] _arg;
public DynamicRunnner(Delegate dval, params string[] arg)
{
_del = dval;
_arg = arg;
}
public bool Executor()
{
return (bool)_del.DynamicInvoke(_arg);
}
}
...
Example 1
에서 언급된 클래스의 신뢰할 수 없는 스트림을 역직렬화하면 공격자가 메서드 정보를 Process.Start
메서드를 가리키는 항목으로 대체하여 Executor
메서드가 호출될 때 임의의 프로세스가 생성될 수 있습니다.BeanUtilsHashMapper
을(를) 사용하여 공격자가 해당 해시로 임의 코드를 실행하도록 제어할 수 있는 Redis Hash를 역직렬화합니다.
HashMapper<Person, String, String> hashMapper = new BeanUtilsHashMapper<Person>(Person.class);
Person p = hashMapper.fromHash(untrusted_map);
EnableViewStateMac
속성의 설정이 응용 프로그램에서 원격 코드 실행 취약점을 유발할 수 있으므로 해당 설정을 무시합니다. 하지만 개발자는 aspnet:AllowInsecureDeserialization
설정으로 이러한 기능을 오버라이드하여 응용 프로그램이 원격 코드 실행에 취약하도록 만들 수 있습니다.aspnet:AllowInsecureDeserialization
이 true
로 설정됩니다.
<appSettings>
<add key="aspnet:AllowInsecureDeserialization" value="true" />
</appSettings>
Low
및 Full
2개의 자동 역직렬화 수준을 제공합니다. 기본값인 Low
는 Remoting 인프라스트럭처 유형 자동 역직렬화, 시스템 구현 유형 제한 집합 및 사용자 지정 유형 기본 집합과 같은 가장 기본적인 Remoting 기능과 관련된 유형만 역직렬화하여 역직렬화 공격으로부터 보호합니다. Full
역직렬화 수준은 모든 상황에서 Remoting이 지원하는 모든 유형의 자동 역직렬화를 지원합니다.typeFilterLevel
이 Full
로 설정됩니다.
<system.runtime.remoting>
<application>
<channels>
<channel ref="tcp" port="2000">
<serverProviders>
<formatter ref="soap" typeFilterLevel="Full" />
<formatter ref="binary" typeFilterLevel="Full" />
</serverProviders>
<clientProviders>
<formatter ref="binary"/>
</clientProviders>
</channel>
</channels>
</application>
...
</system.runtime.remoting>
TestService
메서드를 노출하는 RMIServiceExporter예제 2:
<bean id="testService" class="example.TestServiceImpl"/>
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName" value="TestService"/>
<property name="service" ref="testService"/>
<property name="serviceInterface" value="example.TestService"/>
<property name="registryPort" value="1199"/>
</bean>
TestService
메서드를 노출하는 JMSInvokerServiceExporter예제 3:
<bean id="testService" class="example.TestServiceImpl"/>
<bean class="org.springframework.jms.remoting.JmsInvokerServiceExporter">
<property name="serviceInterface" value="example.TestService"/>
<property name="service" ref="testService"/>
</bean>
TestService
메서드를 노출하는 HTTPInvokerServiceExporter
<bean id="testService" class="example.TestServiceImpl"/>
<bean class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="serviceInterface" value="example.TestService"/>
<property name="service" ref="testService"/>
</bean>
The pickle module is not intended to be secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.
__reduce__
메서드 정의를 통해 임의의 개체에 대한 역직렬화 방식을 선언할 수 있도록 합니다. 이 메서드는 callable
및 관련 인수를 반환해야 합니다. Pickle은 제공된 인수를 통해 callable을 호출함으로써 새로운 개체를 구성합니다. 공격자는 이를 통해 임의의 명령을 실행할 수 있게 됩니다.