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
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);
...
}