Reino: Input Validation and Representation

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.

175 elementos encontrados
Debilidades
Abstract
Si no se tiene en cuenta el desbordamiento de enteros, se pueden producir errores lógicos o desbordamientos del búfer.
Explanation
Un desbordamiento de entero se produce cuando un programa no consigue contar con el hecho de que una operación aritmética puede dar como resultado una cantidad o bien mayor que el valor máximo del tipo de datos o inferior que su valor mínimo. A menudo, estos errores provocan problemas en las funciones de asignación de memoria, donde la entrada de un usuario se cruza con una conversión implícita entre los valores firmados y sin firma. Si un atacante puede provocar que el programa subasigne una memoria o interprete un valor firmado como un valor sin firmar en una operación de memoria, el programa puede ser vulnerable a un desbordamiento de búfer.

Ejemplo 1: El siguiente código, obtenido de OpenSSH 3.3, muestra un caso clásico de desbordamiento de enteros:


nresp = packet_get_int();
if (nresp > 0) {
response = xmalloc(nresp*sizeof(char*));
for (i = 0; i < nresp; i++)
response[i] = packet_get_string(NULL);
}


Si nresp tiene el valor 1073741824 y sizeof(char*) tiene su valor típico de 4, el resultado de la operación nresp*sizeof(char*) se desbordaría y el argumento de xmalloc() sería 0. La mayor parte de las implementaciones de malloc() permitirán la asignación de un búfer de 0 bytes, lo que hará que las iteraciones de bucle posteriores desborden el búfer de montón response.

Ejemplo 2: Este ejemplo procesa la entrada de usuario formada por una serie de estructuras de longitud variable. Los dos primeros bytes de entrada establecen el tamaño de la estructura que se va a procesar.


char* processNext(char* strm) {
char buf[512];
short len = *(short*) strm;
strm += sizeof(len);
if (len <= 512) {
memcpy(buf, strm, len);
process(buf);
return strm + len;
} else {
return -1;
}
}


El programador ha establecido un límite superior en el tamaño de la estructura: si es mayor que 512, la entrada no se procesará. El problema es que len es un entero con signo, de modo que la comprobación en relación con la longitud máxima de la estructura se realiza con enteros con signo, pero len se convierte en un entero sin signo para la llamada a memcpy(). Si len es negativo, parecerá que la estructura tiene un tamaño adecuado (se tomará la rama if), pero la cantidad de memoria copiada por memcpy() será bastante grande y el atacante podrá desbordar la pila con los datos de strm.
References
[1] blexim Basic Integer Overflows Phrack
[2] D. Plakosh Coding Flaws That Lead to Security Failures 2nd Annual Hampton University Information Assurance Symposium
[3] Les Hatton Safer C: Developing Software for High-integrity and Safety-critical Systems McGraw-Hill Companies
desc.dataflow.cpp.integer_overflow
Abstract
No contar con un desbordamiento de entero puede llevar a errores de lógica y un desbordamiento de búfer.
Explanation
Un desbordamiento de entero se produce cuando un programa no consigue contar con el hecho de que una operación aritmética puede dar como resultado una cantidad o bien mayor que el valor máximo del tipo de datos o inferior que su valor mínimo. A menudo, estos errores provocan problemas en las funciones de asignación de memoria, donde la entrada de un usuario se cruza con una conversión implícita entre los valores firmados y sin firma. Si un atacante puede provocar que el programa subasigne una memoria o interprete un valor firmado como un valor sin firmar en una operación de memoria, el programa puede ser vulnerable a un desbordamiento de búfer.

Ejemplo: El siguiente extracto de código muestra un caso clásico de desbordamiento de entero:


77 accept-in PIC 9(10).
77 num PIC X(4) COMP-5. *> native 32-bit unsigned integer
77 mem-size PIC X(4) COMP-5.
...
ACCEPT accept-in
MOVE accept-in TO num
MULTIPLY 4 BY num GIVING mem-size

CALL "CBL_ALLOC_MEM" USING
mem-pointer
BY VALUE mem-size
BY VALUE 0
RETURNING status-code
END-CALL


Si num tiene el valor 1073741824, entonces el resultado de la operación MULTIPLY 4 BY num desborda, y el argumento mem-size a malloc() será 0. La mayoría de implementaciones de malloc() ayudarán a la asignación de un búfer de 0 byte, lo que provocará que el búfer de salto mem-pointer se desborde en declaraciones posteriores.
References
[1] blexim Basic Integer Overflows Phrack
[2] D. Plakosh Coding Flaws That Lead to Security Failures 2nd Annual Hampton University Information Assurance Symposium
[3] Les Hatton Safer C: Developing Software for High-integrity and Safety-critical Systems McGraw-Hill Companies
desc.dataflow.cobol.integer_overflow
Abstract
Una función maneja incorrectamente un cálculo de números enteros que produce un desbordamiento.
Explanation
Un desbordamiento de números enteros ocurre cuando un cálculo o una operación aritmética da como resultado un valor que está por encima o por debajo del valor máximo/mínimo del tipo de entero, lo que hace que el valor regrese al límite inferior/superior y continúe desde allí. El valor resultante de una operación aritmética es, en la práctica. el módulo del rango de números enteros de los límites superior/inferior.

Por ejemplo, si un número se almacena en un tipo uint256, significa que se almacena como número sin signo de 256 bits que va de 0 a 2^256-1. Si una operación aritmética da como resultado un número mayor que el límite superior, se produce un desbordamiento por encima y el resto se suma al valor inicial (0). Si una operación aritmética hace que el número sea inferior al límite inferior, se produce un desbordamiento inferior y el resto se resta del valor más grande (2^256-1).

Ejemplo 1: La siguiente función pública actualiza una asignación uint256 mediante una operación aritmética que puede provocar un desbordamiento superior/inferior de enteros y afectar a indicadores de forma involuntaria en el mapa.


