编写安全外壳脚本

不要用草率的脚本暴露你的系统!

尽管 Linux 桌面或服务器比典型的 Windows 设备更不容易受到病毒和恶意软件的攻击,但互联网上没有最终没有受到攻击的设备。

无论如何,现代系统面临着在UNIX开发初期,甚至在Linux最初几年作为UNIX的业余爱好者重新实施时无法想象的威胁。

这就是为什么学习如何编写 shell 脚本最重要的步骤之一是学习如何确保脚本是安全的,即使它只是您自己的家庭计算机和一台旧 PC,您已转换为基于 Linux 的媒体服务器与 Plex 或类似。

让我们来看看一些基础知识。

了解您调用的实用程序

下面是一个经典的特洛伊木马攻击:攻击者将调用到 /tmp 中的脚本丢弃,它只需检查调用它的用户 ID,然后将其整个参数序列传递到真正的 /bin/ls。如果它识别 userid = root,它将 /bin/sh 的副本转换为 /tmp,并具有无害的名称,然后将其权限更改为 setuid root。ls

脚本如下:


#!/bin/sh

if [ "$USER" = "root" ] ; then
  /bin/cp /bin/sh /tmp/.secretshell
  /bin/chown root /tmp/.secretshell
  /bin/chmod 4666 root /tmp/.secretshell
fi

exec /bin/ls $*

我希望你明白刚才发生了什么。这个简单的小脚本创建了一个 shell,该外壳始终授予其用户对 Linux 系统的根访问权限。伊克斯一旦根壳被创建,更奇特的版本将删除自己,对此没有留下任何痕迹。

因为讽刺应该是,嗯,讽刺,我在上面演示如何避免这种危险的小木马脚本。切永远不要只用程序的名字来调用程序;确保你包括他们的路径。有麻烦的脚本,所以用修复它。ls $HOME/bin/ls $HOME

此风险可能出现在您的 PATH 中,这是一个有趣的额外位置。同样,假设您的 PATH 设置为这样:

PATH=".:/bin:/usr/bin:$HOME/bin:/usr/local/bin"

 这是没有问题的, 调用或甚至会做你期望的只是未能找到在你的 PATH 的第一个目录, 所以级联到 /bin 合法二进制文件存储.但是,当您调用命令时,如果碰巧在 /tmp 中,会发生什么?没有意识到它,你实际上调用了木马版本,并再次创建了根外壳(如果你是根在当时,当然)。lscpdate

解决方案:要么永远不会将点作为 PATH 中的目录(我的建议),要么将点作为链中的最后一个条目,而不是第一个条目。

不要将密码存储在脚本中

我承认,我不是最好的,因为我有一些别名,实际上推密码到我的复制/粘贴缓冲区,然后调用或连接到远程计算机。这是一个愚蠢的解决方案,因为它不可避免地意味着我有一个 shell 脚本(或别名文件,本例中)具有这样的行:sshsftp

PASSWORD="froBOZ69"

或者像这样:

alias synth='echo secretpw | pbcopy; sftp adt@wsynth.net'

解决方案:只是不要这样做。如果你必须,那么,那么至少不要使用这样一个可笑的明显(和易于识别的扫描)变量名。但实际上,找到一个替代的实用程序来完成的工作,它不值得安全风险。

小心调用任何用户输入

这是一个微妙的问题,但存在一个非常大的安全风险,在一个简单的序列,如下所示:

echo -n "What file do you seek? "
read name
ls -l $name

如果用户输入类似恶意的内容作为文件名,会发生什么:

. ; /bin/rm -Rf /

相当可怕的后果,无论是脚本被调用为根或只是一个普通用户。如果引用参数,Bash 具有某种级别的保护,因此前面的序列将随着更改为以下更改而受到保护:

/bin/ls -l "$name"

但是,如果它被调用为 ,则不适用。哦, 还有臭名昭著的背蒂克。想象一下用户输入像这样:eval /bin/ls -l "$name"

. `/bin/rm -Rf /`

这是另一个风险,因为对是惰性快捷方式,并在命令行上遇到子shell 时调用子壳。调用将只执行这样的外壳了。``$( )ls

要修复此危险,如果您有理由相信您的脚本可能有恶意用户,请扫描并清除您的输入。简单的解决方案:如果您遇到不是字母数字的字符或一组安全的标点符号,则出错。

不要将壳壳脚本用于 CGI 脚本

运行 Linux Web 服务器并了解 CGI 脚本?使用 shell 脚本实现基本的 CGI 函数不仅很诱人,而且快速而简单。下面是一个脚本,它告诉您服务器上的负载:

#!/bin/sh

echo "Content-type: text/html"; echo ""
echo "Uptime on the Server:<pre>"
uptime -a
echo "</pre>"

一旦正确设置了权限,这工作正常。这不是太危险,但如果你想做类似一些类似自家搜索系统的网站呢?同样,每次有一个脚本运行与来自未知用户的输入,你增加了一些主要风险因素。

在这种情况下,解决方案是不要这样做。改为使用编译程序,实现安全和适当的安全,或只是使用第三方搜索系统,如谷歌自定义搜索引擎,以最大限度地安全。

智能地进行编码

喜欢Linux shell中的编程有很多原因,其中最不重要的就是它快速而容易地进行原型制作。但是,如果你真的要创建一个安全的计算环境,你需要专注于安全,你走,而不是意识到后,你做了一些愚蠢的事情。

一些好的在线资源更深入地涵盖这些主题。请查看GitHub 上的外壳样式指南以开始使用。此外,苹果有一个关于外壳脚本安全性的文档,也非常值得一读。

小心!一点点额外的时间,以确保您的脚本是安全的,从主要已知的风险是时间花得好。


标签: shell

作者头像
南宫俊逸创始人

君子好学,自强不息~

上一篇:BTRFS文件系统??
下一篇:巧用文件锁功能,防止脚本程序同一时间内重复执行而进入卡死状态?

发表评论

vidnami 在线视频创作工具--做海外推广营销视频必备工具

image.png


我们的折扣优惠是向观众推广Vidnami的绝妙方式。他们将即时访问 25% 的 Vidnami, 再加上我们的视频营销包免费。最棒的是,您将获得所有销售额的50%!

https://www.vidnami.com/c/Mr_xiaoxiao-vn-buy-discount 

期待各位的加入,让原创发挥活力,让阅读更有价值!登录注册
登录
用户名
密码
注册
用户名
密码
确认密码
邮箱
验证码
找回密码
用户名
邮箱
※ 重置链接将发送到邮箱