[하루한줄] 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