LWN:如何确定采用dlopen()方式引入了哪些依赖!

ARM学习(27)链接库依赖学习(二)dlopen failed:library xxxx.so 链接装载学习 阅读详情

关注了就能看到更多这么棒的文章哦~

Identifying dependencies used via dlopen()

By Daroc Alden
April 16, 2024
ChatGLM translation
https://lwn.net/Articles/969908/

最近的XZ后门事件 在开源社区中引发了很多关于如何链接和打包软件的讨论。正在讨论的一个可能的安全改进是更改 systemd 这类项目链接仅用于可选功能的动态库的方式:使用dlopen()仅在需要时加载这些库。这可能会减小依赖关系导致的攻击面暴露,但该方法并非没有缺点 — 最突出的一个缺点是,它会让弄清楚程序依赖的动态库变得更加困难。4月 11 日,Lennart Poettering 在 GitHub 上的 systemd RFC 中提出了解决这个问题的一种方法。

实际上,systemd 项目已经开始消灭直接链接可选依赖项的行为 — 但不是出于安全原因。在 Poettering 在 Mastodon 上对他的提案的解释中,他指出:“使用 dlopen() 的主要原因是为了更容易地构建没有可选组件的小型磁盘映像,特别是用于 initrds 或容器部署的目的。”一些人推测,这个改动是导致"Jia Tan"在四月初就发起攻击的原因,而不是选择等到攻击方案更加健壮时再发起攻击。

然而,使用 dlopen() 有几个问题。其中一个是,与普通的动态链接不同,使用 dlopen() 会将依赖项提供的函数暴露为 void 指针,必须将其转换为正确的类型。如果依赖项中的类型与依赖程序中的类型不匹配,这可能会为类型混淆攻击打开大门。对 Poettering 在 Mastodon 上解释有担心的一些人认为,推广使用 dlopen() 会因此对安全性构成威胁。James Henstridge 说:“我想你可以通过不完全兼容的函数签名隐藏一些有趣的错误(例如,使参数截断为 32 位)。”Poettering 回答:

在当前的 systemd git 中,我们系统地使用了一些 typeof()宏魔法,确保我们总是将 dlopen()返回的函数指针转换为库头文件中列出的实际原型。因此,我们应该获得与进行常规动态库链接时相同的类型安全性保证。我们花了一些时间想出 typeof()可以用于此的想法,但这太神奇了,因为我们不再需要在我们的代码中重复其他库的原型。

Henstridge 在查看代码后同意这是“相当优雅的做法。它也巧妙地解决了将一个符号(symbol)分配给错误函数指针的问题。”然而,并非所有问题都如此轻松解决。根据 Poettering 的公告,真正的问题在于使用 dlopen() 从程序的 ELF 头部删除了有关其依赖项的信息。

现在,我认为这种方法有很多优点,但也有缺点。我个人认为优点远远大于缺点,但确实存在缺陷。最突出的一点是,将共享库依赖关系转换为 dlopen()依赖关系在某种程度上将它们隐藏在用户和工具的视图之外,因为上述工具将不再显示它们。关心此信息的工具包含软件包管理器,如 rpm/dpkg(它们喜欢基于 ELF 依赖关系生成自动软件包依赖关系),以及 initrd 生成器,如 dracut。

他提出的解决方案是采用一种新的约定,将可选依赖项明确列为程序本身的一部分。在 systemd RFC 中,他给出了一个示例,该示例使用宏将可选依赖项的名称嵌入到二进制文件的名为".note.uapi.dlopen"的特殊节中。 "UAPI"代表用户空间 API — 指的是Linux用户空间API组,这是一个相对较新的合作项目,其中包括分发、软件包管理器和大型软件项目,旨在为用户空间软件定义标准化接口。关于要在注释部分编码记录的内容的初始提议相对来说相当简单 — 原本只打算设置一个类型字段,字符串 "uapi" 表示 ELF section "vendor",以及所讨论的依赖项的名称。

