
Vulnerabilidad crítica de desbordamiento de búfer de montón en las funciones handle_trace_request y parse_trace_request del servidor HTTP de Fluent Bit.
Exigimos el regreso seguro de todos los ciudadanos que han sido tomados como rehenes por el grupo terrorista Hamás. No descansaremos hasta que cada rehén sea liberado y regrese a casa sano y salvo. Puedes ayudar a traerlos de vuelta. https://stories.bringthemhomenow.net/
Las funciones handle_trace_request y parse_trace_request en la implementación del servidor HTTP de Fluent Bit han sido identificadas como la fuente de una vulnerabilidad crítica, CVE-2024-4323. Esta vulnerabilidad surge debido a una verificación insuficiente de límites y validación de entrada, lo que provoca un posible desbordamiento de búfer en el heap. Esta revisión destaca la naturaleza de la vulnerabilidad, su posible impacto y los pasos necesarios para mitigarla.
handle_trace_requestEsta función maneja las solicitudes HTTP entrantes de tipo trace, realizando la asignación de búfer y la copia de los datos de la solicitud.
Código vulnerable:
static int handle_trace_request(struct flb_hs *hs, struct mk_http_session *session, struct mk_http_request *request)
{
char *buffer;
size_t size;
int ret;
flb_sds_t input_name;
input_name = get_input_name(request);
if (input_name == NULL) {
return -1;
}
size = request->data.len;
buffer = malloc(size);
if (!buffer) {
flb_sds_destroy(input_name);
return -1;
}
memcpy(buffer, request->data.data, size);
ret = parse_trace_request(buffer, size, request);
free(buffer);
flb_sds_destroy(input_name);
return ret;
}
Esta función analiza los datos de la solicitud de trace.
Código vulnerable:
void parse_trace_request(char *buffer, size_t size, struct mk_http_request *request)
{
if (size > MAX_SIZE) {
// Manejar error
return;
}
// Lógica de análisis
}
Desbordamiento de búfer en el heap:
Asignación y copia de búfer: La función handle_trace_request utiliza directamente el tamaño de los datos de la solicitud entrante para asignar un búfer y copiar los datos sin una validación adecuada. Esto puede provocar un desbordamiento de búfer en el heap si el tamaño excede la memoria asignada.
Falta de verificación de límites: La función parse_trace_request realiza una verificación rudimentaria del tamaño, pero no asegura que el tamaño del búfer esté dentro de límites seguros antes de analizar.
Validación de entrada:
Validación de entrada insuficiente: Las funciones no validan suficientemente los datos de la solicitud entrante, lo que las hace susceptibles a cargas maliciosas diseñadas para explotar el desbordamiento de búfer.
Denegación de servicio (DoS): Un atacante puede elaborar una solicitud que provoque el bloqueo de la aplicación al desbordar el búfer del heap, lo que lleva a una denegación de servicio.
Ejecución remota de código (RCE): En el peor de los casos, un atacante podría explotar el desbordamiento para ejecutar código arbitrario en el servidor, obteniendo potencialmente el control del sistema.
Corrección sugerida
El siguiente parche introduce la verificación de límites y la validación de entrada para mitigar la vulnerabilidad:
#define MAX_ALLOWED_SIZE 1024 * 1024 // Definir un tamaño máximo razonable
static int handle_trace_request(struct flb_hs *hs, struct mk_http_session *session, struct mk_http_request *request)
{
char *buffer;
size_t size;
int ret;
flb_sds_t input_name;
input_name = get_input_name(request);
if (input_name == NULL) {
return -1;
}
size = request->data.len;
if (size > MAX_ALLOWED_SIZE) {
// Registrar error y retornar
flb_sds_destroy(input_name);
return -1;
}
buffer = malloc(size);
if (!buffer) {
flb_sds_destroy(input_name);
return -1;
}
memcpy(buffer, request->data.data, size);
ret = parse_trace_request(buffer, size, request);
free(buffer);
flb_sds_destroy(input_name);
return ret;
}
void parse_trace_request(char *buffer, size_t size, struct mk_http_request *request)
{
if (size > MAX_ALLOWED_SIZE) {
// Manejar error
return;
}
// Lógica de análisis
// ...
}
Verificación de límites: Se agregó una comprobación para asegurar que el tamaño de los datos entrantes no exceda un tamaño máximo permitido definido antes de asignar el búfer.
Validación de entrada: Se garantizó que los datos de entrada sean validados para evitar que solicitudes de tamaño excesivo o malformadas provoquen un desbordamiento de búfer.
La vulnerabilidad en las funciones handle_trace_request y parse_trace_request es un problema crítico que puede conllevar graves riesgos de seguridad, incluyendo denegación de servicio y ejecución remota de código. El parche propuesto mitiga eficazmente estos riesgos al introducir una verificación de límites y validación de entrada robustas. Es imperativo aplicar este parche de inmediato y realizar auditorías de código periódicas para garantizar la seguridad e integridad de la aplicación Fluent Bit.