Haxx curl/libcurl 安全漏洞修复参考
libcurl是一个免费,易用的客户端传输库,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP等协议。libcurl支持SSL认证,HTTP POST, HTTP PUT, FTP 上传, HTTP form based upload, proxies, cookies,用户名 密码认证(Basic, Digest, NTLM, Negotiate, Kerberos),文件断点续传,http代理转发。
低版本的libcurl存在较多低危、中危安全漏洞,如CVE-2020-8284、CVE-2020-8285、CVE-2020-8286
部分漏洞的原因
- 1、CVE-2020-8284
当 curl 执行被动 FTP 传输时,会首先尝试该EPSV
命令,如果不支持该命令,则回退到使用PASV
,而服务器对PASV
命令的响应包括 (IPv4) 地址和端口号,供客户端连接以执行实际数据传输。
攻击者可以恶意利用针对curl的FTP PASV响应来绕过对数据的访问限制,获取敏感信息
- 2、 CVE-2020-8285
libcurl 提供通配符匹配功能CURLOPT_CHUNK_BGN_FUNCTION
当 libcurl 遍历所有可用条目的列表时,该功能允许回调,将有关如何处理目录中的特定条目信息返回给 libcurl。
当此回调返回时,CURL_CHUNK_BGN_FUNC_SKIP
功能会告诉 libcurl 不处理该文件,然后libcurl中的内部函数递归调用自身以处理下一个目录条目。
如果有足够数量的文件条目并且回调返回“跳过”的次数足够多时,则 libcurl 会耗尽堆栈空间。(确切的数量和平台架构、编译器因素有关)
攻击者会利用此机制,控制覆盖堆栈的数据,造成拒绝服务
- 3、CVE-2020-8286
libcurl 通过CURLOPT_SSL_VERIFYSTATUS
选项提供“OCSP Stapling”功能(客户端向服务端发起 SSL 握手请求时,服务器将证书的 OCSP 信息随证书链一同发送给客户端,已提升OCSP访问性能) 。设置后,libcurl 验证服务器可作为 TLS 握手的一部分来响应 OCSP,但是 libcurl 在构建或被告知使用 OpenSSL 作为 TLS 后端时,客户端并未验证正确的证书设置,此缺陷将允许攻击进行欺诈性的 OCSP 响应,而不是真实响应(类似中间人欺骗),导致弱身份验证成功
针对低版本的libcurl,官方已经在新版的curl源码中,进行了修复(日志:https://github.com/curl/curl/commit/d9d01672785b),如下图:
这里介绍通过源码编译高版本curl的方式,对libcurl进行升级,来修复安全漏洞
0、备份服务器
如为云服务器,建议先备份服务器快照或镜像,避免升级的版本和之前业务不兼容导致服务出现异常
1、编译安装较高版本curl
如下命令:
代码语言:txt复制wget https://curl.se/download/curl-7.80.0.tar.gz --no-check-certificate #下载官方源码包
#解压缩、编译安装
tar -xzvf curl-7.80.0.tar.gz
cd curl-7.80.0
./configure --with-openssl
make -j4 && make install #默认安装位置在/usr/local/bin/curl
#查看安装后的版本
/usr/local/bin/curl -V
2、卸载低版本的curl
如下命令:
代码语言:txt复制#ubuntu操作系统
apt remove curl -y #卸载旧版本curl
ln -s /usr/local/bin/curl /usr/bin/curl #添加编译的高版本curl到环境变量
#centos操作系统
yum remove curl -y #卸载旧版本curl
ln -s /usr/local/bin/curl /usr/bin/curl #添加编译的高版本curl到环境变量
3、避“坑”参考
3.1 编译报错
- 编译时遇到报错
--with-openssl was given but OpenSSL could not be detected
解决方法:
代码语言:txt复制#安装openssl和openssl的库/头文件 包
#ubuntu操作系统,分开执行下面的命令
sudo apt install openssl
sudo apt install libssl-dev
#centos操作系统
yum -y install openssl openssl-devel
- 编译时,报错
/usr/bin/ld: cannot find crti.o: No such file or directory
或者 类似C compiler cannot create executables
原因:
早期旧版本的Ubuntu等操作系统,混合编译缺少支持,需要安装gcc-multilib
解决方法:
代码语言:txt复制sudo apt install gcc-multilib
3.2 新版本curl执行报错
- 安装完成后,执行curl命令
/usr/local/bin/curl -V
报错/usr/local/bin/curl: symbol lookup error: /usr/local/bin/curl: undefined symbol: curl_multi_poll
原因:
未找到动态库引用位置,需要添加动态库路径到系统动态库配置文件
解决方法:
代码语言:txt复制#添加动态库路径到系统动态库配置文件
echo "/usr/lib" >> /etc/ld.so.conf
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig -v && ldconfig /etc/ld.so.conf
#再次验证版本
/usr/local/bin/curl -V