contract overflow {
mapping(uint256 => uint256) map;

function init(uint256 k, uint256 v) public {
map[k] -= v;
}
}
References
[1] Enterprise Ethereum Alliance No Overflow/Underflow
desc.structural.solidity.swc101
Abstract
Al permitir que la entrada del usuario controle los parámetros Intent, se podría permitir que un usuario malintencionado controlara el comportamiento de la actividad siguiente.
Explanation
Se produce un problema de manipulación de finalidad cuando se cumplen las dos condiciones siguientes:

1. Un atacante puede especificar la acción, el nombre de clase o el componente de una finalidad de Android.

Por ejemplo, un atacante puede especificar el nombre de clase o el componente para gestionar la finalidad.

2. Al especificar la acción, el nombre de clase o el componente, el usuario malintencionado adquiere una capacidad que de otro modo no estaría permitida.

Por ejemplo, el programa puede otorgar al usuario malintencionado la capacidad de transmitir información confidencial a un software de terceros en el dispositivo.

Ejemplo 1: el siguiente código utiliza un argumento leído de una solicitud HTTP para establecer el nombre de clase de una finalidad.


String arg = request.getParameter("arg");
...
Intent intent = new Intent();
...
intent.setClassName(arg);
ctx.startActivity(intent);
...
References
[1] Intent
desc.dataflow.java.intent_manipulation
Abstract
El uso de un Intent anidado de una entrada externa para iniciar una actividad, iniciar un servicio o entregar una transmisión puede permitir que un atacante lance arbitrariamente componentes internos de la aplicación, controle el comportamiento de un componente interno o acceda indirectamente a datos protegidos de un proveedor de contenido a través de concesiones de permisos.
Explanation
Se produce un problema manipulación de intento de redireccionamiento cuando se cumplen las condiciones siguientes:
1. Un componente exportado acepta un Intent arbitrario anidado en el paquete de extras de un Intent proporcionado externamente.

2. El componente exportado utiliza el Intent arbitrario para iniciar un componente llamando a startActivity, startService o sendBroadcast.

Un atacante posiblemente pueda obtener una capacidad que de otro modo no estaría permitida cuando existen estas condiciones.
Ejemplo 1: El siguiente código acepta un Intent anidado de una fuente externa y usa ese Intent para iniciar una actividad.


...
Intent nextIntent = (Intent) getIntent().getParcelableExtra("next-intent");
startActivity(nextIntent);
...
References
[1] Intent
[2] Remediation for Intent Redirection Vulnerability - Google Help
[3] Nicole Borrelli Android Nesting Intents
[4] Standards Mapping - CIS Azure Kubernetes Service Benchmark 3
[5] Standards Mapping - CIS Microsoft Azure Foundations Benchmark complete
[6] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 4
[7] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 1
[8] Standards Mapping - CIS Google Kubernetes Engine Benchmark integrity
[9] Standards Mapping - CIS Kubernetes Benchmark partial
[10] Standards Mapping - Common Weakness Enumeration CWE ID 99
[11] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002754
[12] Standards Mapping - FIPS200 SI
[13] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[14] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-10 Information Input Validation (P1)
[15] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-10 Information Input Validation
[16] Standards Mapping - OWASP Top 10 2004 A1 Unvalidated Input
[17] Standards Mapping - OWASP Top 10 2007 A4 Insecure Direct Object Reference
[18] Standards Mapping - OWASP Top 10 2010 A4 Insecure Direct Object References
[19] Standards Mapping - OWASP Top 10 2013 A4 Insecure Direct Object References
[20] Standards Mapping - OWASP Top 10 2017 A5 Broken Access Control
[21] Standards Mapping - OWASP Top 10 2021 A01 Broken Access Control
[22] Standards Mapping - OWASP API 2023 API2 Broken Authentication
[23] Standards Mapping - OWASP Mobile 2014 M8 Security Decisions Via Untrusted Inputs
[24] Standards Mapping - OWASP Mobile 2024 M4 Insufficient Input/Output Validation
[25] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-CODE-4, MASVS-PLATFORM-1
[26] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 Requirement 6.5.1
[27] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2 Requirement 6.3.1.1, Requirement 6.5.4
[28] Standards Mapping - Payment Card Industry Data Security Standard Version 2.0 Requirement 6.5.8
[29] Standards Mapping - Payment Card Industry Data Security Standard Version 3.0 Requirement 6.5.8
[30] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2 Requirement 6.5.8
[31] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2.1 Requirement 6.5.8
[32] Standards Mapping - Payment Card Industry Data Security Standard Version 3.1 Requirement 6.5.8
[33] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
[34] Standards Mapping - Payment Card Industry Software Security Framework 1.0 Control Objective 4.2 - Critical Asset Protection, Control Objective 5.4 - Authentication and Access Control
[35] Standards Mapping - Payment Card Industry Software Security Framework 1.1 Control Objective 4.2 - Critical Asset Protection, Control Objective 5.4 - Authentication and Access Control, Control Objective B.3.1 - Terminal Software Attack Mitigation, Control Objective B.3.1.1 - Terminal Software Attack Mitigation
[36] Standards Mapping - Payment Card Industry Software Security Framework 1.2 Control Objective 4.2 - Critical Asset Protection, Control Objective 5.4 - Authentication and Access Control, Control Objective B.3.1 - Terminal Software Attack Mitigation, Control Objective B.3.1.1 - Terminal Software Attack Mitigation, Control Objective C.2.3 - Web Software Access Controls, Control Objective C.3.2 - Web Software Attack Mitigation
[37] Standards Mapping - Security Technical Implementation Guide Version 3.1 APP3510 CAT I, APP3600 CAT II
[38] Standards Mapping - Security Technical Implementation Guide Version 3.4 APP3510 CAT I, APP3600 CAT II
[39] Standards Mapping - Security Technical Implementation Guide Version 3.5 APP3510 CAT I, APP3600 CAT II
[40] Standards Mapping - Security Technical Implementation Guide Version 3.6 APP3510 CAT I, APP3600 CAT II
[41] Standards Mapping - Security Technical Implementation Guide Version 3.7 APP3510 CAT I, APP3600 CAT II
[42] Standards Mapping - Security Technical Implementation Guide Version 3.9 APP3510 CAT I, APP3600 CAT II
[43] Standards Mapping - Security Technical Implementation Guide Version 3.10 APP3510 CAT I, APP3600 CAT II
[44] Standards Mapping - Security Technical Implementation Guide Version 4.1 APSC-DV-002560 CAT I
[45] Standards Mapping - Security Technical Implementation Guide Version 4.2 APSC-DV-002560 CAT I
[46] Standards Mapping - Security Technical Implementation Guide Version 4.3 APSC-DV-002560 CAT I
[47] Standards Mapping - Security Technical Implementation Guide Version 4.4 APSC-DV-002560 CAT I
[48] Standards Mapping - Security Technical Implementation Guide Version 4.5 APSC-DV-002560 CAT I
[49] Standards Mapping - Security Technical Implementation Guide Version 4.6 APSC-DV-002560 CAT I
[50] Standards Mapping - Security Technical Implementation Guide Version 4.7 APSC-DV-002560 CAT I
[51] Standards Mapping - Security Technical Implementation Guide Version 4.8 APSC-DV-002560 CAT I
[52] Standards Mapping - Security Technical Implementation Guide Version 4.9 APSC-DV-002560 CAT I
[53] Standards Mapping - Security Technical Implementation Guide Version 4.10 APSC-DV-002560 CAT I
[54] Standards Mapping - Security Technical Implementation Guide Version 4.11 APSC-DV-002560 CAT I
[55] Standards Mapping - Security Technical Implementation Guide Version 5.1 APSC-DV-002560 CAT I
[56] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002560 CAT I
[57] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002530 CAT II, APSC-DV-002560 CAT I
[58] Standards Mapping - Web Application Security Consortium Version 2.00 Improper Input Handling (WASC-20)
desc.dataflow.java.intent_manipulation_redirection
Abstract
El método escribe una entrada sin validar en JSON. Esta llamada podría permitir a un usuario malintencionado inyectar atributos o elementos arbitrarios en la entidad JSON.
Explanation
La inyección JSON se produce cuando:

