如何在“安全环境”中测试 shell 脚本以避免损坏我的计算机?

ntr*_*r42 29 testing scripts safely

我想使用以下命令安装一个名为 42FileChecker 的 bash 脚本:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker &&
    cd ~/42FileChecker &&
    bash ./42FileChecker.sh
Run Code Online (Sandbox Code Playgroud)

但是我不知道 42FileChecker.sh 是否会在我的 PC 上做任何奇怪的事情,因为我是初学者并且不知道该脚本中发生了什么。有没有办法在虚拟终端或虚拟根文件夹或类似的东西中运行它以查看会发生什么,以便我避免像格式化驱动器这样的疯狂事情。即使 42FileChecker.sh 是安全的,我也想知道有什么方法可以为未来的 shell 脚本测试 shell。

小智 41

如果您不确定脚本的作用,最好不要运行它,直到您确定它的作用。减少坏脚本损坏半径的方法包括使用新用户运行它、在容器中运行它或在虚拟机中运行它。但是第一个声明仍然成立:如果您不确定某个东西的作用,请考虑在您确定之前不要运行它。

  • @PeterA.Schneider,但 EULA 在被告上法庭之前并没有真正做任何事情。运行脚本会立即对您的计算机产生影响。并不是要阅读每一行;它更多是关于“信任信任的反思”以及了解和信任脚本的来源。 (7认同)
  • 另一方面,脚本就像 EULA:是的,在出卖灵魂之前,您应该阅读并理解每一行,但是呢? (6认同)

Rya*_*der 29

正如@ctt 所说,首先在某种沙箱中运行它可能是个好主意。使用 VM 可能是最简单的解决方案。多通道非常简单。

安装 multipass(假设您还没有安装):

sudo snap install multipass --beta --classic
Run Code Online (Sandbox Code Playgroud)

启动一个新的虚拟机:

multipass launch --name myvm
Run Code Online (Sandbox Code Playgroud)

登录到您的新虚拟机:

multipass shell myvm
Run Code Online (Sandbox Code Playgroud)

然后运行您的脚本(在您的虚拟机内):

multipass@myvm:~$ git clone https://github.com/jgigault/42FileChecker ~/42FileChecker && cd ~/42FileChecker && bash ./42FileChecker.sh
Run Code Online (Sandbox Code Playgroud)

  • 这种方法并不安全。在沙箱中运行脚本后,您将如何判断它是否安全?它可能会产生您无法轻易说出的有害影响。恶意软件不一定会弹出并说“哈哈,明白了!”。此外,恶意脚本很容易在沙箱或虚拟机中以良性方式运行,然后在您的真实计算机上运行。(例如,VM 检测是一回事,机器指纹识别也是如此。) (38认同)
  • 这是一个很好的观点。如果您想检查脚本中是否存在恶意软件,这不是一个有效的解决方案。这是一种在不污染主机系统的情况下测试功能的方法。 (12认同)
  • @mckenzm:但如果它是恶意软件,它完全有可能选择什么都不做,直到它发现自己可以访问看起来多汁的东西。 (6认同)

Win*_*nix 11

由于您就读的学校已经发布了脚本,因此表达您的担忧的最佳场所是您的导师。

也就是说,我们可以帮助您逐行破译密码。对于这里的任何人来说,分析所有代码可能是不切实际的。

您实际上有 40 个 bash 脚本,总共 5,360 行。我将它们组合在一起并寻找可能被滥用的 bash/shell 命令。它们似乎都可以正常使用

