将wget或curl输出的内容管道给bash或者sh是一件非常愚蠢的事,例如像下面这样:

wget -O - http://example.com/install.sh | sudo sh

命令解释:wget的-O参数是指明输出文件名,一般后面接具体的文件名,这里接“-”表示“written to stdout”即写入到标准输出而不保存在本地磁盘,然后将标准输出里的内容作为输入传递给sudo sh命令。

随处可见 这样的例子。有时候它们也告诉你忽略证书(看看Salt),这些操作都是无声无息的。
 
我认为其无声无息(而不是在你机器上运行任意命令,基于用户代理来欺骗你)的主要原因是其失败模式(failure mode)。
 
如果连接中途关闭了会发生什么?让我们来一起见证吧!
(echo -n "echo \"Hello\""; cat) | nc -l -p 5555
 
命令解释:
(1)echo的-n参数指明不在输出结尾添加“\r\n”行为,即不显式添加换行符(默认是添加的);
(2)cat命令只有遇到换行符才会结束,否则一直处于挂起状态,直到遇到换行符结束;
(3)nc命令是网络检测工具,具体用法请Google,这里-l指处于监听模式,-p 5555表示在5555号端口处监听。
 
这将给连接端发送一条命令,但是并没有发送换行符,因此它会一直处于挂起状态。让我们连接此客户端:
nc localhost 5555 | sh
 
一开始,什么也不会发生。很好!如果我们用kill -9命令强制杀掉正在监听的netcat会发生什么呢?sh命令会执行其缓冲区里的部分命令吗?
nc localhost 5555 | sh
Hello
过程说明:
(1)如何杀掉正在监听的netcat?
首先用ps -auf | grep nc命令找到“(echo -n "echo \"Hello\""; cat) | nc -l -p 5555”该监听命令的进程pid,然后kill -9 该pid即可杀掉。
(2)“Hello”是杀掉nc监听进程后连接客户端方的输出结果,怎么输出的?
连接中途关闭后,“(echo -n "echo \"Hello\""; cat) | nc -l -p 5555”命令里的管道输入“(echo -n "echo \"Hello\"")”会被存入临时缓冲区内,此时连接方“nc localhost 5555 | sh”中的“nc localhost 5555”会接收该缓冲区的内容,也就是此时连接方的命令会变成:
(echo -n "echo \"Hello\"") | sh