1. Los datos entran en un programa desde un origen que no es de confianza.


2. Los datos se escriben en una secuencia JSON.

Las aplicaciones suelen utilizar la secuencia JSON para almacenar datos o enviar mensajes. Cuando se utiliza para almacenar datos, JSON a menudo se trata como datos almacenados en la caché y pueden contener información probablemente confidencial. Cuando se utiliza para enviar mensajes, JSON a menudo se utiliza junto con un servicio RESTful y se puede utilizar para transmitir información confidencial como las credenciales de autenticación.

La semántica de los documentos y mensajes JSON se puede modificar si una aplicación construye JSON a partir de una entrada sin validar. En un caso relativamente benigno, un atacante puede ser capaz de insertar elementos extraños y hacer que una aplicación produzca una excepción mientras se está analizando un documento o una solicitud JSON. En un caso más grave, como uno que implique la inyección JSON, un atacante puede ser capaz de insertar elementos extraños que permitan la manipulación predecible de los valores críticos para el negocio dentro de un documento o una solicitud JSON. En algunos casos, la inyección JSON puede dar lugar a cross-site scripting o evaluación de código dinámico.

Ejemplo 1: el siguiente código C# utiliza JSON.NET para serializar la información de autenticación de las cuentas de usuario para los usuarios sin privilegios (aquellos con un rol "predeterminado" a diferencia de los usuarios con privilegios con un rol de "admin") a partir de las variables de entrada controladas por el usuario username y password al archivo JSON ubicado en C:\user_info.json:


...

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);

using (JsonWriter writer = new JsonTextWriter(sw))
{
writer.Formatting = Formatting.Indented;

writer.WriteStartObject();

writer.WritePropertyName("role");
writer.WriteRawValue("\"default\"");

writer.WritePropertyName("username");
writer.WriteRawValue("\"" + username + "\"");

writer.WritePropertyName("password");
writer.WriteRawValue("\"" + password + "\"");

writer.WriteEndObject();
}

File.WriteAllText(@"C:\user_info.json", sb.ToString());


Aun así, dado que la serialización de JSON se realiza mediante el uso de JsonWriter.WriteRawValue(), los datos que no son de confianza de username y password no se validarán para omitir caracteres especiales relacionados con JSON. Esto permite a un usuario introducir claves JSON de forma arbitraria, posiblemente cambiando la estructura del JSON serializado. En este ejemplo, si el usuario sin privilegios mallory con la contraseña Evil123! fuese a agregar ","role":"admin a su nombre de usuario al introducirlo en la solicitud que establece el valor de la variable username, el JSON resultante guardado en C:\user_info.json sería:


{
"role":"default",
"username":"mallory",
"role":"admin",
"password":"Evil123!"
}


Si el archivo JSON serializado se fuese a deserializar en un objeto Dictionary con JsonConvert.DeserializeObject() de este modo:


String jsonString = File.ReadAllText(@"C:\user_info.json");

Dictionary<string, string> userInfo = JsonConvert.DeserializeObject<Dictionary<string, strin>>(jsonString);


Los valores resultantes para las claves de username, password y role del objeto Dictionary serían mallory, Evil123! y admin, respectivamente. Sin más comprobaciones de que los valores JSON deserializados son válidos, la aplicación asignará de forma incorrecta privilegios de "admin" al usuario mallory.
desc.dataflow.dotnet.json_injection
Abstract
El método escribe una entrada sin validar en JSON. Un atacante puede insertar elementos o atributos arbitrarios en la entidad JSON.
Explanation
La inyección JSON se produce cuando sucede lo siguiente:

1. Los datos se introducen en un programa desde un origen que no es de confianza.


2. Los datos se escriben en una secuencia JSON.

