该漏洞由Tenable的Jacob Baines发现,同时提供了对应的PoC脚本。另外,他的关于RouterOS漏洞挖掘的议题《Bug Hunting in RouterOS》非常不错,对MikroTik路由器中使用的一些自定义消息格式进行了细致介绍,同时还提供了很多工具来辅助分析。相关工具、议题以及PoC脚本可在git库routeros获取,强烈推荐给对MikroTik设备感兴趣的人。
// stacktrace (gdb) bt #0 0x777563f5 in pthread_mutex_lock () from <path>/mikrotik-6.40.5/_system-6.40.5.npk.extracted/squashfs-root/lib/libpthread.so.0 #1 0x77573cc3 in malloc () from <path>/mikrotik-6.40.5/_system-6.40.5.npk.extracted/squashfs-root/lib/libc.so.0 #2 0x775a5c3e in string::reserve(unsigned int) () from <path>/mikrotik-6.40.5/_system-6.40.5.npk.extracted/squashfs-root/lib/libuc++.so #3 0x775a5ecd in string::assign(char const*, char const*) () from <path>/mikrotik-6.40.5/_system-6.40.5.npk.extracted/squashfs-root/lib/libuc++.so #4 0x775a5f1d in string::assign(string const&) () from <path>/mikrotik-6.40.5/_system-6.40.5.npk.extracted/squashfs-root/lib/libuc++.so #5 0x77788942 in void nv::message::insert<nv::string_id>(nv::string_id, nv::IdTraits<nv::string_id>::set_type) () from <path>/mikrotik-6.40.5/_system-6.40.5.npk.extracted/squashfs-root/lib/libumsg.so #6 0x77504b63 in ?? () from <path>/mikrotik-6.40.5/_system-6.40.5.npk.extracted/squashfs-root/nova/lib/www/jsproxy.p # ... #1102 0x77504bd3 in ?? () from <path>/mikrotik-6.40.5/_system-6.40.5.npk.extracted/squashfs-root/nova/lib/www/jsproxy.p # ...
为了便于分析,临时关闭了系统的ASLR机制.
查看栈回溯信息,可以看到存在大量与0x77504bd3 in ?? () from .../jsproxy.p相关的栈帧信息,与漏洞描述中的”递归解析”一致。根据PoC中数据内容格式"{m01: {m01: ... }}",结合单步调试,定位漏洞触发的地方在sub_77504904()函数中,其被json2message()函数调用,核心代码片段如下。