似乎保护被硬编码到 sudo 中,以防止二进制文件作为低权限用户执行。以普通用户身份在 Ubuntu 中运行它会返回以下错误:
“sudo 必须由 uid 0 拥有并设置 setuid 位”
也许这是一个非常愚蠢的问题:但是如何阻止攻击者编译他们自己的自定义 sudo 二进制文件,允许它使用任何 uid 执行?
似乎保护被硬编码到 sudo 中,以防止二进制文件作为低权限用户执行。以普通用户身份在 Ubuntu 中运行它会返回以下错误:
“sudo 必须由 uid 0 拥有并设置 setuid 位”
也许这是一个非常愚蠢的问题:但是如何阻止攻击者编译他们自己的自定义 sudo 二进制文件,允许它使用任何 uid 执行?
什么可以阻止攻击者编译他们自己的自定义 sudo 二进制文件,允许它使用任何 uid 执行?
这里有一个基本的误解。该程序确实执行,它只是在它注意到它没有以root用户身份运行时停止。重新编译程序以删除检查只会允许您以执行 sudo 的用户身份运行任务,而不是 root。换句话说,在 sudo 中以 root 身份运行的检查只是错误检查和诊断,而不是安全功能。
误解是程序没有任何特殊的能力可以作为另一个用户执行,额外的权限是文件权限的属性。任何设置了 setuid 位的程序都将作为文件的所有者执行。如果您要编译自己的程序,该文件将归您所有。虽然您可以在自己的文件上设置 setuid 位,但在没有额外权限的情况下不允许更改文件所有权。所以设置 setuid 位只会让其他人像你自己一样执行你的程序。
要以其他用户身份执行,文件需要设置setuid权限位并且需要由该目标用户拥有(在本例中为root)。
什么可以阻止攻击者编译他们自己的自定义 sudo 二进制文件,允许它使用任何 uid 执行?
权限位是文件的属性(存储在文件系统中,在文件的 inode 中),它们不包含在文件本身中。您的内核将简单地阻止非特权用户将其自定义编译sudo二进制文件的文件所有者更改为 root。
我认为 OP 误解了此检查的意图。它不是为了防止sudo被恶意滥用,而是它运行的一个简单的前提条件:如果它不是 root 的 setuid,它不能以另一个用户身份运行命令,因此是无用的。
因为(除了root)用户只能创建一个将setuid作为他们自己的uid的二进制文件。只有 root 可以更改其 uid。