Las aplicaciones suelen utilizar la secuencia JSON para almacenar datos o enviar mensajes. Cuando se utiliza para almacenar datos, JSON a menudo se trata como datos almacenados en la caché y puede contener información confidencial. Cuando se usa para enviar mensajes, JSON a menudo se utiliza junto con un servicio RESTful y puede transmitir información confidencial, como las credenciales de autenticación.

Los atacantes pueden alterar la semántica de mensajes y documentos JSON si una aplicación construye JSON a partir de una entrada sin validar. En un caso relativamente benigno, un atacante puede insertar elementos extraños y hacer que una aplicación genere una excepción mientras se están analizando un documento o una solicitud JSON. En casos más graves, como aquellos que impliquen la inyección JSON, un atacante puede insertar elementos extraños que permitan la manipulación predecible de los valores críticos para el negocio dentro de un documento o una solicitud JSON. En ocasiones, la inyección JSON puede dar lugar a scripts de sitios o una evaluación de código dinámico.

Ejemplo 1: El siguiente código serializa la información de autenticación de las cuentas de usuario para los usuarios sin privilegios (aquellos con un rol "predeterminado" a diferencia de los usuarios con privilegios con un rol de "admin") a partir de variables de entrada controladas por el usuario username y password al archivo JSON ubicado en ~/user_info.json:


...
func someHandler(w http.ResponseWriter, r *http.Request){
r.parseForm()
username := r.FormValue("username")
password := r.FormValue("password")
...
jsonString := `{
"username":"` + username + `",
"role":"default"
"password":"` + password + `",
}`
...
f, err := os.Create("~/user_info.json")
defer f.Close()

jsonEncoder := json.NewEncoder(f)
jsonEncoder.Encode(jsonString)
}


Debido a que el código realiza la serialización de JSON mediante el uso de la concatenación de cadenas, los datos que no son de confianza en username y password no se validan a fin de omitir caracteres especiales relacionados con JSON. Esto permite a un usuario introducir claves JSON de forma arbitraria, lo cual posiblemente pueda cambiar la estructura del archivo JSON serializado. En este ejemplo, si el usuario sin privilegios mallory con la contraseña Evil123! anexó ","role":"admin cuando ingresó su nombre de usuario, el archivo JSON resultante guardado en ~/user_info.json sería el siguiente:


{
"username":"mallory",
"role":"default",
"password":"Evil123!",
"role":"admin"
}

Sin más comprobaciones de que los valores JSON deserializados son válidos, la aplicación asigna de forma accidental al usuario mallory privilegios de "admin".
desc.dataflow.golang.json_injection
Abstract
El método escribe una entrada sin validar en JSON. Esta llamada podría permitir a un usuario malintencionado inyectar atributos o elementos arbitrarios en la entidad JSON.
Explanation
La inyección JSON se produce cuando:

1. Los datos entran en un programa desde un origen que no es de confianza.


2. Los datos se escriben en una secuencia JSON.

Las aplicaciones suelen utilizar la secuencia JSON para almacenar datos o enviar mensajes. Cuando se utiliza para almacenar datos, JSON a menudo se trata como datos almacenados en la caché y pueden contener información probablemente confidencial. Cuando se utiliza para enviar mensajes, JSON a menudo se utiliza junto con un servicio RESTful y se puede utilizar para transmitir información confidencial como las credenciales de autenticación.

La semántica de los documentos y mensajes JSON se puede modificar si una aplicación construye JSON a partir de una entrada sin validar. En un caso relativamente benigno, un atacante puede ser capaz de insertar elementos extraños y hacer que una aplicación produzca una excepción mientras se está analizando un documento o una solicitud JSON. En un caso más grave, como uno que implique la inyección JSON, un atacante puede ser capaz de insertar elementos extraños que permitan la manipulación predecible de los valores críticos para el negocio dentro de un documento o una solicitud JSON. En algunos casos, la inyección JSON puede dar lugar a cross-site scripting o evaluación de código dinámico.

Ejemplo 1: el siguiente código Java utiliza Jackson para serializar la información de autenticación de las cuentas de usuario para los usuarios sin privilegios (aquellos con un rol "predeterminado" a diferencia de los usuarios con privilegios con un rol de "admin") a partir de variables de entrada controladas por el usuario username y password al archivo JSON ubicado en ~/user_info.json:


...

JsonFactory jfactory = new JsonFactory();

JsonGenerator jGenerator = jfactory.createJsonGenerator(new File("~/user_info.json"), JsonEncoding.UTF8);

jGenerator.writeStartObject();

jGenerator.writeFieldName("username");
jGenerator.writeRawValue("\"" + username + "\"");

jGenerator.writeFieldName("password");
jGenerator.writeRawValue("\"" + password + "\"");

jGenerator.writeFieldName("role");
jGenerator.writeRawValue("\"default\"");

jGenerator.writeEndObject();

jGenerator.close();


Aun así, dado que la serialización de JSON se realiza mediante el uso de JsonGenerator.writeRawValue(), los datos que no son de confianza de username y password no se validarán para omitir caracteres especiales relacionados con JSON. Esto permite a un usuario introducir claves JSON de forma arbitraria, posiblemente cambiando la estructura del JSON serializado. En este ejemplo, si el usuario sin privilegios mallory con la contraseña Evil123! fuese a agregar ","role":"admin a su nombre de usuario al introducirlo en la solicitud que establece el valor de la variable username, el JSON resultante guardado en ~/user_info.json sería:


{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}


Si el archivo JSON serializado se fuese a deserializar en un objeto HashMap con JsonParser de Jackson de este modo:


JsonParser jParser = jfactory.createJsonParser(new File("~/user_info.json"));

while (jParser.nextToken() != JsonToken.END_OBJECT) {

String fieldname = jParser.getCurrentName();

if ("username".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}

if ("password".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}

if ("role".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}

if (userInfo.size() == 3)
break;
}

jParser.close();


