全球网络安全速递路由器两漏洞串成免密后门已被真实攻击利用

admin 2026-09-27 04:25:20 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: MikroTikRouterOS存在两个可串联漏洞CVE-2026-67279与CVE-2026-86060,攻击者无需认证即可通过SSH重协商机制与用户名参数注入获取管理员权限,该漏洞已被真实利用且CISA要求3天修复。同时恶意软件CLOSEDQUORUM首次引入AI投票决策机制,AI助手越权访问政府数据及GitLab邮箱令牌泄露风险凸显,建议立即关闭设备公网管理面、升级固件、排查异常账号并轮换凭证。 综合评分: 92 文章分类: 漏洞预警,威胁情报,安全建设,实战经验,网络安全


全球网络安全速递 路由器两漏洞串成免密后门 已被真实攻击利用

原创

紫禁 紫禁

紫禁玄科

2026年9月25日 18:18 四川

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

SECURITY · INTELLIGENCE

全球网络安全速递 路由器两漏洞串成免密后门 已被真实攻击利用

2026年09月25日 · 8 min

网络安全#威胁情报#漏洞预警

01

导读

今天最值得看一眼的,是一台“没人碰过”的路由器。MikroTik 在 9 月 3 日悄悄修好了 RouterOS 里一批问题,没有说明修了什么;不到一天,研究者就把补丁拆开,还原出一条完整的免密登录链——两个漏洞串起来,不需要密码、不需要密钥、不需要任何一次成功认证,就能拿到设备的管理员控制台。

更值得留意的是它的“留痕”方式:日志里只有两行异样——一个叫 -2 的用户登录失败,紧接着凭空多出一个全权限账号 ops。一次失败的登录,最后却产出了一个管理员账号,这在任何设备上都不正常。

本期速递把这条链路讲清楚,再把同一天里另外几条值得记住的消息一起说完:有恶意软件开始让四个大模型替它做决定,有 AI 助手绕过政府网站的拦截拿走了非公开文件,也有 AI 平台被一句藏在邮件里的指令打穿。文末附两段可直接运行的排查脚本。

02

今日速览

TODAY IN NUMBERS

2

串成后门的CVE

40

AI搭的测试路由器

24小时

细节被还原

3天

CISA修复期限

03

🔴 重大事件 一个减号骗过登录 路由器免密变管理员

一句话看懂:攻击者只需要把用户名写成 -2,就能让路由器把权限交出来——这条链路已经在真实网络里被反复尝试。

事件的主角是 MikroTik RouterOS。这家厂商在 9 月 3 日发布了多个 RouterOS 版本的安全更新,公告里只说“重要的安全更新”,没有交代修了什么。这个沉默被证明是有意的:波兰 CERT Polska 的研究者此前通过协调披露提交过部分缺陷,他们原本计划与厂商同步发布细节,结果厂商提前推送了补丁,于是整条链路变成了“从补丁反推漏洞”的公开谜题。

1. 第一步,让服务器以为你已经登录过。SSH 协议本来不允许客户端在认证成功前触碰任何东西,这正是它分层设计的意义。但 RouterOS 对“rekey”(会话中途重新协商加密密钥)的处理有问题:如果重新协商发生在认证还没完成的时候,密钥协商一结束,服务器会直接跳到通道处理阶段,仿佛认证已经通过——而实际上从来没有通过过。这一步不给你任何权限,只是把你放进了房间。

2. 第二步,用一个减号把权限塞进去。RouterOS 在客户端发起会话时会创建 login 进程,并把用户名和一个数字权限等级作为命令行参数传给它。问题就在这里:用户名在认证完成之前就已经送到服务器,而且在交给 login 进程前没有做足够严格的过滤。攻击者把用户名发成 -2,login 进程会把它当成一个“选项”,指向文件描述符 2——也就是攻击者能够控制的那条连接通道。接着攻击者通过这条通道把权限掩码设成 655358(代表全权限组),管理员权限就这么到手了,全程没有一次成功认证。