Poettering 还明确表示,单独为 systemd 实现这一点是没有用的;只有当其他工具决定读取它并且其他项目也在选择实现它时,这个注释才有用。Mike Yuan 迅速积极评论了添加支持到 mkinitcpio 的可能性,mkinitcpio 是 Arch Linux 的 initramfs 生成工具,还有pacman,Arch 软件包管理器。

Luca Boccassi 同意他可以“研究添加一个 debhelper 附件工具”,但想知道是否应该有一种方式来指示依赖关系是真正可选的,还是说假如依赖项丢失那么程序将失败。Poettering 回答:“如果它是硬依赖关系,那么它不应该是 dlopen()的应用场景。毕竟,使用 dlopen()而不是常规 ELF 共享库依赖项的全部原因就是它们可以是弱依赖关系”,尽管他指出类型字段意味着“这打开了以后扩展的可能性。”

Antonio Álvarez Feijoo 提出了另一个问题,指出:“有些人对 initrd 的 size 非常挑剔,不喜欢包含那些不是真正必要的东西。[…]因此,知道哪些库是必需的,那很好,但如何知道哪个 systemd 组件需要它们?”Boccassi 回答说,这是一个示例,说明了是否需要依赖项的信息可能会有用。Poettering 不同意,断言“哪些库实际上包含在 initrd 中是由本地配置或发行版政策决定的。”最终,新注释部分的使用者可以根据自己的需要对信息做任何事情,包括自动生成依赖关系,或仅将它们用作“linter”,以抱怨尚未知道的新的弱依赖关系。

我认为所有这些方法都比现状要好:我们将添加一个弱依赖关系或将常规依赖关系转换为弱依赖关系,除非下游真的仔细阅读 NEWS(好吧,他们并不一定擅长),否则他们只会重新构建他们的软件包/initrd,现在一切都混乱了。

这一点得到了 Feijoo 的赞同,他认为将信息用作包定义的合理性检查是有道理的。

Carlos O'Donell 问道,Poettering 是否关心暴露 systemd 使用的特定符号和符号版本,指出现有的 ELF 头部包含了这些信息。他断言,在打包程序时,RPM 使用这些信息。Poettering 说道这是一个很好的问题,但回答道:

对于 systemd 的用例来说:尽管我们近来用到了相当多的库(实际上有 21 个),并且我们确实为我们自己的库提供了符号版本,但我们不会费心去列出我们用到的东西的符号版本。我们对所有这些都使用普通的 dlsym(),而不是 dlvsym()。

他接着指出,要求人们确定符号版本将是“一个重大的额外要求”。

Poettering 似乎认为将这一新提议整合到 GNU C 库(glibc)的现有动态链接实现中会有一些好处。他询问了O'Donell和Florian Weimer — 他们两个都参与了 glibc 项目 — “我们是否应该继续这个独立规范的过程,其中只是说 '.note.uapi.dlopen 包含这些数据,使用它或不使用它,bla bla bla'。还是说弱泄漏的概念让你感兴趣,你认为这应该在 glibc、binutils 等中本地实现?”一些其他操作系统 — 尤其是 macOS — 对于可选依赖项有一个本地的“弱链接”概念,所以将这些信息整合到构建系统和标准库中的想法并不新鲜。

Zbigniew Jędrzejewski-Szmek 提出了一个额外的问题 是关于新部分的格式的,问是否使用“紧凑的 JSON 表示”会有意义。Jędrzejewski-Szmek 说,这可以让人们轻松地添加一个人类可理解的描述依赖项用途的描述。有了这个补充,"将这个整合到 rpm 构建系统中应该是相当容易的。" Boccassi 同意这里的内容应该是 JSON 格式。Poettering 回答道:“我对使用 JSON 并没有意见,但关键是我们应该能够从一个简单的无依赖关系的 C 宏中来合理地生成。”

最终,对于可选依赖项有一个标准编码的想法似乎受到了良好的认可,有几个软件包管理器可能有兴趣添加支持。然而,随着讨论仍在进行中,新增信息的最终格式尚未确定,因此现在还为时过早。然而,任何旨在帮助缓解移除传统动态链接依赖项的痛苦的东西似乎都是一个好主意,因为它们减少了暴露给类似XZ后门的攻击的机会。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

