管道curl到sh的安全隐患解析

本文深入探讨了直接使用curl管道到sh命令安装软件的安全风险,包括中间网络中断导致的脚本执行不完整、服务器可能针对不同用户返回不同内容等安全隐患,并对比了与源码编译安装的差异。

管道curl到sh的安全隐患解析

问题概述

许多流行工具的主页都会提供类似的一行命令:

1
curl https://fancy.tool/install.sh | /bin/sh

总有人评论说这种做法不安全。但真的比克隆仓库、构建并运行代码更不安全吗?

安全隐患分析

网络中断风险

简单的安装脚本:

1
2
3
4
echo 'Installing foobar...'
echo "步骤1"
echo "步骤2" 
echo 'Foobar installed.'

如果网络连接在"步骤2"命令到达前中断,就会只执行了步骤1而没有执行步骤2。

更危险的例子:

1
2
3
4
5
echo 'Cleaning up old versions of foobar...'
rm -rf ~/.local/lib/foobar
echo 'Installing fresh copy of foobar...'
# 这里应该是curl | tar解压
echo 'Foobar installed'

如果网络在恰当时机中断,可能导致rm -rf ~命令执行不完整。

服务器检测与差异化响应

存在一种巧妙攻击:脚本可能让bash缓慢读取,导致curl产生背压,服务器可以检测到这一点,并提供与直接下载不同的脚本内容。这种攻击感觉"难以检测",因此格外可怕。

验证缺失

这种方式完全消除了比较下载内容校验和与给定签名的可能性。而使用Git时,Merkle树能确保你获取与其他人都相同的源码/脚本。

对比分析

与源码安装对比

  • 构建源码至少知道用于生成二进制文件的代码
  • 包管理器通常能保证完全卸载工具
  • curl到bash通常不支持哈希验证,可能第一天安全安装,第二天网站被入侵就获得恶意软件

针对性攻击风险

恶意服务器可能通过IP地址识别你或你的雇主,向你发送恶意脚本,而向其他人发送良性脚本。同样的担忧也适用于从互联网下载任何脚本或可执行文件。

解决方案

正确做法

1
2
3
4
5
6
main() {
    echo 'Cleaning up old versions of foobar...'
    # 其他操作
}

main

更安全的方法

1
curl -f https://fancy.tool/install.sh > install.sh && sh install.sh

这种方式相比curl | sh有几个优势:

  • 在mac上绕过gatekeeper/公证
  • 防恶意软件工具可以获取文件哈希并可能阻止执行
  • 至少有一些东西可以逆向分析以弄清楚它做了什么

现实考量

大项目可能会正确处理这些问题,但并非所有人都会。即使是明显的安全措施,如果假设不再适用于更改后的代码或基础设施,安全性也只是想象。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计