攻击者是否可以使用mkdir破坏系统?


22

我正在为ricardo系统上的麻烦用户user 设置受限用户帐户。我想授予他使用sudo有时需要做的使用目录的权利。我正在考虑/etc/sudoers文件中的以下规则:

ricardo   ALL=(root) NOPASSWD: /bin/mkdir

仅使用此规则,里卡多是否有可能有意或无意地破坏系统?


2
如果您的文件系统的inode计数为静态,则他可能会用完您的所有inode。
jordanm

2
@schaiba他喜欢修补一下,看看他是否可以利用该系统,而且并不总是阅读他应该阅读的手册页。
里卡多·阿尔塔米拉诺

8
建议我对用户进行适当的教育,再加上暂时没有sudo的知识。
schaiba

2
如@schaiba所说,您可以通过教用户并赋予他们责任(在密切监督下)来使用这些用户。我看到了sysdamins与用户之间的战争,因为最初的战争试图过多地锁定系统。用户的数量比sysadmin的用户多10比1,即使在那时(没有今天的Internet访问!),sysdamins的失败也令人感到羞耻。永远不要进入这样的位置!
vonbrand

2
一个里卡多的情况就是这样。或至少是这样,这样说是BOFH ...
Deer Hunter

Answers:


21

我怀疑这样的攻击会起作用,其中“ something”是一个内核模块,它将在挂载rootfs之后尝试加载:

$ sudo mkdir -m 777 /lib/modules/`uname -r`/a
$ cp evil.ko /lib/modules/`uname -r`/a/«something».ko

还要注意,您可以使用其他名称,具体取决于模块中声明的别名。我猜想它要等到depmod运行后才能加载,下次运行内核更新时才会发生,因此它mkdir甚至不会在sudo日志中显示。

/ etc中有很多东西可以读取目录中的所有文件,有时可以递归读取。更糟糕的是,其中一些目录默认情况下不存在,唯一了解它们的方法是阅读使用手册的手册页,初始化脚本等。有些甚至更糟的是不推荐使用的向后兼容的东西,甚至可能不再有文档记录。

编辑:想到了更多目录,这些目录位于/usr/local

  • /usr/local/lib/perl/5.14.2(因Perl版本而异,请尝试perl -V找出答案)。File在其中创建一个子目录,然后在其中放置一个Find.pm。现在,只要有人使用File::Find,他们就会使用攻击者的版本。同样,对进行相同操作Getopt::Long。系统实用程序通常是用Perl编写的,因此这可能是根。(尝试ack-grep --color -a 'use.+::' /usr/sbin | less -R
  • 我认为Python,Ruby等具有相似的目录。系统实用程序也是用Python编写的。
  • 使用的子目录来破坏某人编译的许多内容/usr/local/include

哦,但是如果<evil user>可以将模块复制到内核将其加载到的位置,则游戏在开始之前就结束了。
vonbrand

1
@vonbrand <evil user>通常不能,但是使用他sudo mkdir来创建一个新目录,在该目录中可以。
derobert

20

通过mkdir以root用户身份运行,用户可以通过之前创建具有相同名称(和/或错误权限)的目录来阻止其他进程/用户创建新文件和目录。

这可能与安全性相关,尤其是与日志文件和锁定文件有关。

正如jordanm所指出的,也可以用尽最大数量的inode来阻塞整个系统。

通过将用户添加到特定的组(或使用ACL),您应该能够解决问题,而无需通过授予任何权利sudo


好点。我可能会离开mkdirricardo允许使用的命令列表。
里卡多·阿尔塔米拉诺

如果是用尽inode,那么简单for((i = 0;; i++)); do touch $i; done就可以了(bashism,抱歉;但是您明白了)。
vonbrand

@vonbrand除非不是root用户,否则将被配额阻止。当然,sudoOP正在考虑的其他命令也可能会耗尽inode。OP需要注意该DoS向量。
derobert

11

您应该将他重定向到chroot监狱。甚至更好的是,对于一个小的VM,他可以每小时崩溃一次。您需要做的就是提供一个新副本。


我强烈推荐这个。授予他对自己的VM的root访问权限。
emory

到chroot ^ H ^ H ^ H ^ H ^ Hounty监狱...
Deer Hunter

6

由于能够创建具有写访问权的目录,因此存在许多可能性。随着mkdir -m 777 blahricardo用户可以写任何他们喜欢到新目录。您将需要一个已经以其他用户身份运行的系统上的进程,该进程将递归目录树以加载配置,脚本或模块。然后,用户可能会添加自己的东西以进行加载或运行。我能想到的第一件事是,如果您运行可以执行php或cgi的Web服务器。然后,您可以以该用户身份运行脚本。我正在努力想出更多真实的例子,尤其是root那些例子,但我确信它们即将到来。

ssh是捕获此类情况的守护程序的示例。如果您.ssh为没有目录的用户创建了目录,然后将您自己的authorized_hosts文件放置到位。sshd注意目录权限太开放,并且会忽略公钥。

您肯定会讨厌自己创建目录,在该目录中可能会出现很多程序无法很好处理的文件(例如瞬时tmp或swap文件)。

您可以创建很多cgroup,但是看起来您并没有对它们做任何事情。您可能至少可以使系统瘫痪。OOM杀手用一个256M的盒子花了10000个cgroup 来取出sshd。

如果您控制环境的UMASK -m选项mkdir和UMASK,那么sudo我认为这已经成为一种麻烦。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.