5238ab8a7d0bac8484f771240081c3e2.jpeg

波士顿房价预测分析----以线性回归LinearRegression为例 波士顿房价数据集包括506个样本,每个样本包括13个特征变量和该地区的平均房价,房价显然和多个特征变量相关,先选择一元线性回归与多个特征建立线性方程,观察模型预测的好坏,再选择多元线性回归进行房价预测。13个特征变量缩写含义CRIM城镇人均犯罪率ZN住宅用地所占比例INDUS城镇中非住宅用地所占比例CHAS虚拟变量,用于回归分析NOX环保指数RM每栋住宅的房间数AGE1940 年以前建成的自住单位的比例DIS距离 5 个波士顿的就业中心的加权距离RAD。 阅读详情

相关推荐

基于STM32的智能水温控制系统设计

智能水温控制系统广泛应用于家庭、工业、农业等多个场景,尤其在热水器、恒温泳池和地暖系统中,通过实时监测和调节水温,提高设备的效率和用户的舒适度。本文基于STM32微控制器设计了一个智能水温控制系统,能够实时监测水温、用户设置温度,并根据需要控制加热器或冷却装置,确保水温维持在设定范围内。系统能够根据用户设定自动控制加热和冷却设备,确保水温维持在舒适的范围内,并通过OLED屏实时显示水温信息。在生成的项目基础上,编写水温监测、目标温度设定、加热器和冷却装置控制、OLED数据显示以及超温报警的代码。

2401_88410555的博客 2474

dlopen()实现三方库的动态加载

目录一、函数介绍 二、实现热更新动态加载也就是运行时加载,即可以在程序运行时由我们决定何时加载指定的模块。这样进程启动时只加载必要的模块就行,减少了内存占用,除此之外最大的优点是,可以实现在不重启程序的情况下,实现模块的重新加载。这种技术也叫做“热更新”。先看一下函数原型和功能: 简单的例子实现一下dlopen的动态加载功能:libcaculator.so动态库的主要方法如下: 编译打包命令:然后在demo.cc中使用dlopen打开动态库并调用相关函数 编译命令:需要链接dl库编译报错: 用n

木牛的博客 7705

利用makehumancommunity导入人体模型到COMSOL里(需要solidwork)

#makehumancommunity #solidwork #COMSOL

qq_41227634的博客 2158

dlopen与动态链接库的依赖

<br />有两个动态链接库,其中一个依赖了另一个定义的函数,使用dlopen的时候,需要加上RTLD_GLOBAL。<br /> <br />动态库一,life,定义了一个life函数。<br />gcc -shared -Wl,-soname,liblife.so.1 -o liblife.so.1.0 life.c<br />---------------------------------------------------------------------<br />#include <stdi

RichardYSteven的专栏 1万+

22、忆阻器、忆阻系统及其神经形态应用综述

本文综述了忆阻器与忆阻系统的理论基础及其在神经形态系统中的广泛应用。从忆阻器的基本定义出发,介绍了其在非线性电路、存储技术、通信和神经形态计算等领域的应用潜力。重点探讨了基于忆阻器的神经元模型(如Hodgkin-Huxley、FitzHugh-Nagumo和Hindmarsh-Rose模型)、突触实现方式及多种忆阻神经网络架构,包括细胞神经网络、脉冲神经网络和递归神经网络等。此外,深入分析了忆阻器在水库计算中的理论研究与硬件实现进展,展示了其在时间序列处理、模式识别和信号预测等方面的优异性能。尽管忆阻技术前

kiwi8的博客 207

Could not find a package configuration file provided by “boost_signals“

gmapping/slam_gmapping/gmapping/CMakeLists.txt:14 (find_package)问题在14行,注释该行。,该语句的用以为告诉项目Boost库文件所在。

weixin_72050316的博客 1027

dlopen()函数详解[转载]

Linux提供了一套API来动态装载库。下面列出了这些API: - dlopen,打开一个库,并为使用该库做些准备。 - dlsym,在打开的库中查找符号的值。 - dlclose,关闭库。 - dlerror,返回一个描述最后一次调用dlopen、dlsym,或dlclose的错误信息的字符串。 1、头文件 #include 2、函数原型 void *dlopen(const

