MST

星途 面试题库

面试题:复杂Bash脚本的安全审计与漏洞修复

给定一段复杂的Bash脚本(脚本实现了系统配置修改、网络连接建立以及文件传输等多种功能),请对其进行全面的安全审计,指出可能存在的安全漏洞,并详细说明修复方案。
17.9万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

可能存在的安全漏洞及修复方案

  1. 命令注入漏洞
    • 漏洞表现:如果脚本中使用了用户输入来构造命令,如 eval 等函数,可能会导致命令注入。例如:
input=$1
eval "echo $input"

若用户输入 ; rm -rf /,则会执行删除根目录下所有文件的危险操作。

  • 修复方案:避免使用 eval,对用户输入进行严格校验和过滤。例如,使用 case 语句对合法输入进行匹配:
input=$1
case $input in
  [a-zA-Z0-9])
    echo $input
    ;;
  *)
    echo "Invalid input"
    ;;
esac
  1. 文件权限不当
    • 漏洞表现:在进行文件传输或修改系统配置文件时,如果设置的文件权限过于宽松,可能导致其他用户可以随意修改这些文件。比如使用 chmod 777 对重要配置文件进行权限设置。
chmod 777 /etc/someconfig.conf
  • 修复方案:根据实际需求设置合适的文件权限。对于系统配置文件,通常应该是只有管理员(root)可写,其他用户可读,如 chmod 644 /etc/someconfig.conf
  1. 未验证的网络连接
    • 漏洞表现:在建立网络连接时,如果没有对目标主机进行身份验证,可能会连接到恶意主机,导致数据泄露。例如使用 ftp 连接时没有验证主机密钥。
ftp -n somehost <<END_SCRIPT
  user username password
  get somefile
END_SCRIPT
  • 修复方案:使用更安全的协议如 sftp,并验证主机密钥。例如:
sftp -o StrictHostKeyChecking=yes username@somehost <<END_SCRIPT
  get somefile
END_SCRIPT
  1. 密码硬编码
    • 漏洞表现:如果在脚本中直接硬编码了系统登录密码或其他敏感信息,一旦脚本泄露,密码就会暴露。例如:
sshpass -p "mypassword" ssh user@host
  • 修复方案:使用环境变量来存储敏感信息,并且确保环境变量的安全性。例如:
export SSH_PASSWORD="mypassword"
sshpass -p "$SSH_PASSWORD" ssh user@host
  1. 缺乏错误处理
    • 漏洞表现:如果脚本在执行系统配置修改、网络连接建立或文件传输等操作时没有适当的错误处理,可能会在出现错误时继续执行,导致系统处于不一致或不安全的状态。例如:
sed -i 's/oldvalue/newvalue/' /etc/someconfig.conf
scp somefile user@host:/destination

如果 sed 命令失败,scp 命令仍会执行,可能传输错误的文件。

  • 修复方案:在每个关键操作后检查返回状态码。例如:
sed -i 's/oldvalue/newvalue/' /etc/someconfig.conf
if [ $? -ne 0 ]; then
  echo "Sed command failed. Aborting further operations."
  exit 1
fi
scp somefile user@host:/destination
if [ $? -ne 0 ]; then
  echo "SCP command failed."
  exit 1
fi
  1. 未加密传输敏感数据

    • 漏洞表现:在文件传输功能中,如果使用如 ftp 等未加密协议传输敏感数据文件,数据可能被中间人截取。
    • 修复方案:使用加密协议如 scpsftp 进行文件传输。
  2. SUID/SGID 位不当设置

    • 漏洞表现:如果脚本创建的可执行文件或修改现有文件设置了不当的 SUID/SGID 位,可能会导致权限提升漏洞。例如,将一个普通用户可执行文件设置为 SUID 位且所有者为 root。
chmod u+s /path/to/executable
  • 修复方案:仔细评估是否真的需要设置 SUID/SGID 位。如果确实需要,确保程序逻辑安全,不会被恶意利用。如果不需要,去除 SUID/SGID 位,如 chmod u-s /path/to/executable