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.
Marker child = MarkerManager.getMarker("child");
Marker parent = MarkerManager.getMarker("parent");
child.addParents(MarkerManager.getMarker(userInput));
parent.addParents(MarkerManager.getMarker(userInput2));
String toInfinity = child.toString();
child
e parent
para um marcador definido pelo usuário. Se o usuário inserir o pai de child
como parent
e o pai de parent
como child
, um link circular será criado na estrutura de dados Marker. Ao executar o método recursivo toString
na estrutura de dados que contém o link circular, o programa lançará uma exceção de estouro de pilha e travará. Isso causa uma negação de serviço por meio do esgotamento da pilha.StringBuilder
ou do StringBuffer
inicializada com o tamanho padrão da matriz de apoio pode fazer com que a JVM consuma excessivamente o espaço de memória heap.StringBuilder
ou do StringBuffer
inicializada com o tamanho padrão da matriz de caracteres de apoio (16) pode fazer com que o aplicativo consuma grandes quantidades de memória heap ao redimensionar a matriz subjacente para ajustar os dados de usuário. Quando dados são anexados a uma instância de um StringBuilder
ou de um StringBuffer
, a instância determinará se a matriz de caracteres de apoio tem espaço suficiente para armazenar os dados. Se os dados não forem ajustados, uma nova instância do StringBuilder
ou do StringBuffer
irá criar outra matriz com pelo menos o dobro do tamanho da matriz anterior e a matriz antiga permanecerá no heap até que seja coletada como lixo. Os invasores podem usar esse detalhe da implementação para executar um ataque de Negação de Serviço (Denial of Service – DoS).StringBuilder
inicializada com o construtor padrão.
...
StringBuilder sb = new StringBuilder();
final String lineSeparator = System.lineSeparator();
String[] labels = request.getParameterValues("label");
for (String label : labels) {
sb.append(label).append(lineSeparator);
}
...
StringBuilder
ou do StringBuffer
inicializada com o tamanho padrão da matriz de apoio pode fazer com que a JVM consuma excessivamente o espaço de memória heap.StringBuilder
ou do StringBuffer
inicializada com o tamanho padrão da matriz de caracteres de apoio (16) pode fazer com que o aplicativo consuma grandes quantidades de memória heap ao redimensionar a matriz subjacente para ajustar os dados do usuário. Quando dados são anexados a uma instância de um StringBuilder
ou de um StringBuffer
, a instância determinará se a matriz de caracteres de apoio tem espaço suficiente para armazenar os dados. Se os dados não forem ajustados, uma nova instância do StringBuilder
ou do StringBuffer
irá criar outra matriz com pelo menos o dobro do tamanho da matriz anterior e a matriz antiga permanecerá no heap até que seja coletada como lixo. Os invasores podem usar esse detalhe da implementação para executar um ataque de Negação de Serviço (Denial of Service – DoS).StringBuilder
inicializada com o construtor padrão.
...
val sb = StringBuilder()
val labels = request.getParameterValues("label")
for (label in labels) {
sb.appendln(label)
}
...
...
user_ops = request->get_form_field( 'operation' ).
CONCATENATE: 'PROGRAM zsample.| FORM calculation. |' INTO code_string,
calculator_code_begin user_ops calculator_code_end INTO code_string,
'ENDFORM.|' INTO code_string.
SPLIT code_string AT '|' INTO TABLE code_table.
GENERATE SUBROUTINE POOL code_table NAME calc_prog.
PERFORM calculation IN PROGRAM calc_prog.
...
operation
é um valor benigno. No entanto, se um invasor especificar operações de linguagem 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 o código injetado acessa recursos do sistema ou executa comandos do sistema. Por exemplo, se um invasor especificasse "MOVE 'shutdown -h now' to cmd. CALL 'SYSTEM' ID 'COMMAND' FIELD cmd ID 'TAB' FIELD TABL[]." como valor de operation
, um comando de desligamento seria executado no sistema host.
...
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var userOps:String = String(params["operation"]);
result = ExternalInterface.call("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 linguagem 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 ActionScript, o invasor pode utilizar essa vulnerabilidade para realizar um ataque de Cross-Site Scripting.
...
public static object CEval(string sCSCode)
{
CodeDomProvider icc = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters cparam = new CompilerParameters();
cparam.ReferencedAssemblies.Add("system.dll");
cparam.CompilerOptions = "/t:library";
cparam.GenerateInMemory = true;
StringBuilder sb_code = new StringBuilder("");
sb_code.Append("using System;\n");
sb_code.Append("namespace Fortify_CodeEval{ \n");
sb_code.Append("public class FortifyCodeEval{ \n");
sb_code.Append("public object EvalCode(){\n");
sb_code.Append(sCSCode + "\n");
sb_code.Append("} \n");
sb_code.Append("} \n");
sb_code.Append("}\n");
CompilerResults cr = icc.CompileAssemblyFromSource(cparam, sb_code.ToString());
if (cr.Errors.Count > 0)
{
logger.WriteLine("ERROR: " + cr.Errors[0].ErrorText);
return null;
}
System.Reflection.Assembly a = cr.CompiledAssembly;
object o = a.CreateInstance("Fortify_CodeEval.FortifyCodeEval");
Type t = o.GetType();
MethodInfo mi = t.GetMethod("EvalCode");
object s = mi.Invoke(o, null);
return s;
}
...
sCSCode
é um valor benigno, como "return 8 + 7 * 2". Nesse caso, 22 é o valor de retorno da função CEval
. No entanto, se um invasor especificar operações de linguagem 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 .Net permite a invocação de APIs do Windows. Se um invasor fosse especificar " return System.Diagnostics.Process.Start(\"shutdown\", \"/s /t 0\");" como valor de operation
, um comando de desligamento 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.
...
@property (strong, nonatomic) WKWebView *webView;
@property (strong, nonatomic) UITextField *inputTextField;
...
[_webView evaluateJavaScript:[NSString stringWithFormat:@"document.body.style.backgroundColor="%@";", _inputTextField.text] completionHandler:nil];
...
<body>
dentro do webView
seria estilizado para ter um fundo azul. No entanto, se um invasor mal-intencionado fornecer dados que ainda sejam válidos, ele ou ela pode ser capaz de executar códigos JavaScript arbitrários. Por exemplo, uma vez que o JavaScript pode acessar certos tipos de informações privadas, tais como cookies, se um invasor especificasse "white";document.body.innerHTML=document.cookie;"" como entrada para o UITextField, as informações de cookie seriam escritas visivelmente na página. Tais 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, como nas situações nas quais o código injetado é executado com o privilégio completo do processo pai.
...
$userOps = $_GET['operation'];
$result = 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 as operações que são válidas e mal-intencionadas, essas operações seriam 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, se um invasor especificasse " exec('shutdown -h now')" como o valor de operation
, um comando shutdown seria executado no sistema do host.
...
userOps = request.GET['operation']
result = 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 as operações que são válidas e mal-intencionadas, essas operações seriam 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, se um invasor especificar " os.system('shutdown -h now')" como o valor da operation
, um comando de desligamento seria executado no sistema host.
...
user_ops = req['operation']
result = eval(user_ops)
...
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. Com Ruby isso é permitido, e como vários comandos podem ser executados ao delimitar as linhas com um ponto e vírgula (;
), isso também permitiria a execução de vários comandos com uma simples injeção sem, no entanto, quebrar o programa.operation
, isso poderia abrir a porta 4444 para escutar uma conexão na máquina e depois ainda retornar o valor 22 para result
...
var webView : WKWebView
var inputTextField : UITextField
...
webView.evaluateJavaScript("document.body.style.backgroundColor="\(inputTextField.text)";" completionHandler:nil)
...
<body>
dentro do webView
seria estilizado para ter um fundo azul. No entanto, se um invasor mal-intencionado fornecer dados que ainda sejam válidos, ele ou ela pode ser capaz de executar códigos JavaScript arbitrários. Por exemplo, uma vez que o JavaScript pode acessar certos tipos de informações privadas, tais como cookies, se um invasor especificasse "white";document.body.innerHTML=document.cookie;"" como entrada para o UITextField, as informações de cookie seriam escritas visivelmente na página. Tais 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, como nas situações nas quais o código injetado é executado com o privilégio completo do processo pai.
...
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.
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
ScriptContext newContext = new SimpleScriptContext();
Bindings engineScope = newContext.getBindings(request.getParameter("userName"));
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps,newContext);
...
page_scope
é o nome de usuário esperado. No entanto, se um invasor especificar o valor para GLOBAL_SCOPE
, as operações terão acesso a todos os atributos dentro de todos os mecanismos criados pelo mesmo ScriptEngine
.
...
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 em uma determinada classe introduz uma vulnerabilidade de execução de código arbitrário ao desserializar a classe.Delegate
é usado para manter referência a uma chamada de método que pode ser invocada posteriormente no código do usuário. .NET usa a serialização personalizada durante a serialização dos tipos Delegate
e utiliza a classe System.DelegateSerializationHolder
para armazenar as informações do método que estão anexadas ou inscritas em um Delegate
. O fluxo serializado do objeto Delegate
não é adequado para armazenamento persistente ou para passá-lo para aplicativos remotos, porque se um invasor puder substituir as informações do método por uma que aponte para um gráfico de objeto malicioso, o invasor poderá executar código arbitrário.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);
Stream
de uma conexão como entrada e a desserializa de volta para um objeto .NET. Em seguida, retorna o resultado depois de convertê-lo em uma lista de objetos de string:
...
List <string> Deserialize(Stream input)
{
var bf = new BinaryFormatter();
var result = (List <string>)bf.Deserialize(input);
return result;
}
...
Example 1
pode ser regravado desta maneira:
...
List <string> Deserialize(Stream input)
{
var bf = new BinaryFormatter();
object tmp = bf.Deserialize(input);
List <string> result = (List <string>)tmp;
return result;
}
...
Example 2
, a operação de desserialização será bem-sucedida desde que o fluxo de entrada seja válido, independentemente de se o tipo é List <string>
ou não.bin
ou no GAC
e que não podem ser injetadas pelo invasor. Portanto, a capacidade de exploração desses ataques depende das classes disponíveis no ambiente do aplicativo. Infelizmente, classes comuns de terceiros ou até mesmo classes .NET podem ser abusadas de forma a esgotar os recursos do sistema, excluir arquivos, implantar arquivos mal-intencionados ou executar código arbitrário.
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.enable_unsafe_deserialization()
permite que um invasor desserialize lambdas ou outros objetos que podem ser chamados em Python. Embora esse recurso seja útil para flexibilidade e restauração de modelos complexos, ele abrirá vulnerabilidades se os dados serializados puderem ser.
import tensorflow as tf
tf.keras.config.enable_unsafe_deserialization()
model = tf.keras.models.load_model('evilmodel_tf.keras')
model([])
XStream
processando uma entrada não confiável.
XStream xstream = new XStream();
String body = IOUtils.toString(request.getInputStream(), "UTF-8");
Contact expl = (Contact) xstream.fromXML(body);
var yamlString = getYAMLFromUser();
// Setup the input
var input = new StringReader(yamlString);
// Load the stream
var yaml = new YamlStream();
yaml.Load(input);
var yaml = require('js-yaml');
var untrusted_yaml = getYAMLFromUser();
yaml.load(untrusted_yaml)
import yaml
yamlString = getYamlFromUser()
yaml.load(yamlString)
Exemplo 1: O seguinte documento XML instanciará um objeto ProcessBuilder e invocará seu método estático start() para executar a calculadora do Windows.
XMLDecoder decoder = new XMLDecoder(new InputSource(new InputStreamReader(request.getInputStream(), "UTF-8")));
Object object = decoder.readObject();
decoder.close();
<java>
<object class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="1" >
<void index="0">
<string>c:\\windows\\system32\\calc.exe</string>
</void>
</array>
<void method="start"/>
</object>
</java>
Exemplo 2: O aplicativo usa dados não validados controlados pelo usuário em uma tag Spring que realiza a avaliação dupla SpEL:
String expression = request.getParameter("input");
SpelExpressionParser parser = new SpelExpressionParser();
SpelExpression expr = parser.parseRaw(expression);
<spring:message text="" code="${param['message']}"></spring:message>
sprintf()
, FormatMessageW()
ou syslog()
.snprintf()
.
int main(int argc, char **argv){
char buf[128];
...
snprintf(buf,128,argv[1]);
}
%x
, do que a função utiliza como argumentos a serem formatados. (Neste exemplo, a função não usa argumentos a serem formatados.) Ao usar a diretiva de formatação %n
, o invasor pode gravar na pilha, fazendo com que snprintf()
grave no argumento especificado o número de bytes cuja saída foi processada até o momento (em vez de ler um valor do argumento, que é o comportamento pretendido). Uma versão sofisticada desse ataque usará quatro gravações escalonadas para controlar completamente o valor de um apontador na pilha.
printf("%d %d %1$d %1$d\n", 5, 9);
5 9 5 5
Example 1
.syslog()
por vezes utilizada da seguinte maneira:
...
syslog(LOG_ERR, cmdBuf);
...
syslog()
é uma string de formato, qualquer diretiva de formatação incluída em cmdBuf
é interpretada conforme descrito no Example 1
.syslog()
:
...
syslog(LOG_ERR, "%s", cmdBuf);
...
sprintf()
, FormatMessageW()
, syslog()
, NSLog
, ou NSString.stringWithFormat
como um argumento do formato StringNSString.stringWithFormat:
.
int main(int argc, char **argv){
char buf[128];
...
[NSString stringWithFormat:argv[1], argv[2] ];
}
%x
, do que a função utiliza como argumentos a serem formatados. (Neste exemplo, a função não usa argumentos a serem formatados.)
printf("%d %d %1$d %1$d\n", 5, 9);
5 9 5 5
Example 1
.syslog()
por vezes utilizada da seguinte maneira:
...
syslog(LOG_ERR, cmdBuf);
...
syslog()
é uma string de formato, qualquer diretiva de formatação incluída em cmdBuf
é interpretada conforme descrito no Example 1
.syslog()
:Exemplo 4: As classes principais da Apple proporcionam rotas interessantes para explorar as vulnerabilidades do formato String.
...
syslog(LOG_ERR, "%s", cmdBuf);
...
String.stringByAppendingFormat()
por vezes utilizada da seguinte maneira:
...
NSString test = @"Sample Text.";
test = [test stringByAppendingFormat:[MyClass
formatInput:inputControl.text]];
...
stringByAppendingFormat()
:
...
NSString test = @"Sample Text.";
test = [test stringByAppendingFormat:@"%@", [MyClass
formatInput:inputControl.text]];
...
=cmd|'/C calc.exe'!Z0
. Se o usuário que abrir a planilha confiar na origem do documento, poderá aceitar todos os prompts de segurança apresentados pelo processador de planilha e deixar a carga útil (neste exemplo, a abertura da calculadora do Windows) ser executada em seu sistema.
public void Service()
{
string name = HttpContext.Request["name"];
string data = GenerateCSVFor(name);
HttpContext.Response.Clear();
HttpContext.Response.Buffer = true;
HttpContext.Response.AddHeader("content-disposition", "attachment;filename=file.csv");
HttpContext.Response.Charset = "";
HttpContext.Response.ContentType = "application/csv";
HttpContext.Response.Output.Write(tainted);
HttpContext.Response.Flush();
HttpContext.Response.End();
}
=cmd|'/C calc.exe'!Z0
. Se o usuário que abrir a planilha confiar na origem do documento, poderá aceitar todos os prompts de segurança apresentados pelo processador de planilha e deixar a carga útil (neste exemplo, a abertura da calculadora do Windows) ser executada em seu sistema.
func someHandler(w http.ResponseWriter, r *http.Request){
r.parseForm()
foo := r.FormValue("foo")
...
w := csv.NewWriter(file)
w.Write(foo)
}
=cmd|'/C calc.exe'!Z0
. Se o usuário que abrir a planilha confiar na origem do documento, poderá aceitar todos os prompts de segurança apresentados pelo processador de planilha e deixar a carga útil (neste exemplo, a abertura da calculadora do Windows) ser executada em seu sistema.
@RequestMapping(value = "/api/service.csv")
public ResponseEntity<String> service(@RequestParam("name") String name) {
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("Content-Type", "application/csv; charset=utf-8");
responseHeaders.add("Content-Disposition", "attachment;filename=file.csv");
String data = generateCSVFor(name);
return new ResponseEntity<>(data, responseHeaders, HttpStatus.OK);
}
=cmd|'/C calc.exe'!Z0
. Se o usuário que abrir a planilha confiar na origem do documento, poderá aceitar todos os prompts de segurança apresentados pelo processador de planilha e deixar a carga útil (neste exemplo, a abertura da calculadora do Windows) ser executada em seu sistema.
@RequestMapping(value = "/api/service.csv")
fun service(@RequestParam("name") name: String): ResponseEntity<String> {
val responseHeaders = HttpHeaders()
responseHeaders.add("Content-Type", "application/csv; charset=utf-8")
responseHeaders.add("Content-Disposition", "attachment;filename=file.csv")
val data: String = generateCSVFor(name)
return ResponseEntity(data, responseHeaders, HttpStatus.OK)
}
PreferenceActivity
não consegue restringir as classes de fragmento que pode instanciar.PreferenceActivity
insegura e fornecê-la com uma Intenção :android:show_fragment
extra a fim de fazê-lo carregar uma classe arbitrária. O aplicativo malicioso pode tornar a carga de PreferenceActivity
um Fragment
arbitrário do aplicativo vulnerável que, normalmente, é carregado em uma Atividade não exportada, expondo-a ao invasor.
@Override
public static boolean isFragmentValid(Fragment paramFragment)
{
return true;
}