如何防止脚本/命令劫持会话的缓存 sudo 能力?

3 security sudo scripts password

如果我运行sudo命令,它会要求我输入密码,但是在接下来的几分钟内,在该终端会话中,它将允许我在sudo不要求我输入密码的情况下运行命令,因为它会缓存我被允许的信息。

这是为了方便起见,我觉得它相当方便,所以我不想通过每次都要求输入密码而不是缓存来解决这个问题。

但是我最近发现的事情相当令人担忧,例如,如果我创建一个这样的小脚本:

#!/bin/bash

sudo rm -rf /
Run Code Online (Sandbox Code Playgroud)

在执行任何sudo命令之前,我以终端中的普通用户身份执行它,然后一切正常并按预期工作,它提示我输入sudo密码。但是,如果我要sudo在执行此脚本之前运行命令而没有 sudo它会缓存该sudo命令不应在此会话中要求输入密码几分钟然后即使我没有授予脚本sudo权限它也不会提示我输入密码并且脚本将被允许执行sudo它想要的任何命令。

现在我不是那种在不知道脚本中有什么的情况下执行许多脚本的人,但有时我必须从我从受信任位置获得的脚本中安装东西,但我不确定其中是否有任何不好的地方脚本,所以我想知道它不会只是劫持sudo已授予我的终端会话的能力。

所以我的问题是,是否有可能让这个我可以运行sudo的命令,它会缓存它为我,但当时如果我运行一个脚本没有sudo的脚本不能够只是劫持那个能力吗?我知道我执行脚本与我只是按照它们在那里的顺序执行脚本中的命令基本相同,但是没有办法做一些聪明的事情,以便它以稍微不同的方式运行sudo对我运行的脚本有限制吗?

真的任何我没有sudo运行的东西都不应该用sudo. 包括命令。如果他们只是劫持缓存的能力......

我正在使用 GNOME 3.18 运行 Ubuntu GNOME 15.10。

我有一个关于如何做到这一点的建议,但我不知道它的实用性:我可以这样做,以便当我执行一个命令并开始运行它时,它会将其记录到一个文件中(就像所有终端一样命令虽然可能有点太晚了 - 使用history命令),然后sudo运行时它会检查我是否在终端中执行了该命令(通过使用我执行时记录的日志),如果没有,则假设它是不是我,所以它提示我输入密码?

Mar*_*ith 5

你可以跑

sudo -k
Run Code Online (Sandbox Code Playgroud)

在运行脚本之前。它将清除缓存的凭据,接下来sudo将再次询问您的密码。

这是一种做你想做的事情的方法(我认为)。

  1. 将你的 sudo 移到别处:

    mv /usr/bin/sudo /usr/bin/sudo_real
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将以下内容放入usr/bin/sudo

    sudo -k
    
    Run Code Online (Sandbox Code Playgroud)
  3. 制作新的/usr/bin/sudo可执行文件:

    chmod a+x /usr/bin/sudo
    
    Run Code Online (Sandbox Code Playgroud)
  4. sudo当您从 shell 运行 bash 历史时,通过将其放入以下别名来更新 bash 历史记录~/.bashrc

    alias sudo="history -a;sudo"
    
    Run Code Online (Sandbox Code Playgroud)

现在,当您运行时,sudo ...它会将 放入sudo ...bash 历史记录中,脚本将找到它并运行sudo_real. 但是当另一个脚本运行时sudo,它不会出现在历史记录中,它会调用sudo_real -k.

我认为这是令人难以置信的毛茸茸的,我只是冒着风险,或者对我不信任的脚本使用新的外壳,就个人而言:-)