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
部分漏洞的原因
当 curl 执行被动 FTP 传输时,会首先尝试该EPSV
命令,如果不支持该命令,则回退到使用PASV
,而服务器对PASV
命令的响应包括 (IPv4) 地址和端口号,供客户端连接以执行实际数据传输。
攻击者可以恶意利用针对curl的FTP PASV响应来绕过对数据的访问限制,获取敏感信息
libcurl 提供通配符匹配功能CURLOPT_CHUNK_BGN_FUNCTION
当 libcurl 遍历所有可用条目的列表时,该功能允许回调,将有关如何处理目录中的特定条目信息返回给 libcurl。
当此回调返回时,CURL_CHUNK_BGN_FUNC_SKIP
功能会告诉 libcurl 不处理该文件,然后libcurl中的内部函数递归调用自身以处理下一个目录条目。
如果有足够数量的文件条目并且回调返回“跳过”的次数足够多时,则 libcurl 会耗尽堆栈空间。(确切的数量和平台架构、编译器因素有关)
攻击者会利用此机制,控制覆盖堆栈的数据,造成拒绝服务
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进行升级,来修复安全漏洞
如为云服务器,建议先备份服务器快照或镜像,避免升级的版本和之前业务不兼容导致服务出现异常
如下命令:
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
如下命令:
#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到环境变量
--with-openssl was given but OpenSSL could not be detected
解决方法:
#安装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
解决方法:
sudo apt install gcc-multilib
/usr/local/bin/curl -V
报错 /usr/local/bin/curl: symbol lookup error: /usr/local/bin/curl: undefined symbol: curl_multi_poll
原因:
未找到动态库引用位置,需要添加动态库路径到系统动态库配置文件
解决方法:
#添加动态库路径到系统动态库配置文件
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
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。