Linux开源组件升级指导


在计算机科学领域中,“开源”是一个特殊的词汇,代表的是一种允许免费使用、改进和共享代码的软件开发模式。

Linux开源项目正是基于这个特殊的模式,通过共享源代码,大力促进了Linux操作系统的发展与进步。Linux诞生于1991年,那时Linus Torvalds才21岁。他当时只是想为自己开发一款可用于编程的免费操作系统。随着时间的推移,Linux逐渐流行,成为世界上最出色的操作系统之一。

1. Linux开源组件

Linux是一个开源操作系统,系统中的开源项目是极其庞大而复杂的,但是这些开源项目为开发者和用户带来了极大的便利。Linux有很多开源组件可供使用。以下是一些常见的 Linux 开源组件:

  1. GNU Core Utilities(核心工具集):包括命令行工具如ls、cp、mv、rm等,提供了基本的文件和进程管理功能。
  2. Bash(Bourne Again SHell):是一个常用的命令行解释器和脚本语言,提供了交互式的命令行界面。
  3. GCC(GNU Compiler Collection):是一套开源的编译器工具链,包含了 C、C++、Fortran 等多种编程语言的编译器。
  4. Glibc(GNU C Library):是 GNU 项目的标准 C 库,提供了基本的系统调用接口和库函数。
  5. Linux Kernel(Linux 内核):是 Linux 操作系统的核心部分,负责底层硬件管理和系统资源调度。
  6. X Window System(X11):是一个窗口系统协议和运行时环境,为 Linux 提供了图形用户界面(GUI)的支持。
  7. Apache HTTP Server:是一个流行的开源 Web 服务器软件,常用于搭建网站和应用服务。
  8. MySQL 和 PostgreSQL:是两个常用的开源关系型数据库管理系统(RDBMS),提供了数据存储和查询功能。
  9. OpenSSH:是一个用于安全远程登录和文件传输的开源工具,提供了 SSH 协议的实现。
  10. OpenSSL:是一个开源的加密库,提供了各种加密算法和安全协议的实现。

除上述组件外,还有许多其他的开源组件可用于 Linux 系统,用于各种不同的用途,如网络通信、图形界面开发、数据分析等。这些开源组件为 Linux 提供了强大的功能和灵活性,并且能够根据需求进行定制和扩展。

3UK Penetration Test通常会检测当前开源组件是否为最新,该版本是否有公开漏洞,若版本不是最新或存在公开漏洞,则需要对其进行升级或修复,下文以curl为例主要讲解如何去升级相关组件。

2. CURL

CURL(客户端URL)是一个开放源代码的命令行工具,也是一个跨平台的库(libcurl),用于在服务器之间传输数据,并分发给几乎所有新的操作系统。CURL编程用于需要通过Internet协议发送或接收数据的几乎任何地方。

CURL支持几乎所有的互联网协议(DICT,FILE,FTP,FTPS,GOPHER,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,MQTT,POP3,POP3S,RTMP,RTMPS,RTSP,SCP,SFTP,SMB,SMBS,SMTP ,SMTPS,TELNET和TFTP)。

CURL旨在通过互联网协议传输数据。其他所有内容均不在其范围内。它甚至不处理传输的数据,仅执行传输流程。

CURL可用于调试。例如使用“ curl -v https://oxylabs.io ”可以显示一个连接请求的详细输出,包括用户代理,握手数据,端口等详细信息。

2.1 版本确认

sdx12使用的是Yocto构建框架,因此我们可以直接在poky目录下找到bitbake编译脚本,来确认当前使用的curl版本,curl的bb文件在sdx12-ap\poky\meta\recipes-support\curl下

~/sdx12-ap/poky/meta/recipes-support/curl$ ls
curl  curl_7.61.0.bb

通过确认当前使用的是curl 7.61.0版本(有时目录下会有多个bb文件,但通常bitbake编译会使用高版本),打开bb文件我们可以看到该版本会打很多CVE patch,说明它已经有多个已修复的公开漏洞:

