写点什么

我们很高兴在 curl 25 岁生日之际发布 curl 8.0

  • 2023-03-24
    北京
  • 本文字数:2647 字

    阅读完需:约 9 分钟

我们很高兴在 curl 25 岁生日之际发布curl 8.0

作为当今用途最广的开源项目之一,curl 在全世界有超过 100 亿的安装。从红帽 Linux、Debian 再到 Mac OS、Windows 10、iOS 和 Android,甚至包括任天堂 Switch、Xbox 和索尼 PS5 以及电脑游戏、媒体播放器和机顶盒等,都不乏 curl 的身影。

 

curl 的官方生日是 1998 年 3 月 20 日,这一天,第一个可构建出工具名为 curl 的 tar 包发布。今年是 curl 诞生 25 周年,curl 首席开发者 Daniel Stenberg 的发布公告,官方表示这可能是他们做过的最好的 curl 版本。

 

虽然头顶主要版本的编号,但 8.0.0 并未做出任何突破性的变更或升级。原本此次是要作为次要版本推出的,主要降低管理难度,但恰逢 curl 诞生 25 周年,所以决定用 8.0.0 的名头表示庆贺。这次的版本不含任何 API 或 ABI 中断。


用数字说话


  • 第 215 次发布

  • 1 项变更

  • 历时 28 天(项目总周期已达 9131 天)

  • 修复 130 个 bug(总计修复 8820 个 bug)

  • 189 项提交(总计 30042 项提交)

  • 0 个新的公共 libcurl 函数(总计 91 个)

  • 0 个新的 curl_easy_setopt()选项(总计 302 个)

  • 0 个新的 curl 命令行选项(总计 250 个)

  • 42 位贡献者,23 位新贡献者(总计 2841 位)

  • 21 位作者,5 位新作者(总计 1125 位)

  • 6 项安全修复(总计 141 项)

 

安全性


此次披露了 6 个新漏洞,其中 5 个严重程度为,1 个为

 

CVE-2023-27533: TELNET 选项 IAC 注入


curl 支持使用 TELNET 协议进行通信;作为其中一环,curl 允许用户传递用户名和“telnet 选项”以进行服务器协商。

 

由于缺少适当的输入清理和记录功能,curl 会将用户名和 telnet 选项传递给所提供的服务器。因此,用户可能故意违背应用程序的设计初衷,借此篡改传递内容或执行选项协商。特别是在应用程序允许用户提供数据或部分数据的情况下。

CVE-2023-27534: SFTP 路径~解析错误


curl 支持 SFTP 传输。curl 的 SFTP 实现会在 URL 的路径组件中提供一项特殊功能:将波浪号(~)字符作为路径中的首个路径元素时,代表相对于用户主目录的路径。之所以支持这种用法,是因为 RFC 草案曾经提出过这种 SFTP URL 工作方式。

 

但受 bug 影响,对 SFTP 路径中波浪号的处理出现了意外错误:不仅在单独将波浪号作为首个路径元素时会予以替换,在作为首个元素的前缀时也会错误替换。

 

以/~2/foo 路径为例,当使用用户 dan(主目录为/home/dan)访问服务器时,该路径会错误访问文件/home/dan2/foo。

 

这个 bug 可能被用于回避过滤或实施其他恶意操作。

CVE-2023-27535: FTP 过连接重用


即使一个或多个选项已经变更,libcurl 仍会重用之前创建的 FTP 连接,这可能导致实际用户发生变化,最终利用错误凭证进行二次传输。

 

libcurl 会将之前使用过的连接保存在连接池中,以便后续传输与其中的连接匹配时加以重用。但配置匹配检查中遗漏了几个 FTP 设置,因此导致匹配率过高。遗漏的设置具体为 CURLOPT_FTP_ACCOUNT, CURLOPT_FTP_ALTERNATIVE_TO_USERCURLOPT_FTP_SSL_CCC 以及CURLOPT_USE_SSL级别。

CVE-2023-27536: GSS 委派过连接重用


