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


31

勒索软件攻击可以使用零时差攻击,但攻击者通常会通过下载和单击来欺骗易受骗用户运行可执行文件。

假设我们有一个朴素的用户,并希望将他们限制在正常路径上。有什么方法可以限制他们创建具有可执行特权的文件?

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


7
以这种方式禁用执行将禁止用户在系统上执行任何操作。没有这种机制可以内置到系统中,甚至我所知道的第三方软件都无法进行这种类型的安全锁定
Thomas Ward

3
不回答,而是提示您可以做什么:在用户可写挂载上添加noexec。不会阻止脚本,但会实际执行二进制文件。
Sampo Sarrala

3
@ThomasWard,这不就是受限制的外壳吗?
罗伯特·里德尔

7
@ThomasWard有一个“列入白名单的可执行文件”的一般概念,其中允许一定列表的(通常是经过签名的)可执行文件,并且没有提升的特权就无法运行其他任何文件;Windows和OS X都具有合理的解决方案。不过,我不知道是否存在将应用程序列入白名单的很好的Ubuntu(或其他Linux)解决方案。
彼得斯

2
@Peteris,有多种这样的解决方案。我最喜欢的是拥有一个签名的只读文件系统以及您的可执行文件,并挂载所有其他文件(noexec类似于ChromeOS用于dm_verity确保根文件系统完整性的方式)。对于不是那么顽固的人,可以使用EVM模块。请参阅wiki.gentoo.org/wiki/Extended_Verification_Module,获取有关Gentoo的文档。
查尔斯·达菲

Answers:


50

您已经表示关注的具体攻击是:

通常,攻击者只是通过下载和单击来欺骗易受攻击的用户来运行可执行文件。

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

  • 包括台式机和外壳程序在内的应用程序必须同时运行以下文件中的可执行代码:

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

因此,如果告知用户在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代替的是某个人的脚本的URL,该脚本在运行时会带来恶意,则该命令将下载并运行该脚本。任何文件都绝对不需要授予可执行权限。我相信,仅用一个命令就可以下载并运行恶意文件中包含的代码,这是攻击者诱骗用户采取的非常常见的措施。

您可能会考虑尝试限制哪些解释器可供用户运行。但是,实际上没有一种方法可以对您可能希望用户能够执行的普通任务没有实质性影响。如果您正在设置一个极其受限的环境,几乎不允许用户考虑在计算机上执行的所有操作(例如仅运行几个程序的信息亭),则这可能提供了一些有意义的保护措施。但这听起来好像不是您的用例。

因此,对您的问题的大致答案是“否”。完整的答案是,您可能设法阻止用户执行除白名单上提供的文件以外的任何文件。但这是严格的技术意义上的“执行”,而要获得运行大多数程序或脚本的全部效果并不需要。为防止这种情况,您可以尝试将白名单设置得很小,因此除了可能会受到严格限制的口译员之外,它没有列出其他口译员。但是,即使您设法做到这一点,用户也无法做很多事情,而如果您将它做得很小,他们也不会伤害自己,那么他们可能什么也做不了。(请参阅Thomas Ward的评论。)

如果您的用户可以伤害自己,则可以欺骗他们伤害自己。

您可能能够以可能有害的方式限制特定程序的使用或行为,并且,如果您查看勒索软件倾向于遵循的特定模式,则可以防止某些特定的常见情况。(请参阅AppArmor。)这可能会提供一些价值。但这并不能给您任何接近您希望的全面解决方案的东西。

无论您最终采取什么技术措施(如果有),最好的办法就是教育用户。这包括告诉他们不要运行他们不了解的命令,以及在无法解释为什么这样做合理安全的情况下不要使用下载的文件。但这还包括进行备份之类的事情,因此,如果确实发生了错误(由于恶意软件或其他原因),则造成的危害将尽可能小。


6
也许非技术性措施需要包括为可以理智地检查他们想做的事情的人提供联系信息。每当他们不确定时,请致电或发消息询问。这可能消除了猜测的诱惑。
彼得·科德斯

1
这是关于OP问题背后的问题和恐惧的绝佳摘要
Robert Riedl,

次要:“ . ./evil或”中source ./evil的命令evil.sh- 除非指定扩展名,否则这些source命令将在其中运行命令evil,例如. ./evil.sh
已暂停,直到另行通知。

@DennisWilliamson谢谢-固定!这是答案的较旧(未提交)的粗略草稿所留下的,在该草稿中,我使用了不同的脚本名称。我很快意识到这很愚蠢,但显然未能改变所有情况。
伊利亚·卡根

1
每当我看到一种方法来安装或更新涉及“只是wget这个脚本并运行它”的软件时,我的脚趾甲都会有些弯曲。没有什么能阻止某人创建一个由单个字符关闭的GitHub帐户/仓库,或者使用0而不是O,或者使用UTF-8字符来掩盖自己并在其中粘贴自己的恶意脚本……那么,您所需要的只是一个wget命令和bam中的错字。
伊恩·肯普

11

*


这称为受限外壳。

您可以使用/bin/rbashUbuntu中已提供的,并将其与受限制的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

使.profilebashrc.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

* 多种方法可以突破受限的外壳,但如果您的用户有能力,则它们可能不如您想像的容易受骗。


2
这试图实现“一个极端受限的环境,几乎不允许用户考虑在计算机上进行的所有操作”(正如我在回答中所指出的那样)。res-user无法以图形方式登录。他们唯一能做的就是ssh -X进入并跑步firefox。您可以允许更多命令,以便用户可以执行其工作。然后突破变得容易。可以将几种链接的方法制成一个衬套(攻击者可能会提供)。如果用户发现窒息的限制,他们将成为规避限制的专家,同时仍然像以前一样精明或易变。
伊利亚·卡根

1
@EliahKagan是的,正确。您必须链接用户需要的所有内容。但是,这是非常接近[...]有没有什么办法来建立一个访问控制列表并定义该用户可以仅在列表执行文件[...] 。因此,这可能会帮助OP。打破这些壳不是不可能的,但是相当困难。对于外部访问特定资源或跳转主机,我们有类似的设置。我怀疑是否存在针对受限外壳设置的广泛攻击。...如果您要进行有针对性的攻击,则攻击者知道环境了。
罗伯特·里德尔

4
我会将脚注提高到答案的第一行。
暂停,直到另行通知。

让他们在信息亭模式或其他强化浏览器中使用chrome可能更好。使用非常高的权限和执行系统命令来安装firefox插件或扩展,应该很容易。在firefox中,请确保使用最新版本并禁止扩展。
Benjamin Gruenbaum

为了提供进一步的保护,用户只能对使用noexec选项安装的文件系统进行写访问。
Dan D.
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.