我的博客 2万+

材料仿真软件:Materials Studio_(14).电学性质计算

设置计算参数,包括 k 点网格、交换相关泛函等。

kkchenjj的博客 1863

如果你因为systemd漏洞进行了大批量升级维护,请记住这个人,他叫Lennart Poettering

神棍之路 2405

基于Xilinx K7-410T的高速DAC之AD9129开发笔记(一)

引言:从本文开始,我们介绍下项目中设计的并行LVDS高速DAC接口设计,包括DAC与FPGA硬件接口设计、软件设计等。项目设计高速DAC采用了ADI公司的AD9129,该芯片最大更新速率5.7Gsps,该芯片在宽带通信应用、LTE、雷达信号产生、干扰机等领域有广泛应用。

FPGA_Designer 2533

redhawk如何看高toggle rate instance

1.图形界面View-Power Map - Toggle Map of Instances。redhawk通过报告和图形界面两种方式查看高toggle rate的instance。2.看warning log,在adsRpt/Warn里,搜toggle rate。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 609

Unix/Linux编程:dlopen API函数

动态加载库 当一个可执行文件开始运行之后,动态链接器会加载程序的动态依赖列表中的所有共享库,但有些时候延迟加载库是比较有用的,如只在需要的时候再加载一个插件。动态链接器的这项功能是通过dlopen API来实现的。 dlopen API使得程序能够在运行时打开一个共享库,根据名字在库中搜索一个函数。然后调用这个函数。 dlopen API由下列函数组成: dlopen()函数打开一个共享库,返回一个供后继使用的句柄 dlsys()函数在库中搜索一个符号(一个包含函数或者变量的字符串)并返回其地址 dlcl

OceanStar的博客 1070

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LWN: Linus Torvalds下手修复了getrandom()

Really fixing getrandom()ByJonathan CorbetOctober 17, 2019From:https://lwn.net/Articles/802360/5.3 kernel开发周期最后几天的时候有一场很热烈的讨论,关于getrandom() API以及需要revert一个ext4优化patch避免其导致系统启动过程中随机事件太少。长久来说,我们肯定不可能因...

Linux News搬运工 628

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LWN:在GNU C库实现内存封印!

关注了就能看到更多这么棒的文章哦~Memory sealing for the GNU C LibraryBy Jonathan CorbetJune 12, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/978010/mseal()系统调用允许进程阻止其地址空间未来进行任何更改(因此被称为“密封 sealing”);它借鉴了...

Linux News搬运工 1736

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Linux 中 dlopen、dlsym、dlclose、dlerror函数

编译时候要加入 -ldl (指定dl库) dlopen 基本定义 功能:打开一个动态链接库 [喝小酒的网摘]http://blog.const.net.cn/a/17154.htm 包含头文件: #include <dlfcn.h> 函数定义: void * dlopen( const char * pathname, int mode ); 函数描述: 在dlopen的()函数以指定...

LPetitPrince's Blog 3190

动态链接库dlopen的函数的使用

转自:http://blog.const.net.cn/a/17154.htm 编译时候要加入 -ldl (指定dl库) dlopen 基本定义 功能:打开一个动态链接库 [喝小酒的网摘]http://blog.const.net.cn/a/17154.htm 包含头文件:  #include   函数定义:  void * dlopen( const char * p

爱雨的专栏 5万+

动态链接函数(dlopen/dlsym/dlclose)使用总结

动态链接函数操作(显式运行时链接)主要包含头文件dlfcn.h(/usr/include/dlfcn.h),涉及的常用的函数主要有dlopen,dlysm,dlclose。主要作用是从动态库中加载函数到程序中使用,好处是编译的时候不需要链接动态库。

分享空间 3873

Linux systemd开发者:开源机制“令人生畏”内核社区“糟糕透顶”

