共享库如何免受利用?

Posted

技术标签:

【中文标题】共享库如何免受利用?【英文标题】:How are shared libraries safe from exploitation? 【发布时间】:2017-03-26 17:21:07 【问题描述】:

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

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

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

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

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

【问题讨论】:

"... 获得升级权限?" 没有共享库在与主程序相同的权限下运行。 【参考方案1】:

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

【讨论】:

【参考方案2】:

不能只通过“猜测”来指定要跳转到的地址 为了调用私有方法

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

并可能获得升级权限?

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

【讨论】:

【参考方案3】:

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

【讨论】:

ASLR 不会阻止进程访问它自己的合法库(包括其内容)。分页和/或可执行标记也不会(它们不完全相同)【参考方案4】:

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

【讨论】:

a) 如何命名这样的系统? b) 用适当的语气(“太监和打瞌睡”)写出可以理解的句子(“为了减少他们的剥削”)怎么样? c) 这 any 与 Unix&co 和 Windows 有何不同?以与用户不同的权限运行某些程序正是他们所做的。

以上是关于共享库如何免受利用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使共享库符号强大?

如何将共享库链接到Linux中的其他共享库?

如何运行时调试共享库?

如何更新 Matlab 共享库?

如何在 GCC Linux 中指定非默认共享库路径?运行时出现“加载共享库时出错”

进程间通信 - 动态链接库中共享内存(利用DLL的2~3G的地址段空间)