$ cat /tmp/sshellcheck.mrg | grep " rm "

      rm -rf "$RETURNPATH"/tmp/*
      rm -f "$RETURNPATH"/.mynorminette
    rm -f $LOGFILENAME
    rm -f $LOGFILENAME
      rm -f .mymoulitest
        rm -f "${RETURNPATH}/tmp/${FILEN}"

$ cat /tmp/sshellcheck.mrg | grep -i kill

  function check_kill_by_name
          kill $PROCESSID0
  declare -a CHK_MINISHELL_AUTHORIZED_FUNCS='(malloc free access open close read write opendir readdir closedir getcwd chdir stat lstat fstat fork execve wait waitpid wait3 wait4 signal kill exit main)'
        check_kill_by_name "${PROGNAME}"
      kill -0 "${CURRENT_CHILD_PROCESS_PID}" 2>/dev/null && kill "${CURRENT_CHILD_PROCESS_PID}" 2>/dev/null
      display_error "killed pid: ${CURRENT_CHILD_PROCESS_PID}"
    check_kill_by_name "$PROGNAME $PROGARGS"
        check_kill_by_name "$PROGNAME $PROGARGS"
        kill ${PID} 2>/dev/null

$ cat /tmp/sshellcheck.mrg | grep -i root

      "check_configure_select ROOT" "Root folder:          /"\
      'ROOT')
        echo "'${ALLOWED_FILES}' must be placed at root folder but was found here:" >>"${LOGFILENAME}"
        printf "%s" "'${ALLOWED_FILES}' must be placed at root folder"

$ cat /tmp/sshellcheck.mrg | grep -i sudo

$ 
Run Code Online (Sandbox Code Playgroud)
  • 没有rm -rf /擦除整个硬盘分区的命令。
  • 没有sudo用于运行脚本的要求。
  • 该脚本实际上确保C在检查的文件中只使用授权的函数。
  • bash/shell 代码的快速浏览表明它是专业编写的并且易于遵循。
  • 对合并的包含文件使用shellcheck只显示三个语法错误。
  • 作者姓名被确定,主要作者甚至在他的github页面上都有他的照片。
  • 虽然在生活中没有任何保证,但42FileChecker使用起来似乎是安全的。

您需要担心的不是人类可读的 bash 脚本。它是编译后的二进制对象,您无法阅读,这是令人担忧的。例如,一个名为“shiny-bouncy-sphere”的程序可能会在您的屏幕上绘制类似的内容,但在后台它可能会擦除您的所有文件。


原答案

最好询问脚本的作者它的作用是什么。实际上,您几乎可以像上面那样逐字逐句地发布您的问题。

还请教作者:

  • 更新了哪些文件?
  • 断电或程序错误导致死机怎么办?
  • 可以先进行迷你备份吗?

以及您能想到的任何其他好问题。


编辑 1 - 担心恶意作者。

您应该只使用具有大量良好公众评价的软件。或者,您在 Ask Ubuntu 中信任的作者,如 Serge、Jacob、Colin King 等。其他受人尊敬的网站,如 Ask Ubuntu 及其受人尊敬的成员也应被视为“非恶意”。

Ask Ubuntu 中“受人尊敬的作者”的优势在于他们将自我价值押在“声誉点”上。如果他们故意编写“窃取”或“损坏”数据的代码,他们将很快失去声誉。事实上,作者可能会遭受“模组的愤怒”并被暂停和/或失去 10,000 的声望点。


编辑 2 - 不要遵循所有说明

我深入研究了您的 bash 脚本说明:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker &&
    cd ~/42FileChecker &&
    bash ./42FileChecker.sh
Run Code Online (Sandbox Code Playgroud)

“安全”方法是只运行第一行:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker
Run Code Online (Sandbox Code Playgroud)

这会下载脚本但不会运行它们。接下来使用nautilus(文件管理器)检查安装的目录和文件。很快您就会发现有一组 bash 脚本是由法国的一群学生编写的。

脚本的目的是编译和测试 C 程序的不正确功能和内存泄漏。

  • 我正在 Ecole 42 课程中学习 C。我正在制作的功能需要通过此规范检查。我需要在 Ubuntu 中安装 42FileChecker 来运行这个标准检查。我想我现在只需要相信这个脚本,但我首先需要知道如何对脚本进行“安全运行”,因为我不太擅长进行人员搜索。谢谢您的帮助。下次我只运行一个虚拟机。 (2认同)
  • @nicholas `~/42FileChecker/includes/display/display_credits.sh` 的第 24 行指出norminette 的工作是一个依赖:`norminette (42born2code) http://www.42.fr`。我昨晚读了这篇文章,这就是为什么我写它是法国的一所学校(ecole),发布了**42FileChecker**。从我目前浏览的代码来看,我不会担心运行它。此外,`shellcheck` 报告的语法错误很少,这对于 5,360 行的 bash 脚本来说是令人惊讶的。许多专业发布的 bash 脚本有很多语法错误。 (2认同)
  • @nicholas 从安全的角度来看,使用为类提供的环境和脚本可能是最好的方法。它还消除了与官方课程版本不同的行为的可能性,这可能会在上交时间出现意外。您确定没有对这台机器的远程访问,可能使用校园提供的 VPN 服务或您可以远程访问的另一台计算机的 SSH? (2认同)

Syf*_*ski 5

您可以使用 Docker。Docker 容器与主机操作系统隔离,因此任何恶意活动都将保留在容器内,只要您不通过转发端口或挂载文件系统来明确释放它。

安装泊坞窗:

sudo apt-get install docker.io
Run Code Online (Sandbox Code Playgroud)

要下载新的 Ubuntu Bionic 容器:

docker pull ubuntu:bionic
Run Code Online (Sandbox Code Playgroud)

之后,登录容器

docker run -it ubuntu:bionic
Run Code Online (Sandbox Code Playgroud)

并在其中执行狡猾的操作:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker && cd ~/42FileChecker && bash ./42FileChecker.sh
Run Code Online (Sandbox Code Playgroud)

  • 你应该运行`docker run -it ubuntu:bionic`而不是`docker run ubuntu``-it`在容器中为你提供一个交互式终端,`bionic`实际上运行你想要的版本而不是默认的`latest` . (2认同)

小智 5

我不是这方面的专家,但我建议使用stracedocker

因此,首先按照此答案中的说明创建一个 Docker 容器。但补充的是 strace 会告诉你进行了哪些系统调用。或者引用:

strace 是一个用于 Linux 的诊断、调试和指导用户空间实用程序。它用于监视和篡改进程与 Linux 内核之间的交互,包括系统调用、信号传递和进程状态的更改。

您可以将这些命令组合起来

docker exec -it ubuntu_container strace bash ./42FileChecker.sh
Run Code Online (Sandbox Code Playgroud)