Linux平台系统管理软件systemd的缔造者Lennart Poettering指出,目前开源领域“已经成为一块令人生厌、根本没有热情涉足的废土。” 他同时指出,Linux开发业界也已经“糟糕透顶”——他更是将矛头直接指向了Linux掌门人Linus Torvalds,认为其应该为此承担责任。 “这就是一条从头到尾巴都烂透了的臭鱼,”Poettering上周日发在Google+的一篇博文中表达了这样的观点。 Lennart Poettering Poettering认为,Torvalds的火爆脾气和经常

goufangwang的博客 437

Linux C++ libdl.so dlfcn.h使用方法(dlopen()、dlsym()、dlclose()、dlerror())(用于动态链接库操作)(懒加载、立即加载)共享库符号、动态库

RTLD_GLOBAL” 是 dlopen() 函数的一个标志,表示在打开共享库时将其中定义的符号全局可见,也就是说,共享库中的符号可以被后续打开的其他共享库所使用。是指在共享库中定义的可以被其他共享库和主程序使用的符号,这些符号在编译时会被加入到共享库的全局符号表中,并且可以通过 dlopen() 和 dlsym() 等函数在程序运行时动态加载和使用。是指在共享库中定义的只能被本地共享库中的其他符号所使用的符号,这些符号在编译时不会被加入到全局符号表中,只能在本地共享库内部进行使用。

Dontla的博客 4697

动态链接库(dlopen、dlsym、dlclose)(Linux)

一、介绍 动态链接,是在程序已经执行时,加载链接的方法 二、有关动态链接库生成 1、在导出处使用 extern "C"申明 extern "C" { void fun1() { ... } void fun2() { ... } } 2、在链接时使用 -fPIC。fPIC是说明该库与位置无关,可以通过全局偏移表(GOT)访问地址 1、终端/makefile gcc main.cpp -fPIC -shared -

liutit的博客 2022

动态库使用的几个注意点

一、“--export-dynamic”参数的使用 GCC编译可执行文件时可以使用-Wl,--export-dynamic参数,此时链接器产生可执行文件时会将所有全局符号导出到动态符号表。 gcc -Wl,--export-dynamic -o p1 p1.c -L. -l0 如果在创建动态链接的可执行文件不加-Wl,--export-dynamic选项,则它所export的动态...

weixin_30613343的博客 482

Android 依赖三方so库报错找不到dlopen failed:xxx not found 显示磁盘路径

app中有 a模块, 在a模块中通过cmake 构建 libso_a.so ,libso_a.so 依赖三方编译好的 libso_b.so, 编译运行后 打开即崩溃....通过设置配置,不使用全路径连接

f305176014的博客 4135

dlopen系列函数详解

Linux提供了一套API来动态装载库。下面列出了这些API: dlopen:该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。这种机制使得在系统中添加或者删除一个模块时,都不需要重新进行编译。 dlsym:在打开的动态库中查找符号的值。 dlclose:关闭动态库。 dlerror:返回一个描述最后一次调用dlopen、dlsym,或dlclose的错误信...

Bluenapa的博客 1万+

c语言中dlopen函数,dlopen()

4.1. dlopen()dlopen函数打开一个函数库然后为后面的使用做准备。C语言原形是:void * dlopen(const char *filename, int flag);如果文件名filename是以“/”开头,也就是使用绝对路径,那么dlopne就直接使用它,而不去查找某些环境变量或者系统设置的函数库所在的目录了。否则dlopen()就会按照下面的次序查找函数库文件:1. 环境变...

weixin_33506900的博客 5663

android下运行时动态链接dlopen()和dlsym()的实现

在android中,就如同在Linux下一样,我们也可以在app...

weixin_34253126的博客 945

动态链接库要点

Windows平台 1.加载动态库的搜索路径 由于该输入节只包含一个DLL名而没有它的路径名。因此加载程序必须搜索用户的磁盘驱动器,找出DLL。下面是加载程序的搜索顺序: 1)包含可执行映像文件的目录。 2)进程的当前目录。 3)Windows系统目录。 4)Windows目录。 5)PATH环境变量中列出的各个目录。 2.找不到指定模块错误 该错误的原因是在上述搜索路径中找不到

acsder2010413的专栏 753
上一篇: LWN:FOSS 赞助的深入介绍!
下一篇: LWN:补全EEVDF调度器!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值