Los problemas de validación y representación de entradas están causados por metacaracteres, codificaciones alternativas y representaciones numéricas. Los problemas de seguridad surgen de entradas en las que se confía. Estos problemas incluyen: «desbordamientos de búfer», ataques de «scripts de sitios», "SQL injection" y muchas otras acciones.
...
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
es un valor benigno, como "John", en cuyo caso la variable result
se asigna a un valor de "Hello World! Welcome John!". No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Por ejemplo, Razor permite la invocación de objetos C#; si un atacante especificase " @{ System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.EnableRaisingEvents=false; proc.StartInfo.FileName=\"calc\"; proc.Start(); }" como el valor de name
, se ejecutaría un comando del sistema en el sistema host.
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps);
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso la variable result
se asigna a un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Por ejemplo, JavaScript permite la invocación de objetos Java. Si un usuario malintencionado especifica " java.lang.Runtime.getRuntime().exec("shutdown -h now")" como valor de operation
, se ejecutará un comando de apagado en el sistema host.
...
userOp = form.operation.value;
calcResult = eval(userOp);
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso la variable calcResult
se asigna a un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. En el caso de JavaScript, el atacante puede utilizar esta vulnerabilidad para realizar un ataque de secuencias entre sitios.
...
strUserOp = Request.Form('operation')
strResult = Eval(strUserOp)
...
operation
es "8 + 7 * 2". La variable strResult
devuelve un valor de 22. Sin embargo, si un usuario especifica otras operaciones de lenguaje válidas, esas no solo se ejecutan, sino que lo hacen con todos los privilegios del proceso principal. La ejecución de código arbitraria será más peligrosa cuando el lenguaje subyacente proporcione acceso a los recursos del sistema o permita la ejecución de comandos del sistema. Por ejemplo, si un usuario malintencionado especifica operation
como " Shell('C:\WINDOWS\SYSTEM32\TSSHUTDN.EXE 0 /DELAY:0 /POWERDOWN')" se ejecutaría un comando de apagado en el sistema host.Delegate
en una clase determinada puede introducir una vulnerabilidad de ejecución de código arbitrario durante la serialización de dicha clase, o después de ella.Delegate
se usa para hacer referencia a una llamada de método que se puede invocar más tarde en el código de usuario. .NET usa la serialización personalizada mientras serializa los tipos Delegate
y utiliza la clase System.DelegateSerializationHolder
para almacenar la información del método que se adjunta o se suscribe a Delegate
. La secuencia serializada del objeto Delegate
no es adecuada para el almacenamiento persistente ni para transferirla a la aplicación remota debido a que un atacante podría sustituir la información del método con información que apuntase a gráficos de objeto maliciosos, lo que podría causar una vulnerabilidad de ejecución de código arbitrario cuando se invocase durante la serialización, o después de ella.Delegate
y se invoca en el método 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
, un atacante podría sustituir la información del método con información que apuntase a Process.Start
, con lo que se crearía un proceso arbitrario cuando se llamase al método Executor
.BeanUtilsHashMapper
para deserializar hashes de Redis que pueden permitir que los atacantes que controlen dichos hashes ejecuten código arbitrario.
HashMapper<Person, String, String> hashMapper = new BeanUtilsHashMapper<Person>(Person.class);
Person p = hashMapper.fromHash(untrusted_map);
EnableViewStateMac
, ya que introduce una vulnerabilidad de ejecución de código remoto en la aplicación. Sin embargo, el desarrollador puede sobrescribir esta función mediante la configuración de aspnet:AllowInsecureDeserialization
, que hace que la aplicación sea vulnerable a la ejecución de código remoto.aspnet:AllowInsecureDeserialization
está definido como true
.
<appSettings>
<add key="aspnet:AllowInsecureDeserialization" value="true" />
</appSettings>
Low
y Full
. Low
, el valor predeterminado, protege frente a este tipo de ataques deserializando únicamente los tipos asociados a la funcionalidad de comunicación remota más básica, como la deserialización automática de tipos de infraestructura de comunicación remota, un conjunto limitado de tipos implementados en el sistema y un conjunto básico de tipos personalizados. El nivel Full
admite la deserialización de todos los tipos que la comunicación remota admite en cualquier situación.typeFilterLevel
está definido como 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
.Ejemplo 2: JMSInvokerServiceExporter que expone métodos
<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
.Ejemplo 3: HTTPInvokerServiceExporter que expone métodos
<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
.
<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__
. Este método debería devolver callable
y sus argumentos. Pickle llamará al callable con los argumentos proporcionados para construir el nuevo objeto permitiendo que el atacante ejecute comandos arbitrarios.