
Критическая уязвимость переполнения буфера в куче в функциях handle_trace_request и parse_trace_request HTTP-сервера Fluent Bit.
Мы требуем безопасного возвращения всех граждан, взятых в заложники террористической группировкой ХАМАС. Мы не успокоимся, пока каждый заложник не будет освобождён и не вернётся домой в безопасности. Вы можете помочь вернуть их домой. https://stories.bringthemhomenow.net/
Функции handle_trace_request и parse_trace_request в реализации HTTP-сервера Fluent Bit были идентифицированы как источник критической уязвимости CVE-2024-4323. Эта уязвимость возникает из-за недостаточной проверки границ и валидации входных данных, что приводит к потенциальному переполнению буфера в куче. Данный обзор highlights характер уязвимости, её потенциальное влияние и необходимые шаги для её устранения.
handle_trace_requestЭта функция обрабатывает входящие HTTP-запросы трассировки, выполняя выделение буфера и копирование данных запроса.
Уязвимый код:
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Эта функция разбирает данные из запроса трассировки.
Уязвимый код:
void parse_trace_request(char *buffer, size_t size, struct mk_http_request *request)
{
if (size > MAX_SIZE) {
// Handle error
return;
}
// Parsing logic
}
Переполнение буфера в куче:
Выделение и копирование буфера: Функция `handle_trace_request` напрямую использует размер входящих данных запроса для выделения буфера и копирования данных без надлежащей проверки. Это может привести к переполнению буфера в куче, если размер превышает выделенную память.
Отсутствие проверки границ: Функция `parse_trace_request` выполняет элементарную проверку размера, но не гарантирует, что размер буфера находится в безопасных пределах перед разбором.
Валидация входных данных:
Недостаточная валидация входных данных: Функции не проверяют должным образом входящие данные запроса, что делает их уязвимыми для вредоносных нагрузок, предназначенных для эксплуатации переполнения буфера.
Отказ в обслуживании (DoS): Злоумышленник может создать запрос, который вызывает сбой приложения из-за переполнения буфера в куче, что приводит к отказу в обслуживании.
Удаленное выполнение кода (RCE): В худшем случае злоумышленник может использовать переполнение для выполнения произвольного кода на сервере, потенциально получая контроль над системой.
Предлагаемое исправление
Следующий патч вводит проверку границ и валидацию входных данных для устранения уязвимости:
#define MAX_ALLOWED_SIZE 1024 * 1024 // Определить разумный максимальный размер
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
// ...
}
Проверка границ: Добавлена проверка, чтобы убедиться, что размер входящих данных не превышает заданный максимально допустимый размер перед выделением буфера.
Валидация входных данных: Обеспечена валидация входных данных для предотвращения переполнения буфера из-за чрезмерно больших или некорректных запросов.
Уязвимость в функциях handle_trace_request и parse_trace_request является критической проблемой, которая может привести к серьезным рискам безопасности, включая отказ в обслуживании и удаленное выполнение кода. Предлагаемый патч эффективно снижает эти риски за счет введения надежной проверки границ и валидации входных данных. Необходимо незамедлительно применить этот патч и регулярно проводить аудит кода для обеспечения безопасности и целостности приложения Fluent Bit.