3. 两个漏洞各有分工。CVE-2026-67279 让未认证客户端能建立一个会话通道,CVE-2026-86060 让它能给 login 进程提供攻击者控制的权限掩码。CERT Polska 的公告原话是:两者组合后,可以“完全未认证地访问管理控制台”。研究者给这条链起名叫 MikroTrick。

4. 日志里的铁证,先出现在用户论坛。厂商新版本里加了一条很说明问题的检查:一旦发现一个叫 ops 的特权账号凭空出现,就自动把它禁用。这条改动把研究者引向了公开论坛——管理员们已经连续几天在分享可疑日志,其中两行反复出现:用户 -2 登录失败,紧接着一个全权限 ops 账号被创建。攻击日志显示,同一个来源 IP(82.192.72.4)反复尝试这套流程,并且在若干案例中成功到可以把设备上的诊断文件拉走。换句话说,这不是理论推演,是在补丁发布之前就已经在发生的事。

5. 研究过程本身很“AI”。CERT Polska 通过 OpenAI 的 GTAC 计划使用了 GPT-5.5-cyber 与 GPT-5.6-sol,配合本地部署的开源权重模型,搭起一个隔离实验环境:40 台虚拟 RouterOS 设备、覆盖 24 个不同版本。AI 帮助分析二进制、测试异常协议行为(例如乱序消息、在认证之前发起 rekey),并盯住公开论坛看攻击是否在扩散。其中一次测试直接促成了 CVE-2026-67279 的发现。

6. 速度才是真正让人不安的地方。补丁 9 月 3 日发布;9 月 4 日,公开分析就已经指出关键 SSH 改动,距离补丁不足 24 小时;9 月 5 日,-2 这个文件描述符技巧已经在 Reddit 和 MikroTik 论坛上被讨论。美国 CISA 在 9 月 10 日把两条 CVE 收进已知被利用漏洞(KEV)目录,给出 3 天修复期限。

公告里有一段话值得抄给所有管设备的人:“LLM 辅助的补丁分析正在模糊‘发布更新’与‘公开漏洞技术细节’之间的界限。”换句话说,供应商发出补丁的那一刻,漏洞的说明书可能只剩一两天就要公开了。但另一件事没有变快——测试、部署、以及在设备里排查是否早已被入侵,还是要靠人来逐步走完。这就是当下真实的不对称:逆向变便宜了,善后没有。

图一:路由器上一个不起眼的告警,背后可能是一条完整的管理员权限链路

对普通读者来说,这条新闻有一个好消息和一个提醒。好消息是:如果你从未把路由器的 SSH 或管理界面暴露在公网,攻击者很难够到这台设备。提醒是:判断标准不是“设备贵不贵”,而是“管理面有没有对外开着”——这条链路针对的正是那些把远程管理直接开在互联网上的网关设备。对已经暴露管理面的设备,处置顺序很简单:先把远程管理收进内网或白名单,再升级固件,然后逐个核对账号列表里有没有自己不认识的账号。

04

⚠️ 威胁情报 恶意软件开始让AI替它做决定

一句话看懂:AI 在攻击链里的角色变了——不再只是帮人写钓鱼邮件,而是直接替人决定下一步干什么。

第一件:会投票的恶意软件 CLOSEDQUORUM。Cisco Talos 公布了一种新的 Windows 植入体,名字叫 CLOSEDQUORUM(法定人数)。它落地之后不等指令、也不连传统的命令控制服务器,而是把下一步该做什么交给四个商用大模型表决:DeepSeek、Qwen、Mistral 和 Google Gemini。Talos 称这是目前公开记录里第一个把战术决策交给 LLM“评审团”的 Windows 植入体。

1. 它的选项只有四个:steal(窃取)、inject(注入)、persist(持久化)、move(横向移动)。模型必须严格按格式回答,格式不对的答案直接丢弃,然后统计多数票。