即使 GSS 委派(CURLOPT_GSSAPI_DELEGATION)选项已经变更,libcurl 仍会重用先前创建的连接,可能导致在二次传输中更改用户权限。

 

libcurl 会将之前使用过的连接保存在连接池中,以便后续传输与其中的连接匹配时加以重用。但配置匹配检查并未纳入 GSS 委派设置,因此导致匹配率过高,会影响到 krb5/kerberos/negotiate/GSSAPI 的传输。

CVE-2023-27537: HSTS 的 double-free 漏洞


libcurl 支持在单独的“句柄”之间共享 HSTS 数据。但引入这种共享机制时并未考虑到跨单独线程的共享行为,而且说明文档中也未强调这种情况。

 

由于缺乏互斥锁或线程锁,在两个线程之间共享相同的 HSTS 数据最终可能导致 double-free 或 use-after-free 漏洞。

CVE-2023-27538: SSH 连接过重用


即使 SSH 相关选项已经变更,libcurl 仍会重用这些应被禁止重用的原有连接。

 

libcurl 会将之前使用过的连接保存在连接池中,以便后续传输与其中的连接匹配时加以重用。但由于配置匹配检查中遗漏了 2 项 SSH 设置,因此导致匹配率过高。

 

变更


8.0.0 版本中只有一项实际“变更”——首个不再支持在非 64 位数据类型系统上构建的 curl 版本。curl 现在要求 “long long”或存在等效项。

 

Bug 修复


8.0.0 的发布周期仅相当于常规周期的一半,但我们仍然合并了大量 bug 修复成果。下面来看值得重点介绍的几项关键修复。

 

构建: 弃用 XC_AMEND_DISTCLEAN 宏


单看描述好像不容易理解。这项变更删除了一个旧有 autotools 宏,该宏有时会导致 configure 将 Makefile“膨胀”至几 GB 大小。

 

连接: 修复 time_connect 与 time_appconnect 计时器统计信息


引入新的 h2/h3 连接方法后的回归。

 

curl.1: 列出所有“全局选项”


在使用--next 后仍然存在的命令行选项被称为“全局选项”,现在手册页面已经列出所有全局选项供大家查看。

 

为此,8.0.0 版本提供新的元数据“tag”,用于标记相应 docs 文件中的各全局选项。

 

ftp: 带 SSL 的活动模式,添加过滤器


回归:之前,活动模式下的 FTPS 未正确设置数据连接。

 

在多个解析器替换 sscanf()


对 sscanf()的调用由上个版本中的 24 次,精简到此版本中的 4 次。

 

协议头:使 curl_easy_header 和 nextheader 返回不同的缓冲区。

http2 bug 修复


  • 并行操作期间的错误处理

  • 修复了连接重用过期间 http2 的先验知识

  • RST 与 GOAWAY 能更好地识别某些传输

  • 避免上传忙循环

 

http: 不再为短 PUT 请求发送 100-continue


现在的处理方式与 curl 长期以来处理 POST 的方式更趋一致。

 

http: 修复 unix 域套接字在 https 连接中的使用


一项回退修复。

 

multi: 让 multi_perform 忽略/解除忽略信号频率的降低


当对很长的单个传输列表进行迭代“处理”时,可以尽可能保留先前状态以避免产生大量忽略/解除忽略序列。

 

multi: 从主链表中删除句柄


为了加快对大量被添加至多句柄中的待处理或已完成的简单句柄的处理速度,现在将这些简单句柄从主链表中移出至单独的队列当中。

 

rand: 可使用 arc4random 作为回退


如果平台能够支持,则 curl 构建可在没有 TLS 库的情况下变得更好随机。

 

urlapi: 不得使用‘%’作为主机名称


URL 解析器会错误接受含有“百分号(%)”的主机名称。解析器仍可接受以百分号编码的主机名称,并将其作为 IPv6 地址和区域 ID 之间的分隔符。

 

urlapi: 无需 ENABLE_IPV6 即可解析 IPv6 地址


