作为当今用途最广的开源项目之一,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_USER, CURLOPT_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/
评论