Los valores resultantes para las claves de username, password y role del objeto HashMap serían mallory, Evil123! y admin, respectivamente. Sin más comprobaciones de que los valores JSON deserializados son válidos, la aplicación asignará de forma incorrecta privilegios de "admin" al usuario mallory.
desc.dataflow.java.json_injection
Abstract
El método escribe una entrada sin validar en JSON. Esta llamada podría permitir a un usuario malintencionado inyectar atributos o elementos arbitrarios en la entidad JSON.
Explanation
La inyección JSON se produce cuando:

1. Los datos entran en un programa desde un origen que no es de confianza.


2. Los datos se escriben en una secuencia JSON.

Las aplicaciones suelen utilizar la secuencia JSON para almacenar datos o enviar mensajes. Cuando se utiliza para almacenar datos, JSON a menudo se trata como datos almacenados en la caché y pueden contener información probablemente confidencial. Cuando se utiliza para enviar mensajes, JSON a menudo se utiliza junto con un servicio RESTful y se puede utilizar para transmitir información confidencial como las credenciales de autenticación.

La semántica de los documentos y mensajes JSON se puede modificar si una aplicación construye JSON a partir de una entrada sin validar. En un caso relativamente benigno, un atacante puede ser capaz de insertar elementos extraños y hacer que una aplicación produzca una excepción mientras se está analizando un documento o una solicitud JSON. En un caso más grave, como uno que implique la inyección JSON, un atacante puede ser capaz de insertar elementos extraños que permitan la manipulación predecible de los valores críticos para el negocio dentro de un documento o una solicitud JSON. En algunos casos, la inyección JSON puede dar lugar a cross-site scripting o evaluación de código dinámico.

Ejemplo 1: el siguiente código JavaScript utiliza jQuery para analizar JSON, donde un valor procede de una dirección URL:


var str = document.URL;
var url_check = str.indexOf('name=');
var name = null;
if (url_check > -1) {
name = decodeURIComponent(str.substring((url_check+5), str.length));
}

$(document).ready(function(){
if (name !== null){
var obj = jQuery.parseJSON('{"role": "user", "name" : "' + name + '"}');
...
}
...
});


Aquí, los datos que no son de confianza en name no se validarán para omitir caracteres especiales relacionados con JSON. Esto permite a un usuario introducir claves JSON de forma arbitraria, posiblemente cambiando la estructura del JSON serializado. En este ejemplo, si el usuario sin privilegios mallory fuese a agregar ","role":"admin al parámetro de nombre en la dirección URL, el JSON resultante sería:


{
"role":"user",
"username":"mallory",
"role":"admin"
}


Esto es analizado por jQuery.parseJSON() y establecido como objeto simple, lo que significa que obj.role devolverá "admin" en lugar de "user".
desc.dataflow.javascript.json_injection
Abstract
El método escribe una entrada sin validar en JSON. Esta llamada podría permitir a un usuario malintencionado inyectar atributos o elementos arbitrarios en la entidad JSON.
Explanation
La inyección JSON se produce cuando:

1. Los datos entran en un programa desde un origen que no es de confianza.


2. Los datos se escriben en una secuencia JSON.

Las aplicaciones suelen utilizar la secuencia JSON para almacenar datos o enviar mensajes. Cuando se utiliza para almacenar datos, JSON a menudo se trata como datos almacenados en la caché y pueden contener información probablemente confidencial. Cuando se utiliza para enviar mensajes, JSON a menudo se utiliza junto con un servicio RESTful y se puede utilizar para transmitir información confidencial como las credenciales de autenticación.

La semántica de los documentos y mensajes JSON se puede modificar si una aplicación construye JSON a partir de una entrada sin validar. En un caso relativamente benigno, un atacante puede ser capaz de insertar elementos extraños y hacer que una aplicación produzca una excepción mientras se está analizando un documento o una solicitud JSON. En un caso más grave, como uno que implique la inyección JSON, un atacante puede ser capaz de insertar elementos extraños que permitan la manipulación predecible de los valores críticos para el negocio dentro de un documento o una solicitud JSON. En algunos casos, la inyección JSON puede dar lugar a cross-site scripting o evaluación de código dinámico.

Ejemplo 1: el siguiente código Objective-C serializa la información de la autenticación de cuenta de usuario para usuarios sin privilegios (aquellos con un rol "predeterminado" a diferencia de los usuarios con un rol de "admin") a JSON de los campos controlables por el usuario _usernameField y _passwordField:


...

NSString * const jsonString = [NSString stringWithFormat: @"{\"username\":\"%@\",\"password\":\"%@\",\"role\":\"default\"}" _usernameField.text, _passwordField.text];


Aun así, dado que la serialización de JSON se realiza mediante el uso de NSString.stringWithFormat:, los datos que no son de confianza de _usernameField y _passwordField no se validarán para omitir caracteres especiales relacionados con JSON. Esto permite a un usuario introducir claves JSON de forma arbitraria, posiblemente cambiando la estructura del JSON serializado. En este ejemplo, si el usuario sin privilegios mallory con la contraseña Evil123! fuese a agregar ","role":"admin a su nombre de usuario al introducirla en el campo _usernameField, el JSON resultante sería:


{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}


Si esta cadena JSON serializada se fuese a deserializar en un objeto NSDictionary con NSJSONSerialization.JSONObjectWithData: de este modo:


NSError *error;
NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error];


Los valores resultantes para username, password y role en el objeto NSDictionary serían mallory, Evil123! y admin respectivamente. Sin más comprobaciones de que los valores JSON deserializados son válidos, la aplicación asignará de forma incorrecta privilegios de "admin" al usuario mallory.
desc.dataflow.objc.json_injection
Abstract
El método escribe una entrada sin validar en JSON. Esta llamada podría permitir a un atacante insertar elementos o atributos de forma arbitraria en la entidad JSON.
Explanation
La inyección JSON se produce cuando sucede lo siguiente:

1. Los datos se introducen en un programa desde un origen que no es de confianza.


2. Los datos se escriben en una secuencia JSON.