为了让 URL 解析器的行为更加一致,新版本的解析器可以完美解析和处理 IPv6 地址,不再要求 IPv6 连接必须起效。

 

使用 c-ares 绑定至具有主机名的接口

 

在这里祝 curl 生日快乐,也欢迎大家体验 8.0.0 全新版本!


原文链接:

https://daniel.haxx.se/blog/2023/03/20/curl-8-0-0-is-here/


相关阅读:

软件测试 | 使用 CURL 发送请求

24 年了,终于有人发现 curl 的这个 Bug 了

Linux 的小知识 -curl 命令

技术分享 | 使用 cURL 发送请求

2023-03-24 15:5011502

评论

发布
暂无评论
发现更多内容

4轮字节面试后杳无音信,自己是在了备胎池了吗?感觉我的Android开发要凉了呀

android 程序员 移动开发

Android 10手势导航的侧滑返回效果优化策略,2021最新Android大厂面试真题大全

android 程序员 移动开发

5年内被辞退3次,35岁程序员该何去何从?百度,这些年Android面试的那些套路

android 程序员 移动开发

6年老Android2019面经总结,2021年抓住金三银四涨薪好时机

android 程序员 移动开发

95-后程序员一出校门就拿年薪-30多万?,android开发文档百度云

android 程序员 移动开发

Activity显示界面——说说View的那些理不清的关系,移动端h5页面适配

android 程序员 移动开发

Android AOSP 6,flutter面试题

android 程序员 移动开发

8年老司机教你,如何写出一份“有理有据使人信服,Android开发者必看避坑指南

android 程序员 移动开发

Android 11 中的存储机制更新,android项目开发实战入门光盘文件

android 程序员 移动开发

5G时代已经到来了,你还觉得Android行业凉了嘛?,Android面试官

android 程序员 移动开发

Android - singleTask启动模式详解(1),kotlinnative原理

android 程序员 移动开发

4年Android开发13K,刷完这份1307页Android-面试全套真题解析,跳槽涨薪15K

android 程序员 移动开发

5月份,京东 Android开发面经分享!,kotlin协程并发

android 程序员 移动开发

8年老Android开发谈;简化UI都没弄明白凭什么拿高薪?,android路由框架

android 程序员 移动开发

Android - AndroidStudio的下载、安装与配置,android开发艺术探索下载

android 程序员 移动开发

Android - singleTask启动模式详解,腾讯Android面试

android 程序员 移动开发

Android - 运行时权限一个工具类搞定,让人茅塞顿开

android 程序员 移动开发

Android AutoService 组件化,android完整项目源码

android 程序员 移动开发

50w字+的Android技术类校招面试题汇总(附答案,kotlin枚举反射

android 程序员 移动开发

606页Android最新面试题含答案,助力成为offer收割机,已开源

android 程序员 移动开发

8年老Android开发谈;Context都没弄明白凭什么拿高薪?

android 程序员 移动开发

@Android程序员:到底是Android不行了,1-3年的Android开发工程师看过来

android 程序员 移动开发

Android 9,flutter安装教程2019

android 程序员 移动开发

Android BLE基础框架全新改版,android音视频开发面试题

android 程序员 移动开发

Android Gradle 学习笔记整理,阿里Android面试必问

android 程序员 移动开发

Activity切换效果,androidwifi密码

android 程序员 移动开发

Android - 开发常用工具类Utils,真的已经讲烂了

android 程序员 移动开发

@Android程序员:不是安卓不行了,handler内存泄露

android 程序员 移动开发

Android - 更安全地保存静态密钥,android三种开发模式

android 程序员 移动开发

Android 11适配指南之系统相机拍照、打开相册,Android开发两年

android 程序员 移动开发

Android Gradle 常用配置,androidsdk环境配置

android 程序员 移动开发

我们很高兴在 curl 25 岁生日之际发布curl 8.0_语言 & 开发_Daniel Stenberg_InfoQ精选文章