curl 8.23.0 一次修复 24 个 CVE:SMB 协议移除、符号改名与 --no-clobber 改动
curl 8.23.0 于 2026 年 10 月 14 日发布,作者 Daniel Stenberg。完整变更记录见 curl.se/ch/8.23.0.html,GitHub 上的 tag 为 curl-8_23_0。
发布数字
- 第 277 个版本,距上一个版本 42 天(累计 10,929 天)
- 281 个 bugfix(累计 14,770),476 个 commit(累计 40,084)
- 4 项变更
- 0 个新增公开 libcurl 函数(累计 100)、0 个新增
curl_easy_setopt()选项(累计 312)、0 个新增命令行选项(累计 278) - 84 位贡献者(58 位新面孔,累计 3,844);45 位作者(28 位新,累计 1,546)
- 24 个安全修复(累计 239)
24 个安全修复意味着什么
官方公告原文只说了一句:这次公布不少于 24 个已修复漏洞,数量太多,所以不再逐条列出,请到 curl 官网的安全页面查看。对使用者而言,这个数字的实际含义是:8.23.0 之前的版本同时带着 24 个已知问题,升级不是“要不要”的问题,而是“多快”的问题。
按脚本执行的工程做法:
- 本周期内完成升级:把这批 CVE 当作有明确时间窗的补丁批次处理,而不是等下一个维护窗口。
- 脚本里固定版本的镜像必须重建:
FROM curlimages/curl:8.22.0这类写死 tag 的 Dockerfile、CI 基础镜像、内部封装的 tar 包,都不会自动跟着升。tag 不改,漏洞就一直在。改 tag 后重新构建,并确认新镜像里curl -V显示 8.23.0。
# 升级后确认版本
curl -V
curl --version
SMB(S) 支持被彻底移除
curl 和 libcurl 都不再支持 SMB/SMBs 协议。这不是默认关闭,而是从代码里删除了。
原来用 curl 拉 smb:// 的脚本、备份任务、定时拉取作业,升级后会直接失败:
# 8.23.0 之前
curl -u user:pass smb://fileserver/share/backup.tar.gz -o backup.tar.gz
8.23.0 上这条命令会因为协议不被支持而报错。替代方案是 smbclient:
smbclient //fileserver/share -U 'user%pass' -c 'get backup.tar.gz backup.tar.gz'
迁移前先扫一遍脚本里有没有残留的 SMB 调用:
grep -rn 'smb://\|smbs://' /path/to/scripts
CURL_GLOBAL_WIN32 改名为 CURL_GLOBAL_WINSOCK
配合 curl_global_init() 使用的符号 CURL_GLOBAL_WIN32 已废弃,新名字是语义更准确的 CURL_GLOBAL_WINSOCK。
老代码仍引用旧符号时属于废弃用法:编译一般能过,但会出 deprecation 警告;如果构建里开了 -Werror,警告会直接变成编译失败。源码里全局替换,并确认没有同时在用新旧两个名字,就能避免这类兼容问题。
/* 旧 */
curl_global_init(CURL_GLOBAL_WIN32);
/* 新 */
curl_global_init(CURL_GLOBAL_WINSOCK);
--no-clobber 的两处改进
--no-clobber 改动了两点:
- 编号插在扩展名之前,产出
file-1.txt,不再是file.txt-1。 - 放弃前尝试的编号上限提高到 9999,文件同名冲突多的时候不容易提前失败。
curl -O --no-clobber https://example.com/file.txt # file.txt
curl -O --no-clobber https://example.com/file.txt # file-1.txt
脚本里如果对下载后的文件名做了字符串匹配或重命名,需要跟着改,尤其是原来按 file.txt-1 这种形式写的规则。
自查与版本固定
查看当前版本和编译进来的协议列表:
curl --version
curl -V
curl -V 输出的 Protocols: 一行就是支持清单,升级后可以直接确认 SMB 是否已经消失:
curl -V | grep -i smb # 无输出表示已不支持
需要固定版本的场景,包管理器侧锁定到明确版本(实际版本号以所用仓库为准):
apt-cache policy curl # 查看仓库里可用的版本
sudo apt-get install curl=
容器和脚本里固定 tag,升级时显式改 tag 并重建,不要让“固定版本”变成“固定漏洞”。
本次共合并 260 多个 bugfix,其余条目见 8.23.0 的 changelog。