KeyFrame內部研究專用

DEF CON 33 - DisguiseDelimit: Exploiting Synology NAS with Delimiters and Novel Tricks - Ryan Emmon

DEFCONConference·2月18日週三·39 min英文

三句話摘要

安全研究員 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 只會顯示它真正能驗證的內容。

更多「Web2 安全」的內容

SANS Stormcast Tuesday, August 25th, 2026: DOUBLECUP PNG; WebAudio Fingerprinting; Expired Domains; Android; Car
7 min
Web2 安全英文PODCAST8月25日

SANS Stormcast Tuesday, August 25th, 2026: DOUBLECUP PNG; WebAudio Fingerprinting; Expired Domains; Android; Car

SANS Stormcast

  • PNG 容器攻擊的簡易性設計:Double Cup 不依賴複雜的 Exif 或隱寫技術,只用 PNG 副檔名和檔頭來偽裝,核心是利用 findstr 指令的常見可用性讓執行變得無需額外工具。
  • Web Audio API 的隱密指紋識別:音訊於增益零的無聲狀態下播放,使用者完全無感,但錄製波形足以建立裝置特徵,在瀏覽器原生功能層面難以區分是反詐欺還是過度追蹤。
  • 域名過期引發的串聯漏洞:DMARC 報告端點使用過期域名是常見疏漏,允許攻擊者透過簡單的域名註冊取得他人的 SPF/DKIM 錯誤報告,進而收集目標系統配置情報。
Risky Bulletin: Expired credit cards can be used for malicious transactions
5 min
Web2 安全英文PODCAST8月24日

Risky Bulletin: Expired credit cards can be used for malicious transactions

Risky Business

  • 支付安全的非對稱風險:Visa卡利用未加密的卡片資料與NFC通訊,攻擊者可藉由中間人技術竄改過期日期進行交易,但MasterCard、美運卡與Discover的防護更完善,顯示不同發卡機構的安全架構存在明顯差異。
  • 國家級駭客活動的連鎖延伸:北韓Lazarus集團在2月單一事件已累積100名受害者,涵蓋大學、警察部門、媒體與醫療機構,伊朗駭客則針對基礎建設如電力系統發動破壞性攻擊,反映地緣政治在網路戰爭中的升溫。
  • AI加速漏洞生態的雙面刃:AI工具催生近2萬份漏洞概念驗證代碼發布,但同時也導致大量失效漏洞代碼氾濫,增加資安團隊甄別真實威脅的難度;Mayer Protocol遭攻擊事件中,駭客用AI鏈接六個無關的小漏洞完成盜竊170萬美元的攻擊。
SANS Stormcast Monday, August 24th, 2026: More Entra Powershell; Entra Vulnerability; GitLab Vuln (and PoC); GTA 6 Leak Malware
5 min
Web2 安全英文PODCAST8月24日

SANS Stormcast Monday, August 24th, 2026: More Entra Powershell; Entra Vulnerability; GitLab Vuln (and PoC); GTA 6 Leak Malware

SANS Stormcast

  • Microsoft EntraID 的遠端代碼執行漏洞已由微軟修補,初期報告顯示已遭利用但後來更正為未遭利用。這反映 Microsoft 在雲端軟體安全上的透明度提升,對漏洞採用與內部軟體相同的 CVE 編號和公告流程。
  • PowerShell 指令碼可用於驗證 MFA 部署完整性,特別是找出未啟用 MFA 的遺漏帳號。同時可以分析 EntraID 登入日誌中的異常行為,如風險係數評估和地理位置檢測,幫助組織快速識別可疑登入。
  • GitLab 的 GraphQL 代碼注入漏洞允許未認證攻擊者刪除或修改儲存庫,潛在導致供應鏈攻擊。已有公開概念驗證 (PoC) 存在,使用內部部署 GitLab 的組織必須立即修補。