在这里插入图片描述
我们也可以通过上述文件中的SRC_URI = http://curl.haxx.se/download/curl-${PV}.tar.bz2信息找到curl源码下载网站,去查询当前最新的curl版本是哪个:
在这里插入图片描述

或访问curl官网https://curl.se/,也是可以查询到当前最新版本:
在这里插入图片描述
两种方式均可确认最新版本是8.4.0,且发布日期为2023-10-11,也可在上述链接中下载历史版本。

2.2 Curl升级

根据 http://t.csdnimg.cn/5JiF3 文章中的方法,我们确认只要升级8.3.0-3及之后的版本,就不会有公开的CVE漏洞,通过确认两个vulnerable(易受攻击的)的Open issues的提交点,发现curl官网发布的8.3.0不包含这两笔提交,也就是说我们必须使用8.4.0版本,或我们手动根据fixed的提交记录去合入到8.3.0版本上。由于8.4.0版本为当日发布,未经过全方位测试,所以我们此处升级8.3.0版本。

在sdx12-ap\poky\meta\recipes-support\curl下编写8.3.0的bb文件curl_8.3.0.bb,该文件可以自己根据bitbake规则编写(参考bitbake手册https://docs.yoctoproject.org/),也可以去yocto的git网站https://git.yoctoproject.org/poky/tree/去下载,下载下来需要按照自己的编译系统进行修改即可以使用。比如此处我修改后的curl_8.3.0.bb。

sdx12-ap\poky\meta\recipes-support\curl\curl_8.3.0.bb
SUMMARY = "Command line tool and library for client-side URL transfers"
HOMEPAGE = "http://curl.haxx.se/"
BUGTRACKER = "http://curl.haxx.se/mail/list.cgi?list=curl-tracker"
SECTION = "console/network"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://COPYING;md5=db8448a1e43eb2125f7740fc397db1f6"
SRC_URI = "http://curl.haxx.se/download/curl-${PV}.tar.bz2 \
           file:// CVE-2023-38546.patch \
           file:// CVE-2023-38545.patch \
"
SRC_URI[md5sum] = "d6d62938ae89add211d07c4f8d3a8748"
SRC_URI[sha256sum] = "051a217095671e925a129ba9e2ff2e223b44b08399003ba50738060955d010ff"
CVE_PRODUCT = "curl libcurl"
inherit autotools pkgconfig binconfig multilib_header
PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'ipv6', d)} gnutls libidn proxy threaded-resolver verbose zlib"
PACKAGECONFIG_class-native = "ipv6 proxy ssl threaded-resolver verbose zlib"
PACKAGECONFIG_class-nativesdk = "ipv6 proxy ssl threaded-resolver verbose zlib"
# 'ares' and 'threaded-resolver' are mutually exclusivePACKAGECONFIG[ares] = "--enable-ares,--disable-ares,c-ares"
PACKAGECONFIG[brotli] = "--with-brotli,--without-brotli,brotli"
PACKAGECONFIG[builtinmanual] = "--enable-manual,--disable-manual"
PACKAGECONFIG[dict] = "--enable-dict,--disable-dict,"
PACKAGECONFIG[gnutls] = "--with-gnutls,--without-gnutls,gnutls"
PACKAGECONFIG[gopher] = "--enable-gopher,--disable-gopher,"
PACKAGECONFIG[imap] = "--enable-imap,--disable-imap,"
PACKAGECONFIG[ipv6] = "--enable-ipv6,--disable-ipv6,"
PACKAGECONFIG[krb5] = "--with-gssapi,--without-gssapi,krb5"
PACKAGECONFIG[ldap] = "--enable-ldap,--disable-ldap,"
PACKAGECONFIG[ldaps] = "--enable-ldaps,--disable-ldaps,"
PACKAGECONFIG[libidn] = "--with-libidn2,--without-libidn2,libidn2"
PACKAGECONFIG[libssh2] = "--with-libssh2,--without-libssh2,libssh2"
PACKAGECONFIG[mbedtls] = "--with-mbedtls=${STAGING_DIR_TARGET},--without-mbedtls,mbedtls"
PACKAGECONFIG[nghttp2] = "--with-nghttp2,--without-nghttp2,nghttp2"
PACKAGECONFIG[pop3] = "--enable-pop3,--disable-pop3,"
PACKAGECONFIG[proxy] = "--enable-proxy,--disable-proxy,"
PACKAGECONFIG[rtmpdump] = "--with-librtmp,--without-librtmp,rtmpdump"
PACKAGECONFIG[rtsp] = "--enable-rtsp,--disable-rtsp,"
PACKAGECONFIG[smb] = "--enable-smb,--disable-smb,"
PACKAGECONFIG[smtp] = "--enable-smtp,--disable-smtp,"
PACKAGECONFIG[ssl] = "--without-ssl --with-random=/dev/urandom,openssl"
PACKAGECONFIG[telnet] = "--enable-telnet,--disable-telnet,"
PACKAGECONFIG[tftp] = "--enable-tftp,--disable-tftp,"
PACKAGECONFIG[threaded-resolver] = "--enable-threaded-resolver,--disable-threaded-resolver"
PACKAGECONFIG[verbose] = "--enable-verbose,--disable-verbose"
PACKAGECONFIG[zlib] = "--with-zlib=${STAGING_LIBDIR}/../,--without-zlib,zlib"
EXTRA_OECONF = " \
    --disable-libcurl-option \
    --disable-ntlm-wb \
    --enable-crypto-auth \
    --with-ca-bundle=${sysconfdir}/ssl/certs/ca-certificates.crt \
    --without-libpsl \
"
do_install_append_class-target() {
	# cleanup buildpaths from curl-config
	sed -i \
	    -e 's,--sysroot=${STAGING_DIR_TARGET},,g' \
	    -e 's,--with-libtool-sysroot=${STAGING_DIR_TARGET},,g' \
	    -e 's|${DEBUG_PREFIX_MAP}||g' \
	    ${D}${bindir}/curl-config
}
PACKAGES =+ "lib${BPN}"
FILES_lib${BPN} = "${libdir}/lib*.so.*"
RRECOMMENDS_lib${BPN} += "ca-certificates"
FILES_${PN} += "${datadir}/zsh"
inherit multilib_script
MULTILIB_SCRIPTS = "${PN}-dev:${bindir}/curl-config"
BBCLASSEXTEND = "native nativesdk"

需要关注的是这几行,1-3行分别代表了liscense文件和源码tar包的校验码,需要和源码tar包的校验码完全一样,否则会校验不过,无法从开源网站上下载到匹配的源码包,最终会编译失败;4-6行是源码下载地址以及需要合入的patch,这两个patch就是vulnerable(易受攻击的)的Open issues的CVE代码提交。

LIC_FILES_CHKSUM = file://COPYING;md5=db8448a1e43eb2125f7740fc397db1f6
SRC_URI[md5sum] = "d6d62938ae89add211d07c4f8d3a8748"
SRC_URI[sha256sum] = "051a217095671e925a129ba9e2ff2e223b44b08399003ba50738060955d010ff"
SRC_URI = "http://curl.haxx.se/download/curl-${PV}.tar.bz2 \
           file:// CVE-2023-38546.patch \
           file:// CVE-2023-38545.patch \
"

2.3 Curl编译验证

由于使用的是bitbake编译系统,则全编镜像或单编curl均可。下面我们贴出我们的验证结果:
在这里插入图片描述

可以看到curl bin文件和lib文件,均已升级到8.3.0版本,目标达成。

其他开源组件升级方法与curl基本一致,可以curl为例进行版本升级验证。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四儿家的小祖宗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值