
ثغرة حرجة في تجاوز سعة المخزن المؤقت في الكومة (heap buffer overflow) في وظيفتي 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. تنشأ هذه الثغرة بسبب عدم كفاية فحص الحدود والتحقق من الإدخال، مما يؤدي إلى فيضان محتمل في المخزن المؤقت في الكومة. يسلط هذا الاستعراض الضوء على طبيعة الثغرة، وتأثيرها المحتمل، والخطوات اللازمة للتخفيف من حدتها.
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.