[하루한줄] CVE-2024-4323: Fluent Bit의 Memory Corruption으로 인한 DoS 취약점
URL
https://github.com/d0rb/CVE-2024-4323
Target
- Fluent Bit 2.0.7 ~ 3.0.3
Explain
클라우드 환경에서 로깅을 담당하는 Fluent Bit 유틸리티에서 서비스 거부(DoS) 취약점이 발견되었습니다.
취약점은 Fluent Bit의 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;
}
handle_trace_request
함수는 사용자 데이터 크기 값을 size
변수에 할당하고, 이를 기반으로 버퍼를 할당합니다.
사용자 데이터 크기 값에 대한 검증이 없기 때문에, 매우 큰 값이 전달될 경우 malloc(size)
호출이 실패해 NULL
을 반환하게 됩니다.
따라서, 공격자는 반복적으로 큰 값을 전달할 경우, 시스템 자원 낭비 및 DoS가 트리거 됩니다.
#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
// ...
}
해당 취약점은 MAX_ALLOWED_SIZE
매크로를 통해 사용자 데이터 크기 값을 검증하는 코드가 추가되어 패치되었습니다.
Reference
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.