Las aplicaciones suelen utilizar la secuencia JSON para almacenar datos o enviar mensajes. Cuando se utiliza para almacenar datos, JSON a menudo se trata como datos almacenados en caché y puede contener información confidencial. Cuando se usa para enviar mensajes, JSON a menudo se utiliza junto con un servicio RESTful y puede transmitir información confidencial, como las credenciales de autenticación.

La semántica de los documentos y mensajes JSON se puede modificar si una aplicación construye JSON a partir de una entrada no validada. En un caso relativamente benigno, un atacante puede ser capaz de insertar elementos extraños y hacer que una aplicación genere una excepción mientras se están analizando un documento o una solicitud JSON. En casos más graves, como aquellos que implican una inyección JSON, un atacante puede insertar elementos extraños que permitan la manipulación predecible de los valores críticos para el negocio dentro de un documento o una solicitud JSON. En algunos casos, la inyección de código JSON puede dar lugar a secuencias de comandos en sitios cruzados (Cross-Site Scripting) o a la evaluación de código dinámico.

Ejemplo: El siguiente código de Python actualiza un archivo json con un valor que no es fiable y proviene de una URL:


import json
import requests
from urllib.parse import urlparse
from urllib.parse import parse_qs

url = 'https://www.example.com/some_path?name=some_value'
parsed_url = urlparse(url)
untrusted_values = parse_qs(parsed_url.query)['name'][0]

with open('data.json', 'r') as json_File:
data = json.load(json_File)

data['name']= untrusted_values

with open('data.json', 'w') as json_File:
json.dump(data, json_File)

...


Aquí, los datos que no son fiables en name no se validarán para escapar de los caracteres especiales relacionados con JSON. Esto permite que un usuario inserte arbitrariamente claves JSON, posiblemente cambiando la estructura del JSON serializado. En este ejemplo, si el usuario sin privilegios mallory agregara ","role":"admin al parámetro de nombre en la URL, el JSON se convertiría en:


{
"role":"user",
"username":"mallory",
"role":"admin"
}

El archivo JSON ahora está manipulado con datos maliciosos y el usuario tiene un acceso privilegiado de "administrador" en lugar de "usuario".
desc.dataflow.python.json_injection
Abstract
El método escribe una entrada sin validar en JSON. Esta llamada podría permitir a un usuario malintencionado inyectar atributos o elementos arbitrarios en la entidad JSON.
Explanation
La inyección JSON se produce cuando:

1. Los datos entran en un programa desde un origen que no es de confianza.


2. Los datos se escriben en una secuencia JSON.

Las aplicaciones suelen utilizar la secuencia JSON para almacenar datos o enviar mensajes. Cuando se utiliza para almacenar datos, JSON a menudo se trata como datos almacenados en la caché y pueden contener información probablemente confidencial. Cuando se utiliza para enviar mensajes, JSON a menudo se utiliza junto con un servicio RESTful y se puede utilizar para transmitir información confidencial como las credenciales de autenticación.

La semántica de los documentos y mensajes JSON se puede modificar si una aplicación construye JSON a partir de una entrada sin validar. En un caso relativamente benigno, un atacante puede ser capaz de insertar elementos extraños y hacer que una aplicación produzca una excepción mientras se está analizando un documento o una solicitud JSON. En un caso más grave, como uno que implique la inyección JSON, un atacante puede ser capaz de insertar elementos extraños que permitan la manipulación predecible de los valores críticos para el negocio dentro de un documento o una solicitud JSON. En algunos casos, la inyección JSON puede dar lugar a cross-site scripting o evaluación de código dinámico.
desc.dataflow.scala.json_injection
Abstract
El método escribe una entrada sin validar en JSON. Esta llamada podría permitir a un usuario malintencionado inyectar atributos o elementos arbitrarios en la entidad JSON.
Explanation
La inyección JSON se produce cuando:

1. Los datos entran en un programa desde un origen que no es de confianza.


2. Los datos se escriben en una secuencia JSON.

Las aplicaciones suelen utilizar la secuencia JSON para almacenar datos o enviar mensajes. Cuando se utiliza para almacenar datos, JSON a menudo se trata como datos almacenados en la caché y pueden contener información probablemente confidencial. Cuando se utiliza para enviar mensajes, JSON a menudo se utiliza junto con un servicio RESTful y se puede utilizar para transmitir información confidencial como las credenciales de autenticación.

La semántica de los documentos y mensajes JSON se puede modificar si una aplicación construye JSON a partir de una entrada sin validar. En un caso relativamente benigno, un atacante puede ser capaz de insertar elementos extraños y hacer que una aplicación produzca una excepción mientras se está analizando un documento o una solicitud JSON. En un caso más grave, como uno que implique la inyección JSON, un atacante puede ser capaz de insertar elementos extraños que permitan la manipulación predecible de los valores críticos para el negocio dentro de un documento o una solicitud JSON. En algunos casos, la inyección JSON puede dar lugar a cross-site scripting o evaluación de código dinámico.

Ejemplo 1: El siguiente código Swift serializa la información de la autenticación de cuenta de usuario para usuarios sin privilegios (aquellos con un rol "predeterminado" a diferencia de los usuarios con un rol de "admin") a JSON de los campos controlables por el usuario usernameField y passwordField:


...
let jsonString : String = "{\"username\":\"\(usernameField.text)\",\"password\":\"\(passwordField.text)\",\"role\":\"default\"}"


Aún así, dado que la serialización de JSON se realiza mediante el uso de la interpolación de cadenas, los datos que no son de confianza en usernameField y passwordField no se validarán para omitir caracteres especiales relacionados con JSON. Esto permite a un usuario introducir claves JSON de forma arbitraria, posiblemente cambiando la estructura del JSON serializado. En este ejemplo, si el usuario sin privilegios mallory con la contraseña Evil123! fuese a agregar ","role":"admin a su nombre de usuario al introducirla en el campo usernameField, el JSON resultante sería:


{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}


Si esta cadena JSON serializada se fuese a deserializar en un objeto NSDictionary con NSJSONSerialization.JSONObjectWithData: de este modo:


