首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 汽车 游戏 社会热点 开源推荐 医疗健康 归档 标签 关于

逆转 MikroTik 的静默补丁:他们无法解释的 RouterOS 7.23.4 修复

2026-09-05 1 阅读 约6分钟阅读 ytch
分享:
字号:
2026 年 9 月 3 日,MikroTik 在同一天悄然推送了 RouterOS 7.23.4(长期)、7.24.2(稳定)和 6.49.21(v6)。他们每个人都举着同样的旗帜:这是一个重要的安全更新。大多数配置都没有风险,但强烈建议升级。为了给您的系统更新时间,我们目前没有发布详细信息。翻译:“我们发现了一些令人讨厌的东西,我们修补了它,并且在你们足够多的人更新之前我们不会告诉你们它是什么。”很公平。不过这句话中蕴含着美妙的讽刺意味。如果你将固定的二进制文件运送到整个星球,那么新旧之间的区别就是披露。禁运保护的是未打补丁的舰队,而不是下载镜像上已打补丁的二进制文件。因此,让我们做任何运行这些设备的操作员应该做的事情:拉取两个版本,反转增量,并找出发生了什么变化。这篇文章是从静态差异到复制代码执行的完整过程。这里存在三个真正的错误,以及两个条件链。一是低指数 RSA 签名伪造导致 mtget 溢出。另一个(现在与主动利用支持跟踪匹配)是 SSH 用户名 -2 到达旧文件描述符登录传输,让经过身份验证的只读会话提供其自己的完整策略掩码。第二条路径提供完整的 RouterOS 命令执行,并且可以依次到达 mtget 。我没有复制的是一种让 SSH 首先接受文字用户 -2 的常用、无凭据的方法;这个界限很重要,这次修订使其保持明确。他们希望你浏览的每一个 RouterOS 版本都会抛出一堵“提高稳定性”要点。无提示安全发布的技巧是找到同一天出现在所有维护的分支中的条目,因为协调的跨分支向后移植是单个严重修复的指纹。比较变更日志,只有一行符合: *) ssh - 重构 SSH 内部流程并提高系统稳定性;出现在 7.23.4、7.24.2 和 6.49.21 中。 7.23.3 中缺席。这就是我们要拉的线索。从 NPK RouterOS 中获取数据作为 NPK(“Nova Package”)文件。我获取了修补程序和先前版本的 x86 基础包,每个大约 20MB,无需身份验证:curl -O https://download.mikrotik.com/routeros/7.23.4/routeros-x86-7.23.4.npk curl -O https://download.mikrotik.com/routeros/7.23.3/routeros-x86-7.23.3.npk NPK 是一个自定义容器:一个 4 字节魔法 ( 1E F1 D0 BA )、一系列 TLV 部分、一个签名块和一个有趣的位,一个 squashfs 有效负载。 binwalk 为我们找到文件系统: $ binwalk routeros-x86-7.23.4.npk 十进制十六进制描述 4096 0x1000 SquashFS 文件系统,小端,版本 4.0,压缩:xz,大小:16650908 字节 带 xz 的标准 squashfs 4.0。从偏移量 0x1000 开始雕刻并将其解压。我的主机缺少 unsquashfs ,所以一个一次性的 Alpine 容器就完成了任务: dd if=routeros-x86-7.23.4.npk of=root.sqsh bs=4096skip=1 docker run --rm -v "$PWD":/w -w /w alpine:3 sh -c 'apk add squashfs-tools >/dev/null; unsquashfs -d rootfs root.sqsh' RouterOS 不是一个单一的守护进程。它是 /nova/bin/ 下的一群小型“nova”进程,通过内部消息总线进行通信,由主加载进程进行代理。 SSH 服务器位于一个捆绑包中,有趣的是,客户端和服务器是相同的二进制文件: rootfs/bndl/security/nova/bin/sshd <- SSH 服务器(与 ssh 字节相同) rootfs/lib/libucrypto.so <- 加密原语 rootfs/lib/libumsg.so <- 消息总线 + 登录处理 在符号级别而不是字节级别进行比较 两个 sshd 二进制文件的简单 cmp 报告170KB 的差异,这是无用的噪音。在 .text 顶部附近插入几个字节,下游的每个地址都会发生变化,因此整个文件“发生变化”。信号不是以字节为单位,而是以符号为单位。无论是否剥离,动态符号表都会保留下来,导出和导入符号的差异直接切入意图。值得一提的一个陷阱:Alpine 中的 BusyBox sh 没有进程替换,因此 diff <(...) <(...) 默默地比较两个空流并将所有内容报告为相同。这会让你很高兴地相信一切都没有改变。临时文件和通讯: nm -D old/$bin | awk '{print $NF}' |排序 -u > a nm -D new/$bin | awk '{print $NF}' | sort -u > b comm -13 a b # 在新版本中添加 comm -23 a b # 已删除 在每个更改的 ELF 上运行该命令,故事就出来了。两个共享库发生了变化,相同的少数符号在整个二进制文件集群中一起移动: ### lib/libumsg.so + _Z20validLoginParamInput11string_view ### lib/libucrypto.so + _ZN12RsaPublicKey23parseHashFromDerEncodedE6HashIDN4asn14blobE - _ZN12RsaPublicKey23parseHashFromDerEncodedEjN4asn14blobE ### 引用更改后的 RSA 例程:sshd/ssh、ipsec、ipsec-worker、ssld、cloud 以 SSH 为中心的符号差异公开了两部分:终端登录路径上的新 validLoginParamInput 和 cha
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