当然输出Hello了。

 
从上面可以看出,真的执行了,要是换作wget或curl命令又会如何呢?
wget -O - http://localhost:5555 | sh
--2013-10-31 16:22:38-- http://localhost:5555/
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:5555... connected.
HTTP request sent, awaiting response... 200 No headers, assuming HTTP/0.9
Length: unspecified
Saving to: `STDOUT' [ <=> ] 12 --.-K/s in 8.6s 2013-10-31 16:22:47 (1.40 B/s) - written to stdout [12] Hello

可见,结果是一样的。

如果这部分命令不是无害的echo而是下面的这些命令,又会怎样?
TMP=/tmp
TMP_DIR=`mktemp`
rm -rf $TMP_DIR
无害?真的吗?如果在命令“rm -rf $TMP ”被发送后立即关闭连接呢?这将删除temp目录里的一切文件,这是相当的有害啊。
 
看起来貌似不大可能会发生这样的事情,但是这样的结果一旦发送,即使只发生一次,后果也可能是灾难性的,让我们悔之不及。
 
所以,朋友们,请不要将任何命令的输出内容作为输入管道给你的shell。

编译自《Hacker Monthly #45》中的“existential type crisis : Don't Pipe to your Shell”,本文在原文基础上加上自己的理解稍作修饰。

Linux鲜为人知的安全漏洞:不要将输出内容管道给你的shell的更多相关文章

  1. linux中的输入从定向和输出重定向

    linux的标准的输入和输出为如下 我们在 linux中执行命令时,命令默认输出到console中,很多时候我们需要将命令输出到其他设备上如最常见的就文件中去,或者重文件中输入.那这时候就需要用到li ...

  2. Linux中记录终端(Terminal)输出到文本文件(转载)

    一,如何把命令运行的结果保存到文件当中? 这个问题太简单了,大家都知道,用 > 把输出转向就可以了 例子: [lhd@hongdi ~]$ ls > ls.txt [lhd@hongdi ...

  3. Linux Kernel 整数溢出漏洞

    漏洞名称: Linux Kernel 整数溢出漏洞 CNNVD编号: CNNVD-201311-062 发布时间: 2013-11-07 更新时间: 2013-11-07 危害等级:    漏洞类型: ...

  4. Linux kernel 内存损坏漏洞

    漏洞名称: Linux kernel 内存损坏漏洞 CNNVD编号: CNNVD-201310-143 发布时间: 2013-10-11 更新时间: 2013-10-11 危害等级: 中危   漏洞类 ...

  5. Linux Kernel 本地拒绝服务漏洞

    漏洞名称: Linux Kernel 本地拒绝服务漏洞 CNNVD编号: CNNVD-201308-090 发布时间: 2013-08-08 更新时间: 2013-08-08 危害等级:    漏洞类 ...

  6. Linux Kernel 远程拒绝服务漏洞

    漏洞名称: Linux Kernel 远程拒绝服务漏洞 CNNVD编号: CNNVD-201307-309 发布时间: 2013-07-18 更新时间: 2013-07-18 危害等级:    漏洞类 ...

  7. Linux seq_printf输出内容不完整的问题

    Linux seq_printf输出内容不完整的问题 写在前面的话:这是多年前在项目中遇到的问题,作为博客的开篇之作,有不足之处,请各位大侠斧正!谢谢! seq_file接口介绍 有许多种方法能够实现 ...

  8. Linux命令 ls -l 输出内容含义详解

    Linux命令 ls -l s输出内容含义详解   1. ls  只显示文件名或者文件目录 2. ls -l(这个参数是字母L的小写,不是数字1) 用来查看详细的文件资料 在某个目录下键入ls -l可 ...

  9. 《学渣Linux笔记》——更改ls命令的输出颜色和命令提示符颜色(二)

    <学渣Linux笔记>--更改ls命令的输出颜色和命令提示符颜色(二) II.更改命令提示符颜色 命令提示符的显示格式是由变量PS1决定的,首先我们查找GNU官方手册,发现如下内容(不是我 ...

随机推荐

  1. springMVC-自定义数据类型转换器

    自定义类型转换器 201603005,今天想了一个问题,Spring中的Conventer是如何实现的,因为他没有绑定类中的属性,它怎么知道要将那个String转换?看了几遍的书也没有找到,后来想想, ...

  2. [NOIP2015] 提高组 洛谷P2668 斗地主

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  3. Android数据库升级

    随着Android应用版本的迭代,经常遇到数据库表结构发生改变,或者一些指定的表数据需要更新.这也就引出一个问题Android数据库的更新问题. Android数据库升级分类 Android数据库更新 ...

  4. hihocoder #1341 Constraint Checker

    传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given a set of constraints like 0<N<=M<=100 and ...

  5. Server 对象

    如何解决Response.Redirect方法传递汉字丢失或乱码问题? 为了确保传递的汉字被正确地接收,可以在传值之前使用Server对象的UrlEncode方法对所传递的汉字进行URL编码.代码如下 ...

  6. bootstrap学习总结-04 常用标签2

    1 表格 Bootstrap为表格设计了漂亮的样式. 1)表格基本实例 任意 <table> 标签添加 .table. <table class="table"& ...

  7. Yocto开发笔记之《串口驱动调试》(QQ交流群:519230208)

    QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样 ======================================================== 串口驱动各 ...

  8. 【原】requirejs学习笔记

    随着JS越来越庞大,已经不仅仅是以前复制粘贴做特效的时代了,JS越来越偏向于业务逻辑与应用.JS在web开发中占有越来越重要的地位. 由于JS代码庞大,文件数目多,传统的使用<script sr ...

  9. audio patch(10.9.3) [2.6.1]

    ; Basic Block Input Regs: rax -  Killed Regs: <nothing>0000000000048353 3D8419D411             ...

  10. Oracle数据库的备份方法

    1.引言 Oracle数据库的备份方法很多,无论使用那种备份方法,备份的目的都是为了在出现故障后能够以尽可能小的时间和代价恢复系统.比如使用export实用程序导出数据库对象.使用Oracle备份数据 ...