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

Dov*_*Dov 33 permissions security executable restricted-access

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

假设我们有一个天真的用户,并希望将他们限制在正常路径上。有没有办法限制他们创建具有可执行权限的文件?

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

Eli*_*gan 51

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

通常,攻击者只会通过下载和点击来欺骗容易上当的用户运行可执行文件。

至少在文件在 Web 浏览器中下载的常见情况下,这应该已经在 Ubuntu 中通过浏览器遵守Execute-Permission Bit Required策略来阻止。该政策最直接相关的部分是:

  • 应用程序(包括桌面和外壳程序)在以下情况下不得从文件运行可执行代码:

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

因此,如果用户被告知要在 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
Run Code Online (Sandbox Code Playgroud)

不是恶意的原因是 NVM 不是恶意软件,但如果 URL 是某个人的脚本,该脚本在运行时会做恶,那么该命令将下载并运行该脚本。任何文件都不需要被赋予可执行权限。我相信,使用这样的单个命令下载并运行恶意文件中包含的代码是攻击者诱骗用户采取的一种非常常见的行为。

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

所以你的问题的大致答案是,“不。” 更完整的答案是,您可能设法阻止用户执行除您在白名单中提供的文件之外的任何文件。但这是严格的、技术意义上的“执行”,它不需要达到运行大多数程序或脚本的全部效果。为了防止这种情况,您可以尝试将白名单设置得非常小,因此除了可能受到严格限制的解释器之外,它不会列出任何解释器。但即使你做到了,用户也无能为力,如果你把它做得这么小,他们不会伤害自己,他们可能什么也做不了。(见Thomas Ward 的评论。)

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

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

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

  • 或许非技术性措施需要包括提供某人的联系信息,以便*可以*检查他们想做的事情。任何时候他们不确定,都可以打电话或发消息询问。这可能会消除猜测的诱惑。 (6认同)
  • 每当我看到安装或更新某个软件的方法涉及“只需 wget 这个脚本并运行它”时,我的脚趾甲都会卷曲一点。没有什么可以阻止某人创建一个由单个字符关闭的 GitHub 帐户/存储库,或者使用 0 而不是 O,或者使用 UTF-8 字符来隐藏并在其中粘贴他们自己的恶意脚本......那么您所需要的只是一个wget 命令和 bam 中的拼写错误。 (2认同)

Rob*_*edl 12

*


它被称为受限外壳。

您可以使用/bin/rbashUbuntu 中已有的 ,并将其与受限的 PATH 变量结合使用。该rbash会由什么,是不是在禁止执行$PATH

添加受限用户:

sudo adduser --shell /bin/rbash res-user
Run Code Online (Sandbox Code Playgroud)

创建一个新目录,我们可以在其中链接二进制文件,用户将被限制为:

sudo mkdir /home/res-user/bin
Run Code Online (Sandbox Code Playgroud)

修改.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
Run Code Online (Sandbox Code Playgroud)

使.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
Run Code Online (Sandbox Code Playgroud)

现在我们给用户他唯一被允许做的事情,即打开 Firefox:

sudo ln -s /usr/lib/firefox/firefox /home/res-user/bin/
Run Code Online (Sandbox Code Playgroud)

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

res-user@localhost:~$ /home/res-user/bin/firefox --version
Mozilla Firefox 68.0.1
Run Code Online (Sandbox Code Playgroud)

我们无法轻易逃脱受限制的 shell:

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
Run Code Online (Sandbox Code Playgroud)

受限用户不能使文件可执行或启动它们:

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

* 有很多方法可以突破受限制的外壳,但是如果您的用户有能力做到这一点,那么他们可能不会像您想象的那样容易上当受骗。

  • 我会将脚注提升到您答案的第一行。 (4认同)
  • 这试图实现“一个*极端*受限的环境,在该环境中几乎不允许用户想到在计算机上执行的所有操作”(正如我在回答中所说的那样)。*`res-user` 无法以图形方式登录。* 他们能做的唯一有用的事情是`ssh -X` 并运行 `firefox`。您可以允许更多命令,以便用户可以完成他们的工作。然后突破变得更容易。可以将几个链接的方法制成单行(攻击者可能会提供)。如果用户发现限制令人窒息,他们将成为规避它们的专家,同时仍像以前一样精明或容易上当受骗。 (2认同)

归档时间:

查看次数:

7753 次

最近记录:

6 年 前