有什么办法可以阻止用户创建可执行文件并运行它们?

有什么办法可以阻止用户创建可执行文件并运行它们?

勒索软件攻击可能会使用零日漏洞,但通常攻击者只是通过下载和点击来欺骗易受骗的用户运行可执行文件。

假设我们有一个初级用户,并且想限制他们使用正常路径。有什么方法可以限制他们创建具有可执行权限的文件吗?

或者,更一般地说,是否有任何方法可以建立访问控制列表并定义该用户只能执行此列表中的文件?

答案1

您所担心的具体攻击是:

攻击者通常会欺骗容易上当的用户,让他们下载并点击以运行可执行文件。

至少在通常情况下,即在 Web 浏览器中下载文件时,Ubuntu 应该已经通过遵守以下规定来阻止这种情况:需要执行权限位政策。该政策最直接相关的部分是:

  • 应用程序(包括桌面和 shell)在满足以下条件时不得运行文件中的可执行代码:

    • 缺少可执行位
    • 位于用户的主目录或临时目录中。
  • 从网络浏览器、邮件客户端等下载的文件绝不能保存为可执行文件。

因此,如果用户被告知在 Web 浏览器中下载程序,然后双击运行该文件,则无法运行。即使下载的文件是 shell 脚本,甚至是 .desktop 文件,也是如此。(如果您曾经想知道为什么.desktop 文件在你的主目录中必须被标记为可执行文件,即使它们不是真的程序,这就是原因。)

用户可以通过配置更改来改变此行为。大多数人不会这样做,虽然那些这样做的人可能不应该这样做,但这并不是你真正需要担心的。更大的担忧是我认为你已经担心的更复杂的攻击,其中恶意的人(或机器人)指示用户下载特定文件,将其标记为可执行文件(通过他们的文件浏览器或chmod),然后运行它。

不幸的是,限制用户设置文件执行位或执行白名单之外的文件的能力并不能明显缓解这个问题。有些攻击已经奏效了,而那些不起作用的攻击可以稍加修改就可以奏效。根本问题是运行文件的效果可以实现即使该文件没有可执行权限

最好通过示例来说明这一点。假设evil当前目录中有一个文件,如果赋予其可执行权限 ( chmod +x evil) 并运行 ( ./evil),它将执行一些邪恶的操作。根据程序的类型,以下操作之一可能会达到相同的效果:

其中任何一个,甚至最后一个,都不需要文件具有可执行权限,甚至不需要用户有能力的赋予该文件可执行权限。

但恶意指令甚至不必那么复杂。考虑一下非恶意的命令官方推荐的安装或更新 NVM 的方法之一

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

之所以说这不是恶意的,是因为 NVM 不是恶意软件,但如果 URL 指向某人的脚本,而该脚本运行时会做坏事,那么该命令就会下载并运行该脚本。在任何时候都不需要为任何文件赋予可执行权限。我认为,使用这样的单个命令下载并运行恶意文件中包含的代码是攻击者诱骗用户采取的一种相当常见的操作。

您可能会考虑尝试限制用户可运行的解释器。但实际上没有一种方法可以做到这一点而不会对您希望用户能够执行的普通任务产生重大影响。如果您正在设置极其受限环境,用户在计算机上想做的几乎所有事情都是不允许的,比如只能运行几个程序的自助服务终端,那么这可能会提供一定程度的有意义的保护。但这听起来不像是你的用例。

所以你的问题的近似答案是“不”。更完整的答案是,你可以大概设法阻止用户执行除白名单中提供的文件之外的任何文件。但这是严格意义上的“执行”,对于实现运行大多数程序或脚本的全部效果来说,执行并不是必需的。为了防止,您可以尝试将白名单做得很小,这样它就不会列出任何解释器,除非那些解释器可能会受到严格限制。但即使您做到了这一点,用户也无能为力,如果您将白名单做得很小,以至于他们无法伤害自己,他们可能什么也做不了。(参见Thomas Ward 的评论

如果您的用户能够伤害自己,他们就可能会被愚弄而伤害自己。

您可能能够限制特定程序的使用或以其他可能有害的方式运行,并且如果您正在查看勒索软件倾向于遵循的特定模式,您可能能够防止一些特定的常见情况。(见应用装甲。)这可能会提供一些价值。但它不会给你提供任何接近你所希望的全面解决方案。

无论你最终采取什么技术措施(如果有的话),最好的办法是教育用户。这包括告诉他们不要运行他们不理解的命令,不要在他们无法解释为什么这样做是合理安全的情况下使用下载的文件。但它也包括进行备份等事情,这样如果出现问题(由于恶意软件或其他原因),造成的损害将尽可能小。

答案2

是的*


这被称为受限外壳。

您可以使用/bin/rbash(Ubuntu 中已有)并将其与受限制的 PATH 变量.rbash禁止执行 中的任何事项$PATH

添加受限用户:

sudo adduser --shell /bin/rbash res-user

创建一个新目录,我们可以在其中链接二进制文件,但用户只能访问以下目录:

sudo mkdir /home/res-user/bin

修改.profile文件:

sudo vim /home/res-user/.profile

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

readonly PATH=/home/res-user/bin
export PATH

使.profile和不可bashrc.bash_profile

sudo chattr +i /home/res-user/.profile
sudo chattr +i /home/res-user/.bashrc
sudo chattr +i /home/res-user/.bash_profile

现在我们为用户提供唯一允许做的事情,即打开 Firefox:

sudo ln -s /usr/lib/firefox/firefox /home/res-user/bin/

现在,如果我们登录,res-user我们只能打开 Firefox:

res-user@localhost:~$ /home/res-user/bin/firefox --version
Mozilla Firefox 68.0.1

我们无法轻易地摆脱自己受限制的外壳:

res-user@localhost:~$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
-su: PATH: readonly variable

受限用户无法使文件可执行,或启动它们:

res-user@localhost:~$ chmod +x script.sh 
Command 'chmod' is available in '/bin/chmod'
res-user@localhost:~$ bash script.sh 
Command 'bash' is available in '/bin/bash'
The command could not be located because '/bin' is not included in the PATH environment variable.
bash: command not found

受限用户无法执行来自互联网的恶意脚本,因为用户无法执行必要的命令:

res-user@localhost:~$ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
Command 'wget' is available in '/usr/bin/wget'
The command could not be located because '/usr/bin' is not included in the PATH environment variable.
wget: command not found
Command 'bash' is available in '/bin/bash'
The command could not be located because '/bin' is not included in the PATH environment variable.
bash: command not found

* 突破受限 shell 的方法,但如果您的用户有能力做到这一点,那么他们可能并不像您想象的那么容易上当。

相关内容