写点什么

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

评论

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

华为云官网负责人明哥:我们是如何做到门面不倒,8个月挑战业界翘楚?

华为云开发者联盟

JavaScript node.js Serverless 云原生 大前端

python str模块

若尘

Python编程 str 5月日更

聊聊人像抠图背后的算法技术

华为云开发者联盟

hilens 抠图 工程 抠图算法 baseline

GitHub开源:狗屁不通文章生成器

不脱发的程序猿

GitHub 开源 狗屁不通文章生成器

Nginx性能分析之gpreftools

运维研习社

nginx 性能分析 5月日更

音视频在智能手表上的应用

anyRTC开发者

音视频 WebRTC IoT RTC

SecSolar:为代码“捉虫”,让你能更专心写代码

华为云开发者联盟

代码 华为云 CloudIDE 代码安全检测 SecSolar

华为中国生态大会2021举行在即,GaussDB将重磅发布5大解决方案

华为云开发者联盟

数据库 opengauss 华为云 GaussDB 云数据库

单片机I/O控制方式(UART中断和DMA中断的区别)

不脱发的程序猿

嵌入式 单片机 GPIO的原理、特性 单片机I/O设备的控制方式

KubeVela + KEDA:为应用带来“与生俱来”的弹性伸缩能力

阿里巴巴云原生

容器 开发者 云原生 监控 中间件

双非渣硕,是如何拿到苏宁、阿里的offer的?(分享学习心得)

Java 程序员 架构 面试

Golang command source code

escray

学习 极客时间 Go 语言 5月日更

灵魂拷问:后端业务开发要会用 K8s 到什么程度?

阿里巴巴云原生

容器 运维 云原生 k8s 存储

雀食蟀!Java Netty实战入门

北游学Java

Java Netty 网络 框架

SpringBoot技术专题—来看看异步处理返回方案

洛神灬殇

Java WebAsyncTask 5月日更 AsyncContext DeferredResult

真实的DevOps落地,应该是这样的 ↓

BoCloud博云

DevOps 敏捷开发

🕋【Redis干货领域】彻底走进主从架构的世界(入门篇)

洛神灬殇

主从同步 Redis 核心技术与实战 5月日更 Redis系列专题 原理篇

Fluid 进入 CNCF Sandbox,加速大数据和 AI 应用拥抱云原生

阿里巴巴云原生

人工智能 容器 云原生 调度 弹性计算

test1

靠谱哥

PyQt5 实现可空值的 QDateTimeEdit

一代咩神

Python PyQt QDateTimeEdit

这个好用的分布式应用配置中心,我们把它开源了

百度Geek说

分布式 大前端 服务器

百信银行基于 Apache Hudi 实时数据湖演进方案

Apache Flink

大数据 flink

51CTO熊平:HarmonyOS是大势所趋

科技汇

音视频实战(6)- RTSP媒体协议流的录制方案及其覆盖策略详解

liuzhen007

音视频 5月日更 签约计划第二季

【死磕JVM】用Arthas排查JVM内存 真爽!我从小用到大

牧小农

JVM

微服务转型系列4:理念指导实践,厘清微服务建设的主要内容和顺序

BoCloud博云

微服务

参照STM32时钟树配置STM32CubeMX Clock Configuration(STM32L011G4U6为例)

不脱发的程序猿

单片机 STM32微控制器 时钟树 STM32CubeMX STM32时钟配置

Java开发5年,我为什么选择从蚂蚁金服离职?浅谈经历和经验!

Java架构追梦

Java 架构 面试 蚂蚁金服 经历分享

Flink+Clickhouse构建实时数仓的最佳实践

Wping

大数据 flink 实时数仓 Clickhouse

抱歉,“行业毒瘤”这个锅,低/无代码不背

陈思

低代码 无代码 低代码平台 无代码平台

iOS 面试策略之语言工具-Xcode使用

iOSer

ios xcode 语言 & 开发

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