一些有趣的漏洞模式

简介

  • 这里会持续记录平常见到的一些漏洞模式

1. 条件竞争

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

  • 例子:

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

2. 整数溢出

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

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

  • 例子

    • 例1

      1
      2
      3
      4
      // dataLen可控
      ptr = realloc(ptr, metaLen + dataLen);
      // 当metaLen + dataLen上溢时,realloc只会分配一块较小的内存
      // 这样就可以实现堆溢出
    • 例2

      1
      2
      3
      4
      5
      6
      int total_len;
      int meta_len;
      ...
      // meta_len可控
      unsigned int data_len = total_len - meta_len;
      // 此时data_len就会变的很大,例:(unsigned)(-1) = 0xFFFF
  • 整数溢出的判别方式

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

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

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

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

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

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

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

      1
      2
      3
      4
      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漏洞的

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

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

Continuing…

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2021 Kiprey
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~