共享库如何避免被利用?

How are shared libraries safe from exploitation?

我正在尝试了解 shared/dynamic 库的工作原理。我想我有一个大致的了解,但我无法理解如何保护它们免受攻击。

如果程序使用共享库,我理解它在执行时被链接。所以链接器将所有缺失的符号解析到它们各自的库中。

当真正调用共享库的函数时,我的理解是执行跳转到共享库的可执行文件。

这就是我困惑的来源。难道不能只通过 "guessing" 指定要跳转到的地址,以便调用库中的私有方法并可能获得升级的权限吗?

感谢任何有助于更好地理解这一点的帮助。谢谢

Couldn't one just specify the address to jump to by "guessing" in order to call private methods

是的。但是,如果您不信任该程序,它可能会做更糟糕的事情。简单的解决方案:不要执行您不信任的程序。

and possibly gain escalated privileges?

没有。进程使用的库没有比进程本身更多的权限。

简而言之,是的。启动进程的程序拥有地址 space 并且可以为所欲为。如果您的库与另一个具有更多特权的进程有可能导致升级的危险交互,则另一个进程需要自己的防御。没有什么可以阻止某人调用您的库中的私有方法或静态函数,并且可以规避任何可能调用的方法。

当然这是可能的,但是像 ASLR 这样的机制会阻碍任何 'guessing' 方法。此外,还有分页,如果您在操作系统范围内谈论特权升级,它会禁止用户代码操纵和执行内核的数据和代码。

在太监和 windoze 世界中长大的人们错过了设计更好的系统。有些系统明确管理共享库,以减少对它们的利用。这样的共享库将由系统安装。事实上,相同的安装将用于具有提升权限的程序。例如,需要访问内核数据的进程监视器之类的良性程序可以使用用户自己没有的权限安装。