5

一些有趣的漏洞模式

 2 years ago
source link: https://kiprey.github.io/2020/10/vuln-patterns/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
  • 这里会持续记录平常见到的一些漏洞模式

1. 条件竞争

  • 多线程 程序中,由于没有及时为资源上锁,而导致该资源被另一个线程所修改时,因为其他的不当操作而造成漏洞。

  • // 多线程代码
    if(ptr)
    {
    ...
    // 注意!user_buf是一块mmap映射的,并且未初始化的区域
    copy_from_user(ptr,user_buf,len);
    ...
    }
    • 在这个例子中,执行copy_from_user时,由于user_buf只是映射而为分配实际内存,所以当该内存被使用时,会触发内存缺页中断,使CPU执行内存缺页处理程序。此时copy_from_user函数将会暂停执行,等待内存缺页处理程序返回。
    • 但如果在这个等待的时间中,另一个进程将指针ptr释放,并使某个重要结构申请到这块刚刚被释放的内存。则就可以对这个重要结构进行修改

2. 整数溢出

  • 整数之间做运算的结果超过范围,导致上溢或下溢

  • 该漏洞是相当常见的,因为大多数情况下代码中都没有考虑运算的溢出

    • // dataLen可控
      ptr = realloc(ptr, metaLen + dataLen);
      // 当metaLen + dataLen上溢时,realloc只会分配一块较小的内存
      // 这样就可以实现堆溢出
    • int total_len;
      int meta_len;
      ...
      // meta_len可控
      unsigned int data_len = total_len - meta_len;
      // 此时data_len就会变的很大,例:(unsigned)(-1) = 0xFFFF
  • 整数溢出的判别方式

    • 溢出肯定不是这么判别的(笑)

      注: 变量metaLen与dataLen都是int类型

      // dataLen可控
      if(metaLen + dataLen > INT_MAX)
      { ... }
    • 而通常是这样判别的

      // dataLen可控
      if(INT_MAX - dataLen < metaLen)
      { ... }
    • 但是当判别表达式比较繁杂的时候

      // dataLen可控
      if(INT_MAX - ( 1 + dataLen + 1) < metaLen)
      {
      ...
      ptr = realloc(ptr, (metaLen + 1) + (dataLen + 1));
      }

      此时还是会造成整数溢出。

      所以正确的判别式应该是将用户可控变量用户不可控变量分开

      if(用户可控变量 < (用户不可控变量1 op 用户不可控变量2 ...))
      {
      ...
      }

      这方面要多加小心。

3. 目录遍历漏洞

  • 当程序对文件进行操作,需要其绝对地址时,程序会将当前工作目录的地址与程序名称进行拼接,以获得绝对地址

    /home/kiprey/ + targetFilename = /home/kiprey/targetFilename

  • 但如果这个targetFilename不守规矩呢?

    例如targetFilename = ../../etc/passwd
    则此时拼接起来的绝对地址为/home/kiprey/../../etc/passwd,实际上就是/etc/passwd,指向敏感文件
    这便是目录遍历漏洞

  • 可能有人会问,文件名不是不能包含/么?的确是这样,但数据文件中的数据却可以包含/
    例如,读取某个数据文件内的数据,这个数据是某个文件名。然后获取该指定文件的绝对地址,并将其发送
    此时数据文件内的文件名就不受影响,可以内含反斜杠,因为此时其只是一段数据。
    如果这个数据文件是精心构建的,那很有可能会把敏感文件发送出去。

4. 迭代器失效漏洞

以CVE-2020-6541、CVE-2020-6549为例,该类漏洞大多都是按这样的一个流程来触发UAF漏洞的

循环迭代某个元素集合Set,以执行函数A
在函数A内部,执行...
...
在函数M内部,修改Set集合的元素个数(插入或删除元素),之后函数返回

这样,当控制流从函数M依次向上返回至最上的迭代循环后,由于所遍历的元素集合被修改,因此下一次所使用的迭代器将失效。这样就会造成UAF漏洞。

Continuing…


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK