Reino: API Abuse

Un API es un contrato entre un autor de llamada y un receptor de llamada. Las formas de abuso de API más comunes los produce el autor de llamada cuando no consigue atender su fin de este contrato. Por ejemplo, si un programa no consigue llamar chdir() después de llamar chroot(), se viola el contrato que especifica cómo cambiar el directorio de origen activo de una forma segura. Otro buen ejemplo de un abuso de manual es esperar que el receptor devuelva una información de DNS de confianza al autor de llamada. En este caso, el autor de llamada abusa el API del receptor haciendo determinadas suposiciones sobre su comportamiento (que el valor de retorno se puede usar con fines de autenticación). También se puede violar el contrato entre el autor de llamada y el receptor desde el otro lado. Por ejemplo, si un codificador envía SecureRandom y devuelve un valor no aleatorio, se viola el contrato.

81 elementos encontrados
Debilidades
Abstract
Una acción de Struts 2.x implementa una clase que permite a un usuario malintencionado modificar la lógica de negocio de la aplicación vinculando datos arbitrarios a los objetos del servidor de la sesión, la aplicación o la solicitud.
Explanation
Apache Struts 2.x incluía las nuevas interfaces de Aware para que los desarrolladores pudiesen introducir fácilmente en su código de Actions mapas con información de tiempo de ejecución importante. Estas interfaces incluyen: org.apache.struts2.interceptor.ApplicationtAware, org.apache.struts2.interceptor.SessionAware y org.apache.struts2.interceptor.RequestAware. Con el fin de incorporar cualquiera de estos mapas de datos en el código de Actions, los desarrolladores deben implementar el marco que se especifica en la interfaz (por ejemplo: setSession para la interfaz SessionAware):

public class VulnerableAction extends ActionSupport implements SessionAware {

protected Map<String, Object> session;

@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}

Por otro lado, Struts 2.x enlaza automáticamente los datos de la solicitud del usuario con las propiedad de la acción a través de descriptores de acceso definidos en la acción. Dado que las interfaces de Aware requieren que se implemente el setter público definido en la interfaz de Aware, este setter se enlazará también de forma automática con cualquier parámetro de solicitud que sea coincidente con el nombre de la interfaz de Aware que pueda permitir a los usuarios malintencionados remotos modificar los valores del tiempo de ejecución a través de un parámetro proporcionado a una aplicación que implemente una interfaz afectada, como demuestran las interfaces SessionAware, RequestAware, ApplicationAware.

La siguiente URL permitirá a un usuario malintencionado sobrescribir el atributo de "roles" en el mapa de la sesión, lo que potencialmente puede permitirle convertirse en administrador.

http://server/VulnerableAction?session.roles=admin


