DEF CON 33 - DisguiseDelimit: Exploiting Synology NAS with Delimiters and Novel Tricks - Ryan Emmon
三句話摘要
安全研究員 Ryan Emmons 在 Pwn2Own 競賽中,透過分隔符注入與 LD_DEBUG 新技術,實現對 Synology NAS 的未授權遠端 Root Shell,獲得 $40,000 獎金。 glibc 1999 年起就存在的 `LD_DEBUG_OUTPUT` 配合 Tab 字元 crontab 注入,可將「不可控的 debug 訊息寫入」升級為完整的遠端未授權 Root RCE,提醒開發者任何傳入 root 程序的使用者輸入都是潛在的環境變數注入面。 1. 登入流程存在未授權的環境變數注入點
重點整理
重點- 1
1. 登入流程存在未授權的環境變數注入點
- 2
Synology DSM 登入時,CGI binary 會將使用者輸入的帳號名稱以環境變數形式傳遞給 root 擁有的原生程序,攻擊者在未通過認證前即可汙染此流程,構成強力的原語(primitive)。
- 3
2. 注入換行符觸發自訂分隔符,進而允許注入任意環境變數
- 4
當帳號欄位包含換行符(`\n`)時,系統會自動加上 `plugin_value_start` / `plugin_value_end` 書端分隔符,但未阻止攻擊者注入相同的分隔符串來逃逸上下文,最終可為 root 程序執行設置任意環境變數。
- 5
3. LD_DEBUG + LD_DEBUG_OUTPUT 組合開創全新 Linux 遠端利用技術
- 6
傳統 LD_PRELOAD 技術需要將惡意 .so 先上傳至磁碟,但作者在無法上傳檔案的情況下,改用 `LD_DEBUG_OUTPUT` 將 linker 除錯訊息(含可控字串)寫入指定路徑,突破「僅有不可控內容寫入」的限制。
- 7
4. Tab 字元繞過 LD_PRELOAD 空格分割問題,完成 crontab 注入
- 8
`LD_PRELOAD` 以空格或冒號分隔多個路徑,導致含空格的 crontab payload 被截斷;作者發現 cron daemon 接受 Tab 作為欄位分隔符,因此改用 Tab 組成合法的 crontab 行,成功將 reverse shell 指令寫入 `/etc/cron.d/`。
實用技巧與重點
乾貨- 數字與規模
- Synology DSM 公網暴露設備:約 100 萬台(Shodan 查詢結果)
- Pwn2Own Ireland 獎金:$40,000
- 研究時程:3.5 週
- Cron 執行間隔:每 1 分鐘
- DSM Web Service 預設監聽埠:5000、5001、6600、6601
- 工具與平台
- `bpftrace`(eBPF 工具):監控 OS 層 syscall 與環境變數
- `inotifywait`:監控 /tmp 目錄的檔案建立/刪除事件
- Vue DevTools + vue-force-dev:繞過前端 RSA+AES 自訂加密,直接篡改登入表單
- `LD_DEBUG`(glibc 2.1,1999 年起):輸出動態連結器 debug 資訊
- `LD_DEBUG_OUTPUT`:將 LD_DEBUG stderr 輸出重導至指定檔案路徑(附加 `.PID` 後綴)
- `LD_PRELOAD`:預載 .so 函式庫
- Netcat(port 4444):接收 reverse shell
- 步驟與方法
- 用 bpftrace 監控登入時的程序執行,發現三次 exec(CGI → pre → post)
- 用 inotifywait + bash race 讀取 `/tmp` 下的暫存 plugin args 檔
- 用 vue-force-dev 繞過前端加密,直接修改帳號欄 JSON 欄位進行注入
- 注入 `plugin_value_end` 分隔符逃逸上下文,設置 `LD_PRELOAD`、`LD_DEBUG`、`LD_DEBUG_OUTPUT`
- `LD_PRELOAD` payload 格式:`nop\n[tab分隔的crontab行]\nnop`
- `LD_DEBUG_OUTPUT` 指向 `/etc/cron.d/hacks`(cron 對副檔名不限制)
- Base64 編碼 reverse shell payload 避免特殊字元問題
- 等待 cron 每分鐘執行,取得 root shell
- CVE 與研究參考
- CVE-2010-3856(Tavis Ormandy / Todor Denev):glibc profiling 環境變數本地提權
- CVE-2024-3400(Palo Alto):任意檔名寫入 + telemetry 服務命令注入
- El Tam《Hacking with Environment Variables》(2020)、《Remote LD_PRELOAD Exploitation》(2017)
- Orange Tsai、Felix Wilhelm、Y4ER、Watch Tower 等遠端環境變數利用研究
- Fabian Tamp (2021):Synology 自訂 RSA+AES 加密機制分析
- virtual-dsm:可在 Docker 容器內執行 DSM 的社群專案
結論
結論“glibc 1999 年起就存在的 `LD_DEBUG_OUTPUT` 配合 Tab 字元 crontab 注入,可將「不可控的 debug 訊息寫入」升級為完整的遠端未授權 Root RCE,提醒開發者任何傳入 root 程序的使用者輸入都是潛在的環境變數注入面。”
完整解析
詳細Ryan Emmons 是 Rapid7 的資深安全研究員,擁有約四年零日漏洞研究經驗。去年他決定參加 Pwn2Own Ireland 競賽,目標鎖定 Synology NAS,因為 Shodan 顯示約有百萬台設備直接暴露於公網,一旦攻破就能作為進入企業或家庭內網的跳板。他為自己設定嚴格的研究目標:未授權漏洞、預設設定即可觸發、不依賴中間人攻擊,且必須在 3.5 週內完成。
研究過程中,Emmons 首先用 bpftrace 監控登入流程,發現 CGI binary 在呼叫 `syno-cgi-plugin-weblogin` 時,會透過暫存檔將使用者輸入的帳號名稱以環境變數形式傳遞給 root 擁有的原生程序。這意味著攻擊者在尚未認證的狀態下,已能汙染 root 程序的執行環境。接著他嘗試直接透過網頁攔截請求注入,卻發現登入表單有自訂的 RSA+AES 客戶端加密。他選擇了更快的繞道路線:安裝 vue-force-dev 瀏覽器擴充套件,直接在記憶體中篡改 Vue.js 登入表單的 JSON 欄位,完全跳過加密流程。
當他嘗試注入換行符時,系統並未過濾,而是自動為攻擊者的資料加上 `plugin_value_start` / `plugin_value_end` 書端分隔符來「保護」自己。然而 Emmons 意識到,只要注入相同的分隔符字串,就能逃逸這個保護框架,進而為 root 程序設置任意環境變數——這是一個強力但仍缺乏直接利用路徑的原語。傳統技術如 LD_PRELOAD 需要先上傳惡意函式庫,El Tam 的 procfs 反射載入技術也因為找不到可用的檔案描述符而行不通。
突破口來自 glibc 自 1999 年便存在的 `LD_DEBUG` 與 `LD_DEBUG_OUTPUT`:前者讓動態連結器輸出詳細 debug 訊息到 stderr,後者則將這些訊息重導至指定路徑(並自動附加 `.PID` 後綴)。Emmons 發現,當 `LD_PRELOAD` 設為含換行符的字串時,linker 不會正確處理,導致換行符後的內容會出現在 debug 檔的獨立一行,且該行由攻擊者完整控制。最後的問題是 `LD_PRELOAD` 以空格分隔多個路徑,而 crontab 語法需要空格——他的 payload 不斷被截斷。最終他發現 cron daemon 雖然文件未記載,但實際上接受 Tab 字元作為欄位分隔符。因此最終 payload 改以 Tab 分隔 crontab 的各欄位,並將 base64 編碼的 reverse shell 指令作為執行內容,透過 `LD_DEBUG_OUTPUT=/etc/cron.d/hacks` 寫入(cron 對副檔名無限制),等待 cron 每分鐘執行後取得 root shell。整個攻擊僅需將構造好的帳號字串貼入登入欄位,不需要任何其他工具,最終在 Pwn2Own 拿下 $40,000 獎金。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

