Problemas de validação e representação da entrada são causados por metacaracteres, codificações alternativas e representações numéricas. Confiar na entrada resulta em problemas de segurança. Os problemas incluem: “Buffer Overflows”, ataques de “Cross-Site Scripting”, “SQL Injection”, entre outros.
...
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
é um valor benigno, como "John". Nesse caso, a variável result
recebe um valor de "Hello World! Welcome John!". No entanto, se um invasor especificar operações de linguagens tanto válidas quanto mal-intencionadas, estas serão executadas com o privilégio total do processo pai. Esses ataques são ainda mais perigosos quando a linguagem subjacente fornece acesso a recursos do sistema ou permite a execução de comandos do sistema. Por exemplo, o Razor permite a invocação de objetos C#. Se um invasor fosse especificar " @{ System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.EnableRaisingEvents=false; proc.StartInfo.FileName=\"calc\"; proc.Start(); }" como valor de name
, um comando do sistema seria executado no sistema host.
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps);
...
operation
é um valor benigno, como "8 + 7 * 2". Nesse caso, a variável result
recebe um valor de 22. No entanto, se um invasor especificar operações de linguagens tanto válidas quanto mal-intencionadas, estas serão executadas com o privilégio total do processo pai. Esses ataques são ainda mais perigosos quando a linguagem subjacente fornece acesso a recursos do sistema ou permite a execução de comandos do sistema. Por exemplo, o JavaScript permite a invocação de objetos Java. Se um invasor fosse especificar " java.lang.Runtime.getRuntime().exec("shutdown -h now")" como valor de operation
, um comando de desligamento seria executado no sistema host.
...
userOp = form.operation.value;
calcResult = eval(userOp);
...
operation
é um valor benigno, como "8 + 7 * 2". Nesse caso, a variável calcResult
recebe um valor de 22. No entanto, se um invasor especificar operações de linguagens tanto válidas quanto mal-intencionadas, estas serão executadas com o privilégio total do processo pai. Esses ataques são ainda mais perigosos quando a linguagem subjacente fornece acesso a recursos do sistema ou permite a execução de comandos do sistema. No caso de JavaScript, o invasor pode utilizar essa vulnerabilidade para realizar um ataque de Cross-Site Scripting.
...
strUserOp = Request.Form('operation')
strResult = Eval(strUserOp)
...
operation
é "8 + 7 * 2". A variável strResult
retorna um valor de 22. No entanto, se um usuário especificar outras operações de linguagem válidas, elas não só seriam executadas, como executadas com o privilégio completo do processo pai. A execução de código arbitrário torna-se mais perigosa quando a linguagem subjacente fornece acesso a recursos do sistema ou permite a execução de comandos do sistema. Por exemplo, se um invasor especificar operation
como " Shell('C:\WINDOWS\SYSTEM32\TSSHUTDN.EXE 0 /DELAY:0 /POWERDOWN')" um comando de desligamento será executado no sistema host.Delegate
serializável pode introduzir vulnerabilidades de execução de código arbitrário durante ou após a desserialização dessa classe.Delegate
é utilizado para manter a referência a uma chamada de método que pode ser invocada mais tarde no código do usuário. O .NET usa a serialização personalizada durante a serialização de tipos Delegate
e utiliza a classe System.DelegateSerializationHolder
para armazenar as informações de método que estão anexadas ou inscritas em um Delegate
. Portanto, o fluxo serializado do objeto Delegate
não é adequado para o armazenamento persistente ou para transmiti-lo para o aplicativo remoto, pois um invasor poderia substituir as informações de método por informações que apontam para os gráficos de objetos mal-intencionados, que podem causar uma vulnerabilidade de execução de código arbitrário quando invocados durante ou após a desserialização.Delegate
e está sendo invocada no 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
, pode ser que um invasor consiga substituir as informações de método por informações que apontem para Process.Start
. Isso causará a criação de um processo arbitrário quando o método Executor
for chamado.BeanUtilsHashMapper
para desserializar Hashes Redis, o que pode permitir que o invasor no controle desses Hashes execute um código arbitrário.
HashMapper<Person, String, String> hashMapper = new BeanUtilsHashMapper<Person>(Person.class);
Person p = hashMapper.fromHash(untrusted_map);
EnableViewStateMac
, pois ela introduz uma vulnerabilidade de execução remota de código no aplicativo. No entanto, o desenvolvedor pode substituir essa função pela configuração aspnet:AllowInsecureDeserialization
e tornar o aplicativo vulnerável a uma execução remota de código.aspnet:AllowInsecureDeserialization
está definido como true
.
<appSettings>
<add key="aspnet:AllowInsecureDeserialization" value="true" />
</appSettings>
Low
e Full
. Low
, o valor padrão, protege contra ataques de desserialização por meio da desserialização apenas dos tipos associados à funcionalidade de comunicação remota mais básica, como desserialização automática de tipos de infraestrutura de comunicação remota, um conjunto limitado de tipos implementados pelo sistema e um conjunto básico de tipos personalizados. O nível de desserialização Full
suporta a desserialização automática de todos os tipos que o sistema de comunicação remota suporta em todas as situações.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
.Exemplo 2: JMSInvokerServiceExporter expondo 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
.Exemplo 3: HTTPInvokerServiceExporter expondo 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__
. Esse método deve retornar uma callable
e os respectivos argumentos. A Pickle chamará o resgatável com os argumentos fornecidos para construir o novo objeto, permitindo que o invasor execute comandos arbitrários.