
Критическая уязвимость типа use-after-free, обнаруженная в Tinyproxy
Мы требуем безопасного возвращения всех граждан, взятых в заложники террористической группировкой ХАМАС. Мы не успокоимся, пока каждый заложник не будет освобождён и не вернётся домой в безопасности. Вы можете помочь вернуть их домой. https://stories.bringthemhomenow.net/
🚨 Предупреждение о критической уязвимости 🚨
🔍 CVE-2023-49606 — это критическая уязвимость типа use-after-free, обнаруженная в Tinyproxy — легковесном HTTP/S прокси-сервере. Этот дефект присутствует при обработке HTTP-заголовков Connection в версиях Tinyproxy 1.11.1 и 1.10.0. Данная уязвимость допускает потенциальные атаки типа «отказ в обслуживании» (DoS) и при определённых обстоятельствах может привести к удалённому выполнению кода (RCE).
📈 Оценка CVSS: 9.8 (критическая)
Уязвимость возникает из-за некорректного управления памятью при обработке HTTP-заголовков. Исходный код в http-message.c выполняет операции с памятью для HTTP-заголовков, включая выделение, перераспределение и освобождение. Проблема, вероятно, возникает в контексте перераспределения памяти и последующего доступа к освобождённой памяти, которая не была корректно обнулена.
Вот фрагмент соответствующего кода из http-message.c:
/* Function to add headers to the HTTP message structure */
void http_message_add_headers(http_message_t *msg, const char **headers, unsigned int num_headers) {
const char **new_headers;
unsigned int i;
if (headers == NULL) {
return;
}
// Check if there is enough space, if not, reallocate
if (msg->headers.used + num_headers > msg->headers.total) {
new_headers = (const char **) safecalloc (msg->headers.total * 2, sizeof(char *));
if (new_headers == NULL) {
return; // Allocation failed, potential for use-after-free if not handled
}
// Copy existing headers to the new array
for (i = 0; i != msg->headers.used; ++i) {
new_headers[i] = msg->headers.strings[i];
}
safefree(msg->headers.strings); // Free old array
msg->headers.strings = new_headers; // Danger if old pointers are used post this point
msg->headers.total *= 2;
}
// Add new headers to the structure
for (i = 0; i != num_headers; ++i) {
msg->headers.strings[i + msg->headers.used] = headers[i];
}
msg->headers.used += num_headers;
}