引言
在2026年9月3日,MikroTik几乎同时为多个维护的RouterOS分支发布了补丁:7.25beta3、7.24.2、7.23.4和6.49.21,并建议尽快安装补丁版本。该供应商将此次发布描述为重要的安全更新,但暂时保留了漏洞细节,以便给管理员留出时间更新他们的设备。
一些修复针对的是CERT Polska的Sławomir Rozbicki发现的漏洞,这些漏洞通过协调漏洞披露(CVD)报告给了供应商。我们原计划将其细节的发布与更新的发布同步,但新版本的发布比我们预期的要早。供应商还在MikroTik应用中使用推送通知来强调升级的必要性。
公告的紧迫性和缺乏具体威胁信息促使在MikroTik的官方论坛上进行了广泛的猜测。同时,用户开始发布设备日志,表明攻击可能在补丁发布之前就已开始。
识别CVE-2026-86060
当新的RouterOS版本可用时,我们开始进行补丁差异分析,以确定供应商是否修复了我们报告的漏洞。这些包还包含了我们报告未涵盖的机制的更改。
修补后的RouterOS版本在将用户名传递给/nova/bin/login应用程序之前进行了验证。这种验证的范围表明,在补丁之前,用户名可能会影响程序如何解释其参数。反编译的函数如下所示:
添加了用户名验证。高亮的条件拒绝以连字符(0x2d)或空格(0x20)开头的用户名。
我们还识别出对Flagged机制的更改,该机制检测可能表明被攻陷的配置条目。一个新规则在启动时检查是否存在属于特权全组的ops账户。如果条件满足,RouterOS将禁用该账户,记录警告,并设置Flagged状态。这种特定的妥协指标(IoCs)的引入可能意味着供应商对攻击至少有部分了解。
然后,我们检查了管理员在MikroTik论坛和Reddit上发布的日志。在多个报告中出现了两个独特的条目:
用户-2从82.192.72.4通过ssh登录失败
用户ops由ssh:-2@82.192.72.4添加
我们注意到这些日志中似乎存在矛盾的序列:用户-2的登录尝试失败,随后在同一会话内创建了ops账户。
结合这些信息和补丁差异分析的结果,使我们能够在一小时内识别出一个新的关键漏洞,分配给它CVE-2026-86060标识符,并向供应商提供了详细信息和一个有效的概念验证脚本。
结合CVE-2026-67279,该漏洞允许攻击者在不知道密码、拥有SSH密钥或完成身份验证的情况下获得完全的管理权限。我们将这一链条命名为MikroTrick。
CVE-2026-67279
SSH提供了多种管理功能,包括远程终端访问、命令执行、文件传输和在加密通信通道内的连接隧道。该协议由三个连续的层组成:
传输,
用户身份验证,
连接和通道处理。
在建立TCP连接后,客户端和服务器协商加密算法并进行密钥交换以建立共享秘密。服务器使用其主机密钥对交换参数进行签名,允许客户端验证服务器的身份。当首次连接时,客户端通常遵循首次使用信任(TOFU)模型。然后,双方从共享秘密中派生用于进一步通信的密钥材料。从那时起,他们的通信是加密的,并受到修改的保护。此阶段对服务器进行身份验证,但尚未对用户进行身份验证。
客户端随后使用允许的方法之一对用户进行身份验证,例如密码或公钥。如果身份验证成功,服务器发送SSH_MSG_USERAUTH_SUCCESS。只有在此之后,通道处理才开始,允许客户端根据分配给SSH用户的权限访问shell、执行命令或使用其他管理功能。此划分在RFC 4253、RFC 4252和RFC 4254中进行了说明。
在初始密钥交换后,任一方可以发起另一个密钥交换,称为重新密钥交换。这在不终止TCP连接或改变更高层协议状态的情况下更改传输密钥。重新密钥交换通常在传输了指定数量的数据或经过了一定时间后发生,但该协议也允许在用户身份验证完成之前进行。
易受攻击的RouterOS SSH服务器在用户身份验证期间错误处理发起的重新密钥交换。当重新密钥交换完成时,服务器无条件地从临时重新密钥状态转移到通道处理,而不是恢复中断的身份验证。因此,它接受了会话通道及相关请求,尽管从未发送SSH_MSG_USERAUTH_SUCCESS。
该漏洞并未建立经过身份验证的身份或分配任何权限。然而,它确实允许连接从用户身份验证转移到通道处理,这是利用CVE-2026-86060的前提。
CVE-2026-86060
在成功身份验证后,客户端可以打开会话通道。利用CVE-2026-67279绕过了此要求。为了创建远程控制台,客户端通常发送pty-req,后跟shell。服务器创建一个伪终端并启动一个附加到它的子进程。在RouterOS中,该进程是/nova/bin/login,按照以下模式调用:
/nova/bin/login -ssh -trace <trace> -h <client address> [-c <command>] <username> <policy mask>
在正常操作期间,最后t