写点什么

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

评论

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

到底什么才是DaaS数据即服务?别再被其他DaaS概念给误导了

雨果

DaaS数据即服务

关于对JavaScript变量提升的理解

是乃德也是Ned

JavaScript 前端 7月月更

资深工程师的技术方案思考模型

刘绍

方法论 工程师 软件设计 技术方案 程序员进阶

国内酒店交易DDD应用与实践——代码篇

Qunar技术沙龙

架构

毕业设计项目

michael

架构实战营 #架构实战营 「架构实战营」

疫情来袭--远程办公之思考|社区征文

桑榆

初夏征文

【Python技能树共建】Beautiful Soup

梦想橡皮擦

Python 7月月更

EventBridge 在 SaaS 企业集成领域的探索与实践

阿里巴巴云原生

阿里云 云原生 SaaS 事件总线

免费商城系统源码——如何选择?

开源直播系统源码

二次开发 免费源码 商城源码 免费商城源码

【LeetCode】粉刷房子Java题解

Albert

LeetCode 7月月更

CSS 文本阴影 text-shadow 悬停效果

南城FE

前端 动画 HTML5, CSS3 7月月更 hover

SAP UI5 应用的主-从-从(Master-Detail-Detail)布局模式的实现步骤

汪子熙

前端开发 SAP UI5 ui5 web前端开发 7月月更

从0到1建设智能灰度数据体系:以vivo游戏中心为例

vivo互联网技术

数据分析 根因分析 数据分析体系

高中肄业,从月薪1000到几亿融资的创业者,是它拯救了我!

博文视点Broadview

叮~您有一封Vue.js挑战邀请函,请查收

😶

JavaScript vue.js 前端 前端开发 开源项目

Container killed by YARN for exceeding memory limits

怀瑾握瑜的嘉与嘉

spark 7月月更

如何有效远程办公之我见 | 社区征文

踏雪痕

远程办公 居家办公 初夏征文

图解网络:什么是热备份路由器协议HSRP?

wljslmz

网络技术 路由协议 7月月更 热备份路由器协议 HSRP

Spring Cloud源码分析之Eureka篇第一章:准备工作

程序员欣宸

Java spring SpringCloud 7月月更

毕业总结

michael

架构实战营 #架构实战营 「架构实战营」

Go 语言入门很简单:Go 实现凯撒密码

宇宙之一粟

密码学 Go 语言 7月月更

函数计算异步任务能力介绍 - 任务触发去重

阿里巴巴云原生

阿里云 Serverless 云原生 函数计算

程序员的焦虑

沃德

程序员 7月月更

程序员转方向

沃德

程序员 7月月更

JDBC 进阶

武师叔

7月月更

Spring Cloud Alibaba 2.2.8 版本发布与社区未来规划介绍

阿里巴巴云原生

阿里云 云原生 spring cloud alibaba

ORACLE进阶(二)视图详解

No Silver Bullet

oracle 视图 7月月更

小程序直播 + 电商,想做新零售电商就用它吧!

CRMEB

如何远程办公更有效率 | 社区征文

宇宙之一粟

效率 居家办公 初夏征文

自主工业软件的创新与发展

极客天地

Qt如何实现打包,实现EXE分享

小肉球

qt 7月月更

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