
Fluent Bit HTTP 서버의 handle_trace_request 및 parse_trace_request 함수에서 발생하는 치명적인 힙 버퍼 오버플로 취약점.
우리는 테러 단체 하마스에 의해 인질로 잡힌 모든 시민의 안전한 귀환을 요구합니다. 모든 인질이 석방되어 안전하게 집으로 돌아올 때까지 우리는 쉬지 않을 것입니다. 여러분이 그들을 집으로 데려오는 데 도움을 줄 수 있습니다. https://stories.bringthemhomenow.net/
Fluent Bit의 HTTP 서버 구현에 있는 handle_trace_request 및 parse_trace_request 함수가 심각한 취약점인 CVE-2024-4323의 원인으로 확인되었습니다. 이 취약점은 불충분한 경계 검사와 입력 검증으로 인해 발생하며, 잠재적인 힙 버퍼 오버플로로 이어집니다. 본 리뷰에서는 취약점의 성격, 잠재적 영향, 그리고 이를 완화하기 위한 필요한 조치를 강조합니다.
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 // 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
// ...
}
경계 검사: 버퍼를 할당하기 전에 들어오는 데이터의 크기가 정의된 최대 허용 크기를 초과하지 않는지 확인하는 검사를 추가했습니다.
입력 검증: 비정상적으로 크거나 잘못된 형식의 요청이 버퍼 오버플로를 유발하지 않도록 입력 데이터가 검증되도록 보장했습니다.
handle_trace_request 및 parse_trace_request 함수의 취약점은 서비스 거부 및 원격 코드 실행을 포함한 심각한 보안 위험을 초래할 수 있는 중요한 문제입니다. 제안된 패치는 강력한 경계 검사와 입력 검증을 도입하여 이러한 위험을 효과적으로 완화합니다. 이 패치를 신속히 적용하고 정기적인 코드 감사를 수행하여 Fluent Bit 애플리케이션의 보안과 무결성을 보장하는 것이 중요합니다.