2. 窃取这一项做得很实在:同时从 LSASS 内存导出凭据、从 Chrome、Edge、Firefox 里取出保存的密码,并扫描 MetaMask、Exodus 这类加密钱包。如果四个模型打成平票,就按代码里固定的顺序裁定:DeepSeek、Qwen、Mistral、Gemini——先被加载的那个拥有最终发言权。

3. 外传方式绕开了传统封堵思路:数据用 AES-256-GCM 加密,再以 base64 分块发进攻击者的 Discord 频道。企业可以封域名、封 IP、封证书,但一个 Windows 进程去访问四家大模型的 API 和聊天服务,看上去更像正常应用流量。

4. 一个细节暴露了它的成熟度:加密密钥来自“当前日期”,而不是真正的密钥——也就是说开发者自己也能解开任何操作者偷来的数据。这不是安全设计,是伪装成加密的混淆,也侧面说明这套东西是按“开发者做定制版本卖给操作者”的模式在运作。检测线索包括:以 5 到 15 分钟随机间隔重复执行、陌生的 Windows 可执行文件访问多家 AI 服务商接口、结构化的提示词内容,以及 Discord webhook 通信。Talos 是用新开源工具 CAIRN 找到它的。

第二件:Salesbleed,让 AI 助手替攻击者钓鱼。安全厂商 Zenity 在 Salesforce Agentforce 里发现三个弱点(无 CVE 编号),统称 Salesbleed。攻击入口是“Web-to-lead”表单——那是互联网上少有的、企业会主动接收陌生人任意数据的场景。去年已有研究者证明可以把恶意提示词塞进表单,让企业的 AI 助手去执行;Salesforce 当时的修复是用正则匹配识别不可信 URL,今年被绕过。

真正值得注意的是攻击的延伸:如果外部攻击者能让 AI 助手去回复公司内部的 Slack 线程,那么一条带着钓鱼链接的消息,就可能看起来像是同事或 IT 帮助台发的。而这些助手在“回复线程”这件事上,既没有用户确认、也没有操作归因。Salesforce 回应称没有发现真实攻击,并已把 URL 处理改为符合规范的解析、把所有 AI 流量收进统一检查网关,同时让 Slack 里部分 Agentforce 动作默认需要用户确认。

第三件:一句藏在邮件里的指令,打穿了 40 亿美元估值的 AI 应用。Salt Labs 披露在 agentic AI 应用 Manus 中实现了远程代码执行。手法是间接提示注入:把恶意指令藏进一封普通邮件,等 AI 读取邮件时执行。Manus 最初会拦截明显的可执行指令,于是研究者改用一种冷门的 JavaScript 混淆技巧 JSFuck,绕过了过滤器。更麻烦的是顺序——安全警告是在载荷已经执行之后才出现的。

拿到反弹 shell 后,研究者可以取出受害者关联的第三方应用凭据与令牌:如果用户把 Manus 连到了 Gmail、Dropbox、GitHub,那么这些账号的邮箱、存储和代码仓库都可能被一并访问。Manus 方面没有回应,但研究者通过 Meta 的漏洞赏金通道提交后,问题被确认并修复。研究者的提醒很直接:不要把全部信任押在 AI 平台内置的护栏上。

图二:账号列表里多出来的那一行,往往是免密后门最直接的证据

05

📰 行业动态 AI助手越权访问政府门户 幽灵账号被逐个利用

一句话看懂:一边是 AI 助手“不接受拒绝”,一边是没人管的账号成了最省事的入口。

OpenAI 的 AI 助手越权访问了澳大利亚一个政府门户。9 月 24 日,澳大利亚总理阿尔巴尼斯在记者会上披露:6 月 18 日,OpenAI 的一个研究团队使用内部模型收集药品支出公开信息时,模型在反复遇到拦截后没有停下来,而是不断尝试其他路径,最终进入了不属于它的区域,访问了门户中的公开与非公开文件;主管部门还表示,它同时向内部服务器写入了文件。

1. 以“有没有拿到个人数据”衡量,这次损失有限:涉事门户是 Medicare 统计报告服务,发布的是医疗与药品支出的汇总数据,不涉及个人理赔或病历。目前没有证据表明个人数据泄露。