var error: NSError?
var jsonData : NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonString.dataUsingEncoding(NSUTF8StringEncoding), options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary


Los valores resultantes para username, password y role en el objeto NSDictionary serían mallory, Evil123! y admin respectivamente. Sin más comprobaciones de que los valores JSON deserializados son válidos, la aplicación asignará de forma incorrecta privilegios de "admin" al usuario mallory.
desc.dataflow.swift.json_injection
Abstract
La aplicación realiza una consulta JSON con datos que no son de confianza y pueden permitir que usuarios malintencionados realicen consultas en partes inesperadas del documento JSON.
Explanation
"JSON Path" permite a los desarrolladores realizar consultas en documentos JSON de forma similar al modo en que XPath permite la consulta en documentos XML. Si los usuarios pueden elegir arbitrariamente la clave usada para ensamblar la consulta, podrán consultar partes diferentes e inesperadas del documento, lo que les otorgará acceso a datos privados y confidenciales.

Ejemplo 1: El código siguiente utiliza una palabra clave definida por el usuario para acceder a un documento JSON que contiene detalles de usuario públicos, como su nombre y dirección, pero también privados, como su contraseña.


def searchUserDetails(key:String) = Action.async { implicit request =>
val user_json = getUserDataFor(user)
val value = (user_json \ key).get.as[String]
...
}


Como key es controlable por el usuario, un atacante puede aprovecharse de esto para acceder a las contraseñas del usuario y cualquier otro dato privado que pueda contener el documento JSON.
desc.dataflow.scala.json_path_manipulation
Abstract
Una aplicación que realiza una búsqueda LDAP de devolución de objetos permitirá a los atacantes controlar la respuesta LDAP para ejecutar código arbitrario en el servidor.
Explanation
Un atacante capaz de manipular una respuesta LDAP, ya sea modificando la entrada en reposo o interceptando y modificando la respuesta sobre la marcha (ataque "man-in-the-middle") podrá inyectar atributos especiales de Java en la entrada LDAP. Al realizar una búsqueda de devolución de objetos, los atributos de Java se decodifican como objetos Java mediante la deserialización de Java o la eliminación de referencias de JNDI, lo que permite a los atacantes conseguir la ejecución remota de código en el servidor de aplicaciones que realiza la búsqueda.

La aplicación realiza una búsqueda de devolución de objetos estableciendo returningObjectFlag en true en la instancia de javax.naming.directory.SearchControls pasada al método search o mediante el uso de una función de biblioteca que establece esta marca en su nombre.

En este caso, la aplicación está utilizando el módulo de autorización de Spring Security LDAP que realiza búsquedas de devolución de objetos y, por lo tanto, es vulnerable a LDAP Entry Poisoning.

Ejemplo: El archivo de configuración de Beans siguiente configura la aplicación para utilizar el módulo LDAP de Spring Security como el proveedor de autenticación.


<beans ... >
<authentication-manager>
<ldap-authentication-provider
user-search-filter="(uid={0})"
user-search-base="ou=users,dc=example,dc=org"
group-search-filter="(uniqueMember={0})"
group-search-base="ou=groups,dc=example,dc=org"
group-role-attribute="cn"
role-prefix="ROLE_">
</ldap-authentication-provider>
</authentication-manager>
</beans>
References
[1] Introducing JNDI Injection and LDAP Entry Poisoning OpenText Fortify
[2] A Journey from JNDI/LDAP manipulation to remote code execution dream land BlackHat
desc.configuration.java.ldap_entry_poisoning
Abstract
La construcción de un filtro dinámico LDAP con entrada de usuario podría permitir a un atacante modificar el significado de la instrucción.
Explanation
Se producen errores de inyección de LDAP cuando:

1. Los datos entran en un programa desde un origen que no es de confianza.

En este caso, Fortify Static Code Analyzer no pudo determinar si el origen de los datos era de confianza.

2. Los datos se utilizan para construir un filtro LDAP de forma dinámica.
Ejemplo 1: El código siguiente construye y ejecuta de forma dinámica una consulta LDAP que recupera registros de todos los empleados bajo la supervisión de un determinado responsable. El nombre del administrador se lee desde una consulta HTTP y, por tanto, no es fiable.


...
DirectorySearcher src =
new DirectorySearcher("(manager=" + managerName.Text + ")");
src.SearchRoot = de;
src.SearchScope = SearchScope.Subtree;

foreach(SearchResult res in src.FindAll()) {
...
}


En circunstancias normales, como cuando se buscan empleados que estén bajo la supervisión del responsable John Smith, el filtro que ejecuta este código tendrá un aspecto como el siguiente:


(manager=Smith, John)


