
CVE-2024-23692 | HFS 2.3m/2.4-RC07 Correction de la vulnérabilité RCE
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.
| Projet | Contenu |
|---|---|
| CVE ID | CVE-2024-23692 |
| Versions affectées | HFS 2.3m, HFS 2.4.0 RC07 et versions antérieures |
| Type de vulnérabilité | Exécution de code à distance non authentifiée (Unauthenticated RCE) |
| Score CVSS | 9.8 Critique |
| Vecteur d'attaque | Accessible via le réseau, sans authentification, sans interaction utilisateur |
Lorsque le moteur de templates de HFS traite la macro {.?search.} (qui lit les paramètres de requête URL), il appelle récursivement applyMacrosAndSymbols2() sur la valeur retournée, ce qui conduit à ce qu'une chaîne contrôlée par l'utilisateur soit exécutée comme code de template.
La chaîne d'attaque se déroule en quatre étapes :
1. Construire un paramètre search contenant %url%
↓
2. %url% se développe en macroQuote(URL complète) = {:url_including_payload:}
↓
3. %password% se développe en chaîne vide, ce qui ferme prématurément le bloc de citation {:...:}
↓
4. {.exec|cmd.} en dehors du bloc de citation est exécuté par le moteur de macro → RCE
Exemple de POC (à des fins de recherche uniquement) :
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
Fichier corrigé : scriptLib.pas
Fonction clé : noMacrosAllowed() (lignes 109–123)
function noMacrosAllowed(s:string):string;
// prevent hack attempts
begin
// Étape 1 : remplacer le premier caractère de toutes les marques de macro par une entité HTML
// {. → {. .} → .}
// {: → {: :} → :}
// | → |
repeat
i := findMacroMarker(s, i);
if i = 0 then break;
replace(s, '&#' + intToStr(charToUnicode(s[i])) + ';', i, i);
until false;
// Étape 2 : remplacer les références de symboles sous forme %symbol% par des entités HTML
// %url% → %url%
// %password% → %password%
s := reReplace(s, '%([-a-z0-9]+)%', '%$1%', 'mi');
result := s;
end;
Emplacements d'appel : Toutes les entrées contrôlées par l'utilisateur passent par cette fonction avant d'être renvoyées au moteur de templates :
Effet du correctif : Après traitement, le paramètre search dans le POC voit toutes ses marques de macro et références de symboles converties en entités HTML, empêchant ainsi l'exécution par le moteur de macro.
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.
| Emplacement d'appel | Portée de la protection |
|---|
urlVar() ligne 548 | Tous les paramètres de requête URL {.?name.} |
| Ligne 698 | Lecture de variables de template |
| Ligne 1549 | Valeurs de cookie |
| Ligne 2089 | Valeurs décodées URL |
| Ligne 2165 | En-têtes HTTP |
| Ligne 2173 | Paramètres de formulaire POST |