Reino: Time and State

La computación distribuida trata sobre el tiempo y el estado. Es decir, para que más de un componente se comunique, debe compartir el estado, y todo esto requiere tiempo.

La mayoría de programadores antropomorfizan su trabajo. Piensan en un único puesto de control que lleva a cabo todo el programa de igual forma que harían ellos si tuviesen que realizar la tarea ellos mismos. Sin embargo, los equipos modernos cambian entre tareas con gran rapidez y, en una CPU múltiple con varios núcleos, o en los sistemas distribuidos, dos eventos pueden llevarse a cabo a la vez exactamente. Estos defectos hacen que sea urgente que se unan posturas entre el modelo de los programadores sobre cómo un programa se ejecuta y lo que sucede en la realidad. Dichos defectos están relacionados con interacciones inesperadas entre los puestos, los procesos, el tiempo y la información. Estas interacciones se producen a través del estado compartido: semáforos, variables, el sistema de archivos y, básicamente, cualquier cosa que pueda guardar información.

Race Condition: Signal Handling

Abstract
Instalar el mismo identificador de señales para varias señales puede provocar una condición de carrera cuando se detectan diferentes señales en una corta sucesión.
Explanation
Las condiciones de carrera de los identificadores de señales pueden producirse siempre que una función instalada como identificador de señales no sea reentrante, es decir, mantiene parte del estado interno o llama otra función para que lo haga. Es incluso más probable que se produzcan dichas condiciones de carrera cuando la misma función se instala para identificar varias señales.

Es más probable que se produzcan las condiciones de carrera del identificador de señales cuando:

1. El programa instala un solo identificador de señales para más de una señal.

2. Dos señales diferentes para las que se ha instalado el identificador llegan en una corta sucesión, provocando una condición de carrera en el identificador de señales.

Ejemplo: el código siguiente instala el mismo identificador de señales simple y no reentrante para dos señales diferentes. Si un atacante hace que las señales se envíen en los momentos precisos, el identificador de señales experimentará una vulnerabilidad doble y libre. Al llamar a free() dos veces con el mismo valor, se puede producir un buffer overflow. Si un programa llama a free() dos veces con el mismo argumento, las estructuras de datos de administración de memoria del programa se dañan. Esto puede provocar que el programa se bloquee o, en algunas circunstancias, que se realicen dos llamadas posteriores a malloc() para devolver la misma referencia. Si malloc() devuelve el mismo valor dos veces y el programa concede posteriormente al usuario malintencionado control de los datos escritos en la memoria que se ha asignado dos veces, el programa será vulnerable a un ataque de buffer overflow.


void sh(int dummy) {
...
free(global2);
free(global1);
...
}

int main(int argc,char* argv[]) {
...
signal(SIGHUP,sh);
signal(SIGTERM,sh);
...
}
References
[1] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1.0
[2] Standards Mapping - CIS Microsoft Azure Foundations Benchmark partial
[3] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 2.0
[4] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 4
[5] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
[6] Standards Mapping - Common Weakness Enumeration CWE ID 362, CWE ID 364
[7] Standards Mapping - Common Weakness Enumeration Top 25 2022 [22] CWE ID 362
[8] Standards Mapping - Common Weakness Enumeration Top 25 2023 [21] CWE ID 362
[9] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-000366, CCI-003178
[10] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[11] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2012 Rule 21.5
[12] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C++ Guidelines 2008 Rule 18-7-1
[13] Standards Mapping - NIST Special Publication 800-53 Revision 4 CM-6 Configuration Settings (P1)
[14] Standards Mapping - NIST Special Publication 800-53 Revision 5 CM-6 Configuration Settings
[15] Standards Mapping - OWASP Top 10 2021 A04 Insecure Design
[16] Standards Mapping - OWASP Application Security Verification Standard 4.0 1.11.2 Business Logic Architectural Requirements (L2 L3)
[17] Standards Mapping - Payment Card Industry Data Security Standard Version 3.0 Requirement 6.5.6
[18] Standards Mapping - Payment Card Industry Data Security Standard Version 3.1 Requirement 6.5.6
[19] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2 Requirement 6.5.6
[20] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2.1 Requirement 6.5.6
[21] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
[22] Standards Mapping - Payment Card Industry Software Security Framework 1.0 Control Objective 4.2 - Critical Asset Protection
[23] Standards Mapping - Payment Card Industry Software Security Framework 1.1 Control Objective 4.2 - Critical Asset Protection, Control Objective B.3.3 - Terminal Software Attack Mitigation
[24] Standards Mapping - Payment Card Industry Software Security Framework 1.2 Control Objective 4.2 - Critical Asset Protection, Control Objective B.3.3 - Terminal Software Attack Mitigation
[25] Standards Mapping - SANS Top 25 2009 Insecure Interaction - CWE ID 362
[26] Standards Mapping - SANS Top 25 2010 Insecure Interaction - CWE ID 362
[27] Standards Mapping - Security Technical Implementation Guide Version 3.1 APP3630.1 CAT II
[28] Standards Mapping - Security Technical Implementation Guide Version 3.4 APP3630.1 CAT II
[29] Standards Mapping - Security Technical Implementation Guide Version 3.5 APP3630.1 CAT II
[30] Standards Mapping - Security Technical Implementation Guide Version 3.6 APP3630.1 CAT II
[31] Standards Mapping - Security Technical Implementation Guide Version 3.7 APP3630.1 CAT II
[32] Standards Mapping - Security Technical Implementation Guide Version 3.9 APP3630.1 CAT II
[33] Standards Mapping - Security Technical Implementation Guide Version 3.10 APP3630.1 CAT II
[34] Standards Mapping - Security Technical Implementation Guide Version 4.1 APSC-DV-001995 CAT II
[35] Standards Mapping - Security Technical Implementation Guide Version 4.2 APSC-DV-001995 CAT II
[36] Standards Mapping - Security Technical Implementation Guide Version 4.3 APSC-DV-001995 CAT II
[37] Standards Mapping - Security Technical Implementation Guide Version 4.4 APSC-DV-001995 CAT II
[38] Standards Mapping - Security Technical Implementation Guide Version 4.5 APSC-DV-001995 CAT II
[39] Standards Mapping - Security Technical Implementation Guide Version 4.6 APSC-DV-001995 CAT II
[40] Standards Mapping - Security Technical Implementation Guide Version 4.7 APSC-DV-001995 CAT II
[41] Standards Mapping - Security Technical Implementation Guide Version 4.8 APSC-DV-001995 CAT II
[42] Standards Mapping - Security Technical Implementation Guide Version 4.9 APSC-DV-001995 CAT II
[43] Standards Mapping - Security Technical Implementation Guide Version 4.10 APSC-DV-001995 CAT II
[44] Standards Mapping - Security Technical Implementation Guide Version 4.11 APSC-DV-001995 CAT II
[45] Standards Mapping - Security Technical Implementation Guide Version 5.1 APSC-DV-001995 CAT II
[46] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-001995 CAT II
[47] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-001995 CAT II
desc.structural.cpp.race_condition_signal_handling