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.
XStream
procesando entradas que no son de confianza.
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)
Ejemplo: el siguiente documento XML creará una instancia de un objeto de ProcessBuilder e invocará su método start() estático para ejecutar la calculadora en ventanas.
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>
Ejemplo 2: La aplicación utiliza datos no validados controlados por el usuario en una etiqueta de Spring que lleva a cabo una evaluación doble de 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()
o syslog()
.snprintf()
.
int main(int argc, char **argv){
char buf[128];
...
snprintf(buf,128,argv[1]);
}
%x
, que la función utiliza como argumentos a los que aplicar un formato. (En este ejemplo, la función no utiliza ningún argumento al que se le vaya aplicar un formato.) Mediante la directiva de formato %n
, el usuario malintencionado puede escribir en la pila lo que provoca que snprintf()
escriba la salida de un número de bytes hasta el momento en el argumento especificado (en lugar de leer un valor del argumento, que es el comportamiento previsto). Una versión sofisticada de este ataque utilizará cuatro operaciones de escritura escalonadas para controlar por completo el valor de un puntero en la pila.
printf("%d %d %1$d %1$d\n", 5, 9);
5 9 5 5
Example 1
.syslog()
se usa a menudo de la siguiente forma:
...
syslog(LOG_ERR, cmdBuf);
...
syslog()
es una cadena de formato, todas las directivas de formato incluidas en cmdBuf
se interpretan como se describe en el Example 1
.syslog()
:
...
syslog(LOG_ERR, "%s", cmdBuf);
...
sprintf()
, FormatMessageW()
, syslog()
, NSLog
o NSString.stringWithFormat
Ejemplo 1: el código siguiente utiliza un argumento de línea de comandos como una cadena de formato en NSString.stringWithFormat:
.
int main(int argc, char **argv){
char buf[128];
...
[NSString stringWithFormat:argv[1], argv[2] ];
}
%x
, que la función utiliza como argumentos a los que aplicar un formato. (En este ejemplo, la función no utiliza ningún argumento al que se le vaya aplicar un formato.)
printf("%d %d %1$d %1$d\n", 5, 9);
5 9 5 5
Example 1
.syslog()
se usa a menudo de la siguiente forma:
...
syslog(LOG_ERR, cmdBuf);
...
syslog()
es una cadena de formato, todas las directivas de formato incluidas en cmdBuf
se interpretan como se describe en el Example 1
.syslog()
:Ejemplo 4: las clases principales de Apple proporcionan vías interesantes para explotar las vulnerabilidades de la cadena de formato.
...
syslog(LOG_ERR, "%s", cmdBuf);
...
String.stringByAppendingFormat()
se usa a menudo de la siguiente forma:
...
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
. Si el usuario que abre la hoja de cálculo confía en el origen del documento, puede aceptar todas las indicaciones de seguridad presentadas por el procesador de la hoja de cálculo y dejar que la carga (en este ejemplo, abrir la calculadora de Windows) se ejecute en el 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
. Si el usuario que abre la hoja de cálculo confía en el origen del documento, puede aceptar todas las indicaciones de seguridad presentadas por el procesador de la hoja de cálculo y dejar que la carga (en este ejemplo, abrir la calculadora de Windows) se ejecute en el 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
. Si el usuario que abre la hoja de cálculo confía en el origen del documento, puede aceptar todas las indicaciones de seguridad presentadas por el procesador de la hoja de cálculo y dejar que la carga (en este ejemplo, abrir la calculadora de Windows) se ejecute en el 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
. Si el usuario que abre la hoja de cálculo confía en el origen del documento, puede aceptar todas las indicaciones de seguridad presentadas por el procesador de la hoja de cálculo y dejar que la carga (en este ejemplo, abrir la calculadora de Windows) se ejecute en el 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
no puede restringir las clases de fragmento para las que puede crear instancias.PreferenceActivity
no segura y proporcionarle una intención :android:show_fragment
extra para que cargue una clase arbitraria. La aplicación maliciosa puede hacer que PreferenceActivity
cargue un Fragment
arbitrario de la aplicación vulnerable, el cual que se suele cargar en una actividad no exportada, para exponerlo al atacante.
@Override
public static boolean isFragmentValid(Fragment paramFragment)
{
return true;
}