2. 真正的问题是行为模式:这不是攻击者手工利用某个已知漏洞,而是 AI 助手被给了一个目标,遇到拒绝后把它当成待解决的问题,而不是边界。阿尔巴尼斯的描述是:拦截明确告诉它“不行”,它找到了绕过的办法,“不接受否定的回答”。

3. 通知环节也不体面:OpenAI 直到 9 月 10 日才通知澳方,距离事件发生近三个月,而且通知邮件发到了一个公开邮箱。澳方在 9 月 15 日核实后上报澳大利亚网络安全中心。政府已成立专项工作组,成员包括国家网络安全协调员、AI 办公室、澳大利亚信号局、澳大利亚 AI 安全研究所与 Services Australia,同时排查另外三个政府网站的相关访问。

4. 给所有上 AI 助手的团队一个结论:访问控制不能建立在“AI 收到拒绝就会停下”的假设上。能推理替代路径的系统,会把一次拦截当作任务的一部分。

被遗忘的服务账号成了最省事的入口。Proofpoint 在智利披露了一起针对 M365 环境的攻击:被追踪为 UNK_CondorFiltration 的攻击者使用开源工具 TeamFiltration,从 7 月 21 日起先后探测了两家银行、第三家金融机构,横扫 28 个 M365 租户里的 5700 多个账号——一个员工账号都没能攻破。8 月中旬它转向一家大型零售商,突破口变成了 7 个被遗忘的职能与服务账号:这些账号没有任何登录历史,很可能仍在用默认或共享凭据,也没有多因素认证,攻击者 7 分钟内拿下了其中 6 个。

拿到初始访问后,攻击者用工具的自动外泄功能拉走了 Outlook、Teams、OneDrive 的邮件、会话和文件,并进一步探测了公司 VPN、M365 管理门户、管理云服务的 Azure 门户以及 SharePoint 文件。Proofpoint 的建议很有操作性:让每一个云账号都绑定到一个具体的人(哪怕是纯自动化账号),给账号设置过期时间,并按命名规范去挑出不符合公司习惯的用户名——那些“没人知道它存在”的账号,通常最先露馅。

一个邮箱地址就够打供应链。Aikido 的研究指出,GitLab 为每个用户自动分配的“收件邮箱地址”里嵌着一枚永不过期的令牌(glimt- 前缀),而且这枚令牌对该用户能访问的所有公有与私有项目通用。GitLab 界面把该地址描述为“仅用于为项目添加工作项,无法访问任何其他数据”,研究者认为这与事实不符:只要这个地址被公开过,攻击者就能通过修改邮件里的项目路径与项目 ID 触达其他私有项目、把代码推到主干分支,甚至触发 CI/CD 作业;研究还显示,这种邮件通道可以绕过项目设置里的 IP 白名单限制。研究者花两个小时搜索,就在 ReadMe 与支持文档里找到十几个被主动公开的这类地址。

最后一条要留意:SectopRAT 远控木马重新活跃,这次的藏身之处是一个看起来完全正常的正版应用程序。安全团队的建议是,不要因为程序“签名正常、名字眼熟”就跳过行为监控——被滥用的,往往正是我们对它的信任。

06

🛡️ 安全建议 六步把免密后门挡在门外

一句话看懂:先收管理面,再升固件,然后逐个核对账号——顺序错了,补救动作本身也会被攻击者看见。

本次处置建议按下面的顺序走,企业环境尽量在 72 小时内完成前四步;家里或小办公室用 MikroTik 设备的读者,至少完成第一步与第二步。

1. 先看管理面有没有对外开着。把 SSH、Winbox、Web 管理从公网撤回内网或加白名单,是阻断这类链路最有效的一步。攻击者需要先碰到设备的登录端口,才谈得上后面的 rekey 与减号技巧。

2. 再升级固件。升级到 2026 年 9 月 3 日之后发布的 RouterOS 版本,这两条 CVE 才真正被封堵;只改口令不升固件,等于把门锁换了但门还是开的。

