
CVE-2024-23692 | HFS 2.3m/2.4-RC07 исправление уязвимости RCE
Вы можете использовать HFS (HTTP File Server) для отправки и получения файлов. Он отличается от классического обмена файлами тем, что использует веб-технологии. А от классических веб-серверов он отличается тем, что очень прост в использовании и работает «прямо из коробки».
Виртуальная файловая система позволит вам легко поделиться даже одним-единственным файлом.
| Поле | Значение |
|---|---|
| Идентификатор CVE | CVE-2024-23692 |
| Затронутые версии | HFS 2.3m, HFS 2.4.0 RC07 и ниже |
| Тип уязвимости | Неаутентифицированное удалённое выполнение кода (Unauthenticated RCE) |
| Оценка CVSS | 9.8 Critical |
| Вектор атаки | Доступен по сети, не требует аутентификации и взаимодействия с пользователем |
Шаблонный движок HFS при обработке макроса {.?search.} (считывающего параметры URL-запроса) рекурсивно вызывает applyMacrosAndSymbols2() для возвращаемого значения, из-за чего управляемая пользователем строка выполняется как код шаблона.
Цепочка атаки состоит из четырёх шагов:
1. 构造包含 %url% 的 search 参数
↓
2. %url% 展开为 macroQuote(完整URL) = {:url_including_payload:}
↓
3. %password% 展开为空字符串,导致 {:...:} 引用块提前关闭
↓
4. 引用块外的 {.exec|cmd.} 被宏引擎执行 → RCE
Пример POC (только для исследований безопасности):
GET /?n=%0A&cmd=whoami&search=%25xxx%25url%25:%password%}{.exec|{.?cmd.}|timeout=15|out=abc.}{.?n.}{.?n.}RESULT:{.?n.}{.^abc.}===={.?n.} HTTP/1.1
Исправляемый файл: scriptLib.pas
Ключевая функция: noMacrosAllowed() (строки 109–123)
function noMacrosAllowed(s:string):string;
// prevent hack attempts
begin
// 步骤 1:将所有宏标记的首字符替换为 HTML 实体
// {. → {. .} → .}
// {: → {: :} → :}
// | → |
repeat
i := findMacroMarker(s, i);
if i = 0 then break;
replace(s, '&#' + intToStr(charToUnicode(s[i])) + ';', i, i);
until false;
// 步骤 2:将 %symbol% 形式的符号引用替换为 HTML 实体
// %url% → %url%
// %password% → %password%
s := reReplace(s, '%([-a-z0-9]+)%', '%$1%', 'mi');
result := s;
end;
Места вызова: все пользовательские данные проходят через эту функцию перед возвратом в шаблонный движок:
Результат исправления: после обработки параметра search из POC все макросы и ссылки на символы превращаются в HTML-сущности и больше не могут запустить макро-движок.
Изначально разработан в 2002 году на Delphi 6, сейчас используется Delphi 10.3.3 (Community Edition). Иконки генерируются на http://fontello.com/ . Используйте fontello.json для дальнейших изменений.
Для шаблона по умолчанию мы ориентируемся на совместимость с Chrome 49, поскольку это последняя версия, работающая на Windows XP.
| Место вызова | Область защиты |
|---|
urlVar(), строка 548 | Все URL-параметры запроса {.?name.} |
| Строка 698 | Чтение переменных шаблона |
| Строка 1549 | Значения Cookie |
| Строка 2089 | Декодированные URL-значения |
| Строка 2165 | Заголовки HTTP-запросов |
| Строка 2173 | Параметры POST-форм |