
CVE-2024-23692 | Fix della vulnerabilità RCE in HFS 2.3m/2.4-RC07
You can use HFS (HTTP File Server) to send and receive files. It's different from classic file sharing because it uses web technology. It also differs from classic web servers because it's very easy to use and runs "right out-of-the box".
The virtual file system will allow you to easily share even one single file.
| Campo | Valore |
|---|
| ID CVE | CVE-2024-23692 |
| Versioni interessate | HFS 2.3m, HFS 2.4.0 RC07 e versioni precedenti |
| Tipo di vulnerabilità | Esecuzione remota di codice non autenticata (Unauthenticated RCE) |
| Punteggio CVSS | 9.8 Critical |
| Vettore d'attacco | Raggiungibile via rete, nessuna autenticazione richiesta, nessuna interazione con l'utente |
Il motore di template di HFS, durante l'elaborazione della macro {.?search.} (che legge i parametri della query URL), chiama ricorsivamente applyMacrosAndSymbols2() sul valore restituito, causando l'esecuzione della stringa controllata dall'utente come codice di template.
La catena di attacco si articola in quattro passaggi:
1. 构造包含 %url% 的 search 参数
↓
2. %url% 展开为 macroQuote(完整URL) = {:url_including_payload:}
↓
3. %password% 展开为空字符串,导致 {:...:} 引用块提前关闭
↓
4. 引用块外的 {.exec|cmd.} 被宏引擎执行 → RCE
Esempio di POC (solo per ricerca di sicurezza):
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
File corretto: scriptLib.pas
Funzione principale: noMacrosAllowed() (righe 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;
Punti di chiamata: tutti gli input controllati dall'utente vengono elaborati da questa funzione prima di essere restituiti al motore di template:
| Punto di chiamata | Ambito di protezione |
|---|---|
urlVar() riga 548 | Tutti i parametri della query URL {.?name.} |
| Riga 698 | Lettura delle variabili di template |
| Riga 1549 | Valori dei cookie |
| Riga 2089 | Valori decodificati dall'URL |
| Riga 2165 | Intestazioni delle richieste HTTP |
| Riga 2173 | Parametri dei moduli POST |
Effetto della correzione: dopo l'elaborazione, il parametro search del POC viene convertito in entità HTML in tutti i marcatori di macro e nei riferimenti ai simboli, impedendo al motore di macro di eseguirli.
Initially developed in 2002 with Delphi 6, now with Delphi 10.3.3 (Community Edition). Icons are generated at http://fontello.com/ . Use fontello.json for further modifications.
For the default template we are targeting compatibility with Chrome 49 as it's the latest version running on Windows XP.