Sin embargo, como el filtro se construye de forma dinámica mediante la concatenación de una cadena de entrada de usuario y una cadena de consulta de base constante, la consulta solo se comporta correctamente si managerName no contiene metacaracteres LDAP. Si un usuario malintencionado introduce la cadena Hacker, Wiley)(|(objectclass=*) para managerName, entonces la consulta será de la siguiente forma:


(manager=Hacker, Wiley)(|(objectclass=*))


En función de los permisos con los que se ejecute la consulta, la adición de la condición |(objectclass=*) hace que el filtro busque coincidencias en todas las entradas del directorio y permite al atacante recuperar información acerca de todo el grupo de usuarios. En función de los permisos con los que se realice la consulta LDAP, la amplitud de este ataque puede quedar limitada. Sin embargo, si el atacante es capaz de controlar la estructura de comando de la consulta, un ataque puede afectar como mínimo a tantos registros como el usuario de la consulta LDAP que se ejecuta pueda acceder.
desc.semantic.dotnet.ldap_injection
Abstract
La construcción de un filtro dinámico LDAP con entrada de usuario podría permitir a un atacante modificar el significado de la instrucción.
Explanation
Se producen errores de inyección de LDAP cuando:

1. Los datos entran en un programa desde un origen que no es de confianza.

2. Los datos se utilizan para construir un filtro LDAP de forma dinámica.
Ejemplo 1: El código siguiente construye y ejecuta de forma dinámica una consulta LDAP que recupera registros de todos los empleados bajo la supervisión de un determinado responsable. El nombre del responsable se lee desde un socket de red y, por lo tanto, no es confiable.


fgets(manager, sizeof(manager), socket);

snprintf(filter, sizeof(filter, "(manager=%s)", manager);

if ( ( rc = ldap_search_ext_s( ld, FIND_DN, LDAP_SCOPE_BASE,
filter, NULL, 0, NULL, NULL, LDAP_NO_LIMIT,
LDAP_NO_LIMIT, &result ) ) == LDAP_SUCCESS ) {
...
}


En circunstancias normales, como cuando se buscan empleados que estén bajo la supervisión del responsable John Smith, el filtro que ejecuta este código tendrá un aspecto como el siguiente:


(manager=Smith, John)


Sin embargo, como el filtro se construye de forma dinámica mediante la concatenación de una cadena de entrada de usuario y una cadena de consulta de base constante, la consulta solo se comporta correctamente si manager no contiene metacaracteres LDAP. Si un usuario malintencionado introduce la cadena Hacker, Wiley)(|(objectclass=*) para manager, entonces la consulta será de la siguiente forma:


(manager=Hacker, Wiley)(|(objectclass=*))


En función de los permisos con los que se ejecute la consulta, la adición de la condición |(objectclass=*) hace que el filtro busque coincidencias en todas las entradas del directorio y permite al atacante recuperar información acerca de todo el grupo de usuarios. En función de los permisos con los que se realice la consulta LDAP, la amplitud de este ataque puede quedar limitada. Sin embargo, si el atacante es capaz de controlar la estructura de comando de la consulta, un ataque puede afectar como mínimo a tantos registros como el usuario de la consulta LDAP que se ejecuta pueda acceder.
desc.dataflow.cpp.ldap_injection
Abstract
La construcción de un filtro dinámico LDAP con entrada de usuario podría permitir a un atacante modificar el significado de la instrucción.
Explanation
Se producen errores de inyección de LDAP cuando:
1. Los datos entran en un programa desde un origen que no es de confianza.

2. Los datos se utilizan para construir un filtro LDAP de forma dinámica.
Ejemplo 1: El código siguiente construye y ejecuta de forma dinámica una consulta LDAP que recupera registros de todos los empleados bajo la supervisión de un determinado responsable. El nombre del administrador se lee desde una consulta HTTP y, por tanto, no es fiable.


...
DirContext ctx = new InitialDirContext(env);

String managerName = request.getParameter("managerName");

//retrieve all of the employees who report to a manager

String filter = "(manager=" + managerName + ")";

NamingEnumeration employees = ctx.search("ou=People,dc=example,dc=com",
filter);
...


En circunstancias normales, como cuando se buscan empleados que estén bajo la supervisión del responsable John Smith, el filtro que ejecuta este código tendrá un aspecto como el siguiente:


(manager=Smith, John)


Sin embargo, como el filtro se construye de forma dinámica mediante la concatenación de una cadena de entrada de usuario y una cadena de consulta de base constante, la consulta solo se comporta correctamente si managerName no contiene metacaracteres LDAP. Si un usuario malintencionado introduce la cadena Hacker, Wiley)(|(objectclass=*) para managerName, entonces la consulta será de la siguiente forma:


(manager=Hacker, Wiley)(|(objectclass=*))


En función de los permisos con los que se ejecute la consulta, la adición de la condición |(objectclass=*) hace que el filtro busque coincidencias en todas las entradas del directorio y permite al atacante recuperar información acerca de todo el grupo de usuarios. En función de los permisos con los que se realice la consulta LDAP, la amplitud de este ataque puede quedar limitada. Sin embargo, si el atacante es capaz de controlar la estructura de comando de la consulta, un ataque puede afectar como mínimo a tantos registros como el usuario de la consulta LDAP que se ejecuta pueda acceder.
desc.dataflow.java.ldap_injection
Abstract
La construcción de un filtro dinámico LDAP con entrada de usuario podría permitir a un atacante modificar el significado de la instrucción.
Explanation
Se producen errores de inyección de LDAP cuando:
1. Los datos entran en un programa desde un origen que no es de confianza.

2. Los datos se utilizan para construir un filtro LDAP de forma dinámica.
Ejemplo 1: El código siguiente construye y ejecuta de forma dinámica una consulta LDAP que recupera registros de todos los empleados bajo la supervisión de un determinado responsable. El nombre del administrador se lee desde una consulta HTTP y, por tanto, no es fiable.


...
$managerName = $_POST["managerName"]];

//retrieve all of the employees who report to a manager

$filter = "(manager=" . $managerName . ")";

$result = ldap_search($ds, "ou=People,dc=example,dc=com", $filter);
...


En circunstancias normales, como cuando se buscan empleados que estén bajo la supervisión del responsable John Smith, el filtro que ejecuta este código tendrá un aspecto como el siguiente:


(manager=Smith, John)


Sin embargo, como el filtro se construye de forma dinámica mediante la concatenación de una cadena de entrada de usuario y una cadena de consulta de base constante, la consulta solo se comporta correctamente si managerName no contiene metacaracteres LDAP. Si un usuario malintencionado introduce la cadena Hacker, Wiley)(|(objectclass=*) para managerName, entonces la consulta será de la siguiente forma:


(manager=Hacker, Wiley)(|(objectclass=*))


En función de los permisos con los que se ejecute la consulta, la adición de la condición |(objectclass=*) hace que el filtro busque coincidencias en todas las entradas del directorio y permite al atacante recuperar información acerca de todo el grupo de usuarios. En función de los permisos con los que se realice la consulta LDAP, la amplitud de este ataque puede quedar limitada. Sin embargo, si el atacante es capaz de controlar la estructura de comando de la consulta, un ataque puede afectar como mínimo a tantos registros como el usuario de la consulta LDAP que se ejecuta pueda acceder.
desc.dataflow.php.ldap_injection