作为最近"rowhammer"利用概念验证的一部分,使用了read-suid-exec工具"ping"来创建更精细的概念验证。
因此,我的问题是,为什么各种发行版都准备suid(尤其是root)可执行文件作为可读和可执行文件?
我的推测包括:
- 方便使用"ldd"
- 允许tripwire或包更新检查软件以非root身份运行
- 这并不重要,因为大多数发行版都是公共的,ELF二进制文件可以由任何人获得(安装到VM中等)
- selinux可以用来使其不相关
- 懒惰的开发人员
对于(3),隐藏公共发行版的二进制文件只提供了一块安全的遮羞布,而(5)几乎是在骂人。
不是一个完整的答案,但我发现如果setuid根程序存储在NFS服务器上,我需要使它们可读。
让我再说一遍:在本地文件系统上,chmod 4711
对于setuid根程序来说已经足够了,但在NFS上,所需的模式是4755
。
它是"无关紧要"(3)和"懒惰的开发人员"(5)的混合体。
关闭不必要的权限(如对SUID可执行文件的读取访问)是一种很好的做法,因为这通常可以减少攻击面,但在许多情况下并没有太大区别。
正如你在(3)中所说,隐藏程序数据并不能阻止攻击者搜索ROP小工具等,因为这些数据通常在二进制文件的公开发行版中可见。
请注意,这并不适用于ProjectZero博客文章中描述的基于rowhammer的漏洞利用。为此,该漏洞利用程序不想读取SUID可执行文件中的数据,它只想使用/proc/self/pagemap
来了解哪些物理地址包含可执行文件的数据。
然而,正如博客文章所说,如果攻击者不能打开()SUID可执行文件,它可以打开()它使用的库,如/lib64/ld-linux-x86-64.so.2
,并对此进行攻击。因此,限制对SUID可执行文件的读取权限没有帮助。我们不能删除这些库的读取权限,否则它们将无法使用。