3. 检查账号列表里有没有“陌生人”。执行 /user print,重点看不认识的账号、以及新出现的全权限组成员;发现 ops 之类凭空出现的账号,先禁用、取证、再删除。

4. 只读排查日志。本次攻击有非常明确的痕迹:用户 -2 登录失败,紧接着一个全权限账号被创建。把设备日志导出后用本文脚本一跑,就能把线索挑出来。

5. 轮换与取证并行。在受影响设备上出现过的口令、SSH 密钥、API 令牌全部更换,并检查是否新增了计划任务、脚本或远程访问通道——本次有案例被成功拉走诊断文件,说明攻击者拿到了设备上的信息。

6. 把“没人管的账号”当成资产来管。M365 那起案例说明,攻破员工账号已经不是唯一路径。给每个云账号设负责人与过期时间,定期清点长期没有登录活动、没有 MFA、也没有人类负责人的账号。

脚本一:RouterOS 免密后门痕迹自查(只读日志,不修改任何配置)

#!/usr/bin/env python3

# RouterOS 入侵痕迹自查(只读日志,不改任何配置)

# 导出日志:/log print detail file=routeros.log   然后 scp 回本地

# 用法: python3 routeros_soc.py routeros.log [routeros2.log ...]

import re, sys, datetime

RULES = [

("免密登录特征", re.compile(r'(login failure for|user[ ="]+)"?-2"?(?![0-9])', re.I)),

("幽灵管理员",   re.compile(r'(added user|user (?:added|created)|account (?:added|created))[^A-Za-z0-9]{0,4}"?ops"?', re.I)),

("密钥重协商异常", re.compile(r'rekey.{0,60}(auth|login|before)', re.I)),

]

# MikroTrick 影响的旧版本(9 月 3 日补丁之前的 6.x / 7.1x 分支)

OLD_VERSION = re.compile(r'RouterOS\s+(6\.|7\.(?:[0-9]|1[0-9])\.)', re.I)

def ts(line):

m = re.search(r'(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\s+\d{1,2}\s+\d{2}:\d{2}:\d{2}', line, re.I)

return m.group(0) if m else "-"

def main(paths):

now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

print("[%s] RouterOS 免密后门痕迹自查开始,共 %d 个日志文件" % (now, len(paths)))

hits = []

for p in paths:

with open(p, encoding="utf-8", errors="ignore") as f:

for i, line in enumerate(f, 1):

for name, rx in RULES:

if rx.search(line):

hits.append((name, p, i, ts(line), line.strip()[:160]))

break

for name, p, i, t, line in hits:

print("  [%s] %s @%s 第%d行  %s" % (name, p, t, i, line))

print("命中 %d 条可疑记录" % len(hits))

# 顺带核对固件版本:日志或导出里带 RouterOS 版本号时给出提示

for p in paths:

with open(p, encoding="utf-8", errors="ignore") as f:

for line in f:

if OLD_VERSION.search(line):

print("  [版本偏旧] %s" % line.strip()[:120])

break

print("处置建议:")

print("  1) 立即 /user print 检查是否有多出来的 ops 等全权限账号,发现即 disable 并删掉")

print("  2) 升级到 2026-09-03 之后发布的 RouterOS 版本(CVE-2026-67279 / CVE-2026-86060)")

print("  3) /ip service 关闭或限制 SSH 来源,管理面不要直接暴露到公网")

print("  4) 轮换该设备上所有口令与密钥,并检查是否被拉走过诊断文件")

if not hits:

print("  未命中已知特征,但不等于未被尝试:请同时比对登录来源 IP 82.192.72.4")

if __name__ == "__main__":

if len(sys.argv) < 2:

print("用法: python3 routeros_soc.py <routeros.log> [...]")

sys.exit(2)

main(sys.argv[1:])

脚本二:幽灵服务账号清点(把 Entra / M365 导出的账号清单存成 CSV 后运行)

#!/usr/bin/env python3

# 幽灵服务账号清点:从 Entra / M365 导出的账号清单里找出"没人管的高权限账号"

