文章总结: 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 # 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(" 命中[%s] %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,建议今天就把本文两段脚本跑一遍:一段帮你确认设备有没有被留下后门账号,一段帮你把“没人管的高权限账号”挑出来。也欢迎把这篇转到运维群——路由器后门的处置窗口,往往就是从看到日志那两行异常开始的。
图四:先核对版本再升级,永远是应对在野利用漏洞的第一步
觉得有用?点个「在看」让更多人看到
紫禁玄科
专注网络安全 · 深度分析
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:紫禁玄科 紫禁
紫禁《全球网络安全速递 路由器两漏洞串成免密后门 已被真实攻击利用》