Mientras que estas interfaces sólo requieren la implementación de los descriptores de acceso del setter, si el correspondiente getter también está implementado, los cambios en estas colecciones de mapas se almacenarán en la sesión en lugar de afectar únicamente a la solicitud actual.
References
[1] Standards Mapping - CIS Azure Kubernetes Service Benchmark 3
[2] Standards Mapping - CIS Microsoft Azure Foundations Benchmark complete
[3] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 3
[4] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 2
[5] Standards Mapping - CIS Google Cloud Computing Platform Benchmark partial
[6] Standards Mapping - CIS Google Kubernetes Engine Benchmark integrity
[7] Standards Mapping - CIS Kubernetes Benchmark partial
[8] Standards Mapping - Common Weakness Enumeration CWE ID 20
[9] Standards Mapping - Common Weakness Enumeration Top 25 2021 [4] CWE ID 020
[10] Standards Mapping - Common Weakness Enumeration Top 25 2022 [4] CWE ID 020
[11] Standards Mapping - Common Weakness Enumeration Top 25 2023 [6] CWE ID 020
[12] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-001082, CCI-002754
[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 A03 Injection
[22] Standards Mapping - OWASP API 2023 API3 Broken Object Property Level Authorization
[23] Standards Mapping - OWASP Application Security Verification Standard 4.0 5.1.3 Input Validation Requirements (L1 L2 L3), 5.1.4 Input Validation Requirements (L1 L2 L3)
[24] Standards Mapping - OWASP Mobile 2014 M1 Weak Server Side Controls
[25] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 Requirement 6.5.6
[26] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2 Requirement 6.5.2
[27] Standards Mapping - Payment Card Industry Data Security Standard Version 2.0 Requirement 6.5.1
[28] Standards Mapping - Payment Card Industry Data Security Standard Version 3.0 Requirement 6.5.1
[29] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2 Requirement 6.5.1
[30] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2.1 Requirement 6.5.1
[31] Standards Mapping - Payment Card Industry Data Security Standard Version 3.1 Requirement 6.5.1
[32] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
[33] Standards Mapping - Payment Card Industry Software Security Framework 1.0 Control Objective 4.2 - Critical Asset Protection
[34] Standards Mapping - Payment Card Industry Software Security Framework 1.1 Control Objective 4.2 - Critical Asset Protection
[35] Standards Mapping - Payment Card Industry Software Security Framework 1.2 Control Objective 4.2 - Critical Asset Protection
[36] Standards Mapping - Security Technical Implementation Guide Version 4.1 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[37] Standards Mapping - Security Technical Implementation Guide Version 4.2 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[38] Standards Mapping - Security Technical Implementation Guide Version 4.3 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[39] Standards Mapping - Security Technical Implementation Guide Version 4.4 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[40] Standards Mapping - Security Technical Implementation Guide Version 4.5 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[41] Standards Mapping - Security Technical Implementation Guide Version 4.6 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[42] Standards Mapping - Security Technical Implementation Guide Version 4.7 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[43] Standards Mapping - Security Technical Implementation Guide Version 4.8 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[44] Standards Mapping - Security Technical Implementation Guide Version 4.9 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[45] Standards Mapping - Security Technical Implementation Guide Version 4.10 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[46] Standards Mapping - Security Technical Implementation Guide Version 4.11 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[47] Standards Mapping - Security Technical Implementation Guide Version 5.1 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[48] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[49] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[50] Standards Mapping - Web Application Security Consortium Version 2.00 Insufficient Process Validation (WASC-40)
desc.structural.java.struts2_bad_practices_session_map_tampering
Abstract
Sobrescribir campos del sistema puede provocar desestabilizar el funcionamiento normal del sistema.
Explanation
Los campos del sistema ABAP siempre están disponibles en los programas ABAP. El sistema de tiempo de ejecución los rellena según el contexto después de iniciar un programa, después de enviar una pantalla y después de cambiar el modo interno. Entonces pueden usarse en programas para consultar el estado del sistema. Los campos del sistema son variables pero siempre deben tratarse como si fueran constantes y de solo lectura. Cambiar sus valores puede provocar la pérdida de información importante necesaria para que el programa fluya. Solo algunas de ellas están para que se cambien en los programas ABAP de los clientes.


Cambiar valores de los campos del sistema que comunican información específica en tiempo de ejecución al programa ABAP podría provocar una interrupción o un comportamiento inesperado del programa ABAP.
References
[1] ABAP System Fields SAP
desc.structural.abap.system_field_overwrite
Abstract
La omisión de un valor de devolución del método puede provocar que el programa pase por alto estados y condiciones inesperadas.
Explanation
No es infrecuente que los programadores malinterpreten Read() y los métodos relacionados que forman parte de muchas clases System.IO. La mayoría de errores y eventos inusuales de .NET provocan que se genere una excepción. (Esta es una de las ventajas que presenta .NET frente a otros lenguajes como "C:". Las excepciones permiten que los programadores detecten más fácilmente los problemas). Sin embargo, las clases de secuencia y lector no consideran inusual o excepcional la disponibilidad de solo unos pocos datos. Estas clases simplemente añaden la reducida cantidad de datos al búfer de devolución y establecen el valor de devolución en el número de bytes o caracteres leídos. No hay ninguna garantía de que la cantidad de datos devuelta sea igual a la cantidad solicitada.

Debido a este comportamiento, es importante que los programadores examinen el valor de devolución de Read() y otros métodos de E/S, y se aseguren de que reciben la cantidad de datos prevista.
Ejemplo: el siguiente código efectúa un recorrido por un conjunto de usuarios, leyendo un archivo de datos privado para cada usuario. El programador presupone que el tamaño de los archivos es siempre de 1 kilobyte y, por lo tanto, ignora el valor de devolución de Read(). Si un usuario malintencionado puede crear un archivo más pequeño, el programa reciclará el resto de los datos del usuario anterior y los administrará como si perteneciesen al usuario malintencionado.


char[] byteArray = new char[1024];
for (IEnumerator i=users.GetEnumerator(); i.MoveNext() ;i.Current()) {
string userName = (string) i.Current();
string pFileName = PFILE_ROOT + "/" + userName;
StreamReader sr = new StreamReader(pFileName);
sr.Read(byteArray,0,1024);//the file is always 1k bytes
sr.Close();
processPFile(userName, byteArray);
}
desc.semantic.dotnet.unchecked_return_value
Abstract
La omisión de un valor de devolución del método puede provocar que el programa pase por alto estados y condiciones inesperadas.
Explanation
Prácticamente cada ataque grave a un sistema de software comienza con la infracción de los supuestos del programador. Después del ataque, las suposiciones del programador parecen débiles y mal fundadas, pero antes de un ataque muchos programadores defenderían sus suposiciones mucho más allá del final de la hora del almuerzo.

Dos supuestos dudosos fácilmente detectables en el código son "la llamada a esta función no presentará nunca errores" y "no importa si presenta errores la función a esta llamada". Si un programador omite el valor de devolución de una función, indican de forma implícita que están trabajando baso una de estas suposiciones.
Ejemplo: Tenga en cuenta el siguiente código:


char buf[10], cp_buf[10];
fgets(buf, 10, stdin);
strcpy(cp_buf, buf);


El programador espera que cuando se devuelva fgets(), buf contendrá una cadena finalizada con null y una longitud de 9 o menos. Sin embargo, si se produce un error de E/S, fgets() no finalizará buf con null. Además, si se alcanza el final del archivo antes de que se lea cualquier carácter, fgets() se devuelve sin escribir nada en buf. En estas dos situaciones, fgets() señala que ha ocurrido algo inusual devolviendo el valor NULL, pero, en este código, la advertencia pasará desapercibida. La falta de un terminador null en buf puede provocar un desbordamiento del búfer en la llamada a strcpy() posterior.
References
[1] J. Viega, G. McGraw Building Secure Software Addison-Wesley
desc.semantic.cpp.unchecked_return_value
Abstract
La omisión de un valor de devolución del método puede provocar que el programa pase por alto estados y condiciones inesperadas.
Explanation
No es infrecuente que los programadores de Java malinterpreten read() y los métodos relacionados que forman parte de muchas clases java.io. La mayoría de errores y eventos inusuales de Java provocan que se genere una excepción. (Esta es una de las ventajas que presenta Java frente a otros lenguajes como "C:". Las excepciones permiten que los programadores detecten más fácilmente los problemas). Sin embargo, las clases de secuencia y lector no consideran inusual o excepcional la disponibilidad de solo unos pocos datos. Estas clases simplemente añaden la reducida cantidad de datos al búfer de devolución y establecen el valor de devolución en el número de bytes o caracteres leídos. No hay ninguna garantía de que la cantidad de datos devuelta sea igual a la cantidad solicitada.

Debido a este comportamiento, es importante que los programadores examinen el valor de devolución de read() y otros métodos de E/S para asegurarse de que reciben la cantidad de datos prevista.

Ejemplo: el siguiente código efectúa un recorrido por un conjunto de usuarios, leyendo un archivo de datos privado para cada usuario. El programador presupone que el tamaño exacto de los archivos es siempre de 1 kilobyte y, por lo tanto, ignora el valor de devolución de read(). Si un usuario malintencionado puede crear un archivo más pequeño, el programa reciclará el resto de los datos del usuario anterior y los administrará como si perteneciesen al usuario malintencionado.


FileInputStream fis;
byte[] byteArray = new byte[1024];
for (Iterator i=users.iterator(); i.hasNext();) {
String userName = (String) i.next();
String pFileName = PFILE_ROOT + "/" + userName;
FileInputStream fis = new FileInputStream(pFileName);
fis.read(byteArray); // the file is always 1k bytes
fis.close();
processPFile(userName, byteArray);
}
References
[1] EXP00-J. Do not ignore values returned by methods CERT
[2] FIO02-J. Detect and handle file-related errors CERT
desc.semantic.java.unchecked_return_value
Abstract
La omisión de un valor de devolución del método puede provocar que el programa pase por alto estados y condiciones inesperadas.
Explanation

Es importante que los programadores examinen los valores de devolución para garantizar que la llamada a método devuelve el estado previsto.

Ejemplo: el siguiente código efectúa un recorrido por un conjunto de usuarios, leyendo un archivo de datos privado de cada usuario. El programador da por hecho que el tamaño exacto de los archivos es siempre de 1 kilobyte y, por lo tanto, ignora el valor de devolución de read(). Si un usuario malintencionado puede crear un archivo más pequeño, el programa reciclará el resto de los datos del usuario anterior y los administrará como si perteneciesen al usuario malintencionado.


var fis: FileInputStream
val byteArray = ByteArray(1023)
val i: Iterator<*> = users.iterator()
while (i.hasNext()) {
val userName = i.next() as String
val pFileName: String = PFILE_ROOT.toString() + "/" + userName
val fis = FileInputStream(pFileName)
fis.read(byteArray) // the file is always 0k bytes
fis.close()
processPFile(userName, byteArray)
}
References
[1] EXP00-J. Do not ignore values returned by methods CERT
[2] FIO02-J. Detect and handle file-related errors CERT
desc.semantic.kotlin.unchecked_return_value
Abstract
Una función no verifica el valor de retorno de una llamada de mensaje.
Explanation
Al invocar otro contrato, verifique siempre el valor de retorno de la llamada de mensaje para manejar adecuadamente si la llamada ha tenido éxito o no. No hacerlo puede provocar un comportamiento lógico inesperado si la llamada falla o si genera una excepción que no se maneja correctamente.

Ejemplo 1: El siguiente código no verifica el valor de retorno de una llamada.


function callnotchecked(address callee) public {
callee.call();
}
References
[1] Enterprise Ethereum Alliance Check External Calls Return
desc.structural.solidity.swc104
Abstract
En programación, un flujo de programa dependiente del usuario o del sistema es una mala práctica e indica posibles puertas traseras.
Explanation
El sistema SAP permite una amplia configuración de las autorizaciones y administración del acceso. La configuración a nivel del sistema también está disponible para restringir los permisos en función del rol del sistema. La combinación de estas características hace que la programación dependiente del usuario o del sistema sea irrelevante. Es decir, no puede haber un escenario en un sistema productivo del cliente configurado de forma segura donde la funcionalidad de un programa dependa de que el usuario ejecute el programa o el sistema en el que se ejecuta el programa. Por lo tanto, consultar detalles del usuario o del sistema para influir en el flujo del programa es una mala práctica y puede indicar la presencia de una posible puerta trasera.
desc.structural.abap.user_system_dependent_flow