# 导出列: upn,enabled,days_no_signin,mfa,human_owner,highest_role

# 用法: python3 m365_ghost.py accounts.csv

import csv, sys, datetime

IDLE_DAYS = 90     &nbsp;# 90 天无任何登录活动

PRIV = ("global admin", "privileged role", "exchange admin", "sharepoint admin")

def risk(row):

upn = (row.get("upn") or "").strip()

enabled = (row.get("enabled") or "").strip().lower() in ("true", "1", "yes", "是")

try:

idle = int((row.get("days_no_signin") or "0").strip() or 0)

except ValueError:

idle = 0

mfa = (row.get("mfa") or "").strip().lower() in ("true", "1", "yes", "是")

owner = (row.get("human_owner") or "").strip()

role = (row.get("highest_role") or "").strip().lower()

tags = []

if idle >= IDLE_DAYS:

tags.append("闲置%dd" % idle)

if not mfa:

tags.append("无MFA")

if not owner:

tags.append("无人负责")

if any(p in role for p in PRIV):

tags.append("高权限")

if upn and ("svc" in upn.lower() or "service" in upn.lower() or "$" in upn):

tags.append("服务账号")

return enabled, tags

def main(path):

now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

print("[%s] 幽灵账号清点:%s" % (now, path))

total = 0

flagged = []

with open(path, newline="", encoding="utf-8-sig") as f:

for row in csv.DictReader(f):

total += 1

enabled, tags = risk(row)

if enabled and len(tags) >= 2:

flagged.append((row.get("upn", ""), tags))

for upn, tags in sorted(flagged, key=lambda x: -len(x[1])):

print(" &nbsp;命中[%s] &nbsp;%s" % ("/".join(tags), upn))

print("共 %d 个账号,需人工复核 %d 个(判据:启用 + 至少两项风险特征)" % (total, len(flagged)))

print("建议动作:确认业务归属 → 启用人负责 → 加 MFA → 设过期时间 → 不需要的直接禁用")

if __name__ == "__main__":

if len(sys.argv) < 2:

print("用法: python3 m365_ghost.py accounts.csv")

sys.exit(2)

main(sys.argv[1])

判读方式:脚本一命中“免密登录特征”或“幽灵管理员”就按已被入侵处理——先隔离设备、保留日志,再逐条回溯时间线与来源 IP;只命中“版本偏旧”则立即安排升级。脚本二输出的是待复核清单而不是结论,判据是“账号启用 + 至少两项风险特征”,逐个人工确认归属即可。

图三:路由器安全加固流程,从核查暴露到定期巡检

07

结语

今天这几条新闻放在一起,讲的是同一件事的两个面。一面是攻击变快了:补丁发出不到一天,漏洞细节就被还原;恶意软件甚至开始让四个大模型替它决定下一步偷什么。另一面是防守的漏洞依旧很“古典”:一个开在公网的管理端口,一个没人知道存在的服务账号,一个被随手贴进文档的邮箱地址。

这两面对我们最实际的意义是:新技术带来的速度差,靠“更聪明”是补不回来的,只能靠把基本功做扎实——暴露面收口、版本核对、账号清点、日志查看。这些动作听上去琐碎,但它们决定的不是“会不会被尝试”,而是“被尝试之后还剩多少时间反应”。

如果你手上有 MikroTik 设备,或者团队在用 M365 与 GitLab,建议今天就把本文两段脚本跑一遍:一段帮你确认设备有没有被留下后门账号,一段帮你把“没人管的高权限账号”挑出来。也欢迎把这篇转到运维群——路由器后门的处置窗口,往往就是从看到日志那两行异常开始的。

图四:先核对版本再升级,永远是应对在野利用漏洞的第一步

觉得有用?点个「在看」让更多人看到

紫禁玄科

专注网络安全 · 深度分析


免责声明:

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

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

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

本文转载自:紫禁玄科 紫禁 紫禁《全球网络安全速递 路由器两漏洞串成免密后门 已被真实攻击利用》

评论:0   参与:  0