2013-04-24 145 views
3

我想打开一个共享对象作为数据文件并对其执行验证检查。验证是签名检查,我签署共享对象。如果验证成功,我想将当前打开的共享对象作为适当的共享对象加载。用文件描述符调用dlopen?

第一个问题:是否可以在签名检查期间调用dlopen并加载共享对象作为数据文件,以便代码不是执行?根据手册页,我不这么认为,因为我没有看到类似于RTLD_DATA的旗帜。

由于我将共享对象作为数据文件打开,因此我有描述符可用。验证成功后,我想将描述符传递给dlopen,以便动态加载器正确加载共享对象。我不想关闭文件,然后通过dlopen重新打开它,因为它可能引入竞争条件(文件验证不是打开和执行相同的文件)。

第二个问题:如何使用文件描述符将打开的文件传递到dlopen,以便dlopen执行共享对象的习惯初始化?

+0

即使我回答了一些问题,我也不确定要理解你的问题。你真的应该更多地解释你的动机。你为什么要这么做?你在想什么样的软件?显示一些用例情景。 – 2013-04-24 05:44:48

+0

你确实**没有定义你的“批准”或“真实”的概念。你可以有一些独立的方式来存储其他地方的“好”插件的哈希(例如数据库,配置文件),并在'dlopen'之前检查插件的哈希码。仍然可能没有办法做到防错。否则,你也可以自己生成插件的C代码,在C代中进行任何你想要的检查,然后编译它并'dlopen'。FWIW [GCC MELT](http://gcc-melt.org/)正在这样做。 – 2013-04-24 05:57:57

+0

请编辑您的问题以改进它。 – 2013-04-24 17:03:16

回答

3

在Linux上,您可能可以使用dlopen某些/proc/self/fd/15文件(用于文件描述符15)。

RTLD_DATA似乎并不存在。所以如果你想要它,你必须修补你自己的动态加载器。也许在MUSL Libc以内这样做可能不那么困难。我仍然不明白你为什么需要它。

你必须以某种方式信任dlopen -ed插件(并且它将在dlopen时间运行其构造函数)。

你可以分析共享对象插件dlopen之前通过使用一些ELF解析库,或许libelflibbfd(从binutils)-ing它;但我仍然不明白你想做什么样的分析(你真的应该解释一下;特别是如果插件与一些不良行为软件间接相关会发生什么)。换句话说,你应该更多地解释你的验证步骤。请注意,共享对象可能会覆盖自身....

或者,请不要使用dlopenmmap您的文件(您需要解析某些ELF)。或许使用一些JIT generation技术可能是有用的(您可以从一些验证的数据中生成代码),例如,使用一些JIT generation数据。与GCCJIT,LLVMlibjit等...

如果你有两个文件描述符到同一个共享对象,你可能不会有任何竞争条件。

+1

嗨巴西尔。 “你必须以某种方式信任dlopen-ed插件。”其实我们没有:)当我们没有有效的安全控制时,信任就是我们使用的。在这种情况下,我至少有两个控制:(1)签名检查;或(2)自我认证的URL。 “ – jww 2013-04-24 07:43:00

+0

”RTLD_DATA似乎不存在。“是的,正确的(如果存在的话,这是我为了简单而使用的那个)。 – jww 2013-04-24 07:46:51

+0

“......你可能会删除一些/ proc/self/fd/15文件。”这很聪明。当我有机会时我会尝试。 – jww 2013-04-24 07:47:30