
CVE-2024-23692 | HFS 2.3m/2.4-RC07 Correção de vulnerabilidade RCE
Você pode usar o HFS (HTTP File Server) para enviar e receber arquivos. É diferente do compartilhamento de arquivos clássico porque usa tecnologia web. Também difere dos servidores web clássicos porque é muito fácil de usar e funciona "pronto para uso".
O sistema de arquivos virtual permitirá que você compartilhe facilmente até mesmo um único arquivo.
| Item | Conteúdo |
|---|
| Número CVE | CVE-2024-23692 |
| Versões Afetadas | HFS 2.3m, HFS 2.4.0 RC07 e inferiores |
| Tipo de Vulnerabilidade | Execução Remota de Código Não Autenticada (Unauthenticated RCE) |
| Pontuação CVSS | 9.8 Critical |
| Vetor de Ataque | Acessível pela rede, sem autenticação, sem interação do usuário |
Ao processar a macro {.?search.} (que lê parâmetros de consulta da URL), o mecanismo de templates do HFS chama recursivamente applyMacrosAndSymbols2() no valor retornado, causando que strings controladas pelo usuário sejam executadas como código de template.
A cadeia de ataque consiste em quatro etapas:
1. Construir um parâmetro search contendo %url%
↓
2. %url% se expande para macroQuote(URL completa) = {:url_including_payload:}
↓
3. %password% se expande para string vazia, causando o fechamento prematuro do bloco de referência {:...:}
↓
4. {.exec|cmd.} fora do bloco de referência é executado pelo motor de macros → RCE
Exemplo de POC (apenas para pesquisa de segurança):
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
Arquivo corrigido: scriptLib.pas
Função principal: noMacrosAllowed() (linhas 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;
Locais de chamada: Todas as entradas controláveis pelo usuário são processadas por esta função antes de serem retornadas ao motor de template:
| Local de Chamada | Escopo de Proteção |
|---|---|
urlVar() linha 548 | Todos os parâmetros de consulta de URL {.?name.} |
| Linha 698 | Leitura de variável de template |
| Linha 1549 | Valores de Cookie |
| Linha 2089 | Valores decodificados de URL |
| Linha 2165 | Cabeçalhos de requisição HTTP |
| Linha 2173 | Parâmetros de formulário POST |
Efeito da correção: Após o processamento, o parâmetro search da POC tem todas as marcas de macro e referências de símbolos convertidas em entidades HTML, impedindo que o motor de macros seja acionado.
Desenvolvido inicialmente em 2002 com Delphi 6, agora com Delphi 10.3.3 (Community Edition). Os ícones são gerados em http://fontello.com/. Use fontello.json para modificações adicionais.
Para o template padrão, estamos visando compatibilidade com Chrome 49, pois é a versão mais recente que funciona no Windows XP.