安全研究

安全漏洞
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(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障