
Kritische Heap-Pufferüberlauf-Schwachstelle in den Funktionen handle_trace_request und parse_trace_request des Fluent Bit HTTP-Servers.
Wir fordern die sichere Rückkehr aller Bürger, die von der terroristischen Gruppe Hamas als Geiseln genommen wurden. Wir werden nicht ruhen, bis alle Geiseln freigelassen und sicher nach Hause zurückgekehrt sind. Sie können helfen, sie nach Hause zu bringen. https://stories.bringthemhomenow.net/
Die Funktionen handle_trace_request und parse_trace_request in der HTTP-Server-Implementierung von Fluent Bit wurden als Quelle einer kritischen Sicherheitslücke identifiziert, CVE-2024-4323. Diese Schwachstelle entsteht durch unzureichende Grenzprüfung und Eingabevalidierung, was zu einem potenziellen Heap-Pufferüberlauf führt. Diese Überprüfung beleuchtet die Art der Schwachstelle, ihre potenziellen Auswirkungen und die notwendigen Schritte zu ihrer Behebung.
handle_trace_request-FunktionDiese Funktion verarbeitet eingehende HTTP-Trace-Anfragen, führt Pufferzuteilung durch und kopiert Anfragedaten.
Verwundbarer Code:
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;
}
parse_trace_request-FunktionDiese Funktion parst die Daten aus der Trace-Anfrage.
Verwundbarer Code:
void parse_trace_request(char *buffer, size_t size, struct mk_http_request *request)
{
if (size > MAX_SIZE) {
// Handle error
return;
}
// Parsing logic
}
Heap-Pufferüberlauf:
Pufferzuteilung und -kopieren: Die Funktion `handle_trace_request` verwendet direkt die Größe der eingehenden Anfragedaten, um einen Puffer zuzuteilen und Daten ohne ordnungsgemäße Validierung zu kopieren. Dies kann zu einem Heap-Pufferüberlauf führen, wenn die Größe den zugewiesenen Speicher überschreitet.
Fehlende Grenzprüfung: Die Funktion `parse_trace_request` führt eine rudimentäre Größenprüfung durch, stellt jedoch nicht sicher, dass die Puffergröße vor dem Parsen innerhalb sicherer Grenzen liegt.
Eingabevalidierung:
Unzureichende Eingabevalidierung: Die Funktionen validieren die eingehenden Anfragedaten nicht ausreichend, was sie anfällig für bösartige Nutzlasten macht, die den Pufferüberlauf ausnutzen sollen.
Denial-of-Service (DoS): Ein Angreifer kann eine Anfrage erstellen, die zum Absturz der Anwendung führt, indem er den Heap-Puffer überläuft, was zu einem Denial-of-Service führt.
Remote-Code-Ausführung (RCE): Im schlimmsten Fall könnte ein Angreifer den Überlauf ausnutzen, um beliebigen Code auf dem Server auszuführen und möglicherweise die Kontrolle über das System zu erlangen.
Vorgeschlagene Lösung
Der folgende Patch führt Grenzprüfung und Eingabevalidierung ein, um die Schwachstelle zu beheben:
#define MAX_ALLOWED_SIZE 1024 * 1024 // Define a reasonable maximum size
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) {
// Log error and return
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) {
// Handle error
return;
}
// Parsing logic
// ...
}
Grenzprüfung: Eine Prüfung wurde hinzugefügt, um sicherzustellen, dass die Größe der eingehenden Daten vor der Pufferzuteilung eine definierte maximale erlaubte Größe nicht überschreitet.
Eingabevalidierung: Es wurde sichergestellt, dass Eingabedaten validiert werden, um zu verhindern, dass übermäßig große oder fehlerhafte Anfragen einen Pufferüberlauf verursachen.
Die Schwachstelle in den Funktionen handle_trace_request und parse_trace_request ist ein kritisches Problem, das zu schwerwiegenden Sicherheitsrisiken führen kann, einschließlich Denial-of-Service und Remote-Code-Ausführung. Der vorgeschlagene Patch behebt diese Risiken effektiv durch die Einführung robuster Grenzprüfung und Eingabevalidierung. Es ist zwingend erforderlich, diesen Patch umgehend anzuwenden und regelmäßige Code-Audits durchzuführen, um die Sicherheit und Integrität der Fluent-Bit-Anwendung zu gewährleisten.