硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

我们很高兴在 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:5012479

评论

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

如何学习

石小天

学习 学习方法 如何学习 技术学习

ARTS 打卡 第一周,ARTS我来啦!

闫同学

ARTS 打卡计划

车载语音识别数据的社会影响与未来展望

数据堂

Go 输出函数

小万哥

Go 编程 程序员 后端 开发

磁盘管理工具推荐DiskCatalogMaker 最新激活中文

胖墩儿不胖y

磁盘清理 磁盘管理 Mac软件 清理磁盘软件

代码随想录Day59 - 单调栈(二)

jjn0703

Zebec在Nautilus Chain 开启质押,ZBC 将极致通缩

西柚子

Presto 设计与实现(九):SQL 词法分析

冰心的小屋

数据湖 词法分析器 presto 设计与实现

探索 React 初体验:从零开始构建你的第一个应用

麦田的守望者

基于RUM高效治理网站用户体验入门-价值篇

Yestodorrow

可观测性

代码随想录Day60 - 单调栈(三)

jjn0703

技术思维和产品思维

老张

产品思维 技术思维 解决问题

3D渲染动画制作 KeyShot 2023.2 Pro 补丁安装教程

胖墩儿不胖y

3D渲染 动画制作 Mac软件 渲染工具

ARTS 打卡第 2 周

Johnson

AI arts

文心一言 VS 讯飞星火 VS chatgpt (82)-- 算法导论8.1 1题

福大大架构师每日一题

福大大架构师每日一题

ARTS 打卡 第二周

一期一会

pandas ARTS 打卡计划 职业发展 LLMs

5分钟搞懂K8S Pod Terminating/Unknown故障排查

俞凡

Kubernetes 最佳实践 云原生

工赋开发者社区 | 以智能制造为主攻方向,扎实推进新型工业化

工赋开发者社区

工赋开发者社区 | 工业智能化背景下制造业大数据的应用

工赋开发者社区

代码随想录Day61 - 完篇总结

jjn0703

寻找注册配置中心最佳评测官,赢取丰厚奖品 | 测评开启,开发者请速速集结

阿里巴巴云原生

阿里云 微服务 云原生

【INFINI Workshop 深圳站】8 月 31 日一起动手实验玩转 Easysearch

极限实验室

深圳 INFINI Labs Workshop 极限科技

R语言之缺失值处理

timerring

R语言

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