mktemp采用含有结尾X字符的文件名模板(可选用的),我们建议至少使用12个X。程序会用从随机数字与进程ID所产生的文件或数字字符串来取代它们,所建立的文件名不允许与其他人访问,然后将文件名打印在标志输出上,这里看看mktemp的使用:
# TMPFILE=`mktemp /tmp/myprog.XXXXXXXXXXXX` || exit 1 # 建立唯一的临时性文件 # ls -l $TMPFILE # 列出临时性文件 -rw------- 1 root root 0 8月 28 18:57 /tmp/myprog.yW0oosXxljx5
进程编号在文件名尾号可以看出,但根本无法预测。当临时性文件无法建立或没有mktemp可用时,条件式exit命令可确保马上终止程序并带出错误输出。
最新版的mktemp允许省略模板;它会使用/tmp/tmp.XXXXXXXXXX。然而,较旧版本仍是需要模板,所以你的Shell版本请避免使用这种省略方式.
为避免在程序里将目录名称直接编码,可使用-t选项: 让mktemp使用环境变量TMPDIR所指定的目录或/tmp, -d选项要求建立临时性目录:
root@localhost:/tmp# DIR=`mktemp -d -t myprog.XXXXXXXXXXXX` || exit 1 # 建立临时性目录 root@localhost:/tmp# ls -lFd $DIR drwx------ 2 root root 4096 8月 28 19:06 /tmp/myprog.Hayy9pDnDBEB/ # 列出目录本身
由于组与其他人都无法访问目录,攻击者也无从得知你继续放入的文件名称,不过如果你的版本是开放公众读取的,当然还是可能猜出来!由于目录无法列出成列表,所以没有权限的攻击者就无法确认他的猜测。
/dev/random与/dev/urandom特殊文件
有些系统会提供两种随机伪设备:/dev/random与/dev/urandom。现在这些仅在BSD系统、GUN/linux、IBM AIX 5.2、Mac OS X与Sun Solaris 9, 搭配两个第三方的实例与早期Solaris版本的计算修整程序上,提供此支持。这些设备的任务,是提供永不为空的随机字节数据流:这样的数据来源是许多加密程序与安全应用程序所需要的。虽然已经有很多的简单算法可以产生这种虚拟随机数据流,但其实要产生一个真正的随机数据其实是很难的事。
这两个设备的差别,在/dev/random会一直封锁,直到系统产生的随机数已充分够用,所以它可以确保高品质的随机数。相对地,/dev/urandom不会死锁,其数据的随机程度也不高。
由于这些设备是共享资源,攻击者轻易就能加载拒绝服务,通过读取该设备并丢弃数据,阻断/dev/random。现在比较一下这两个设备,请注意它们两个在count参数下的不同:
root@localhost:/tmp# time dd count=1 ibs=1024 if=/dev/random > /dev/null # 读取1KB的随机码元祖 0+1 records in 0+1 records out 110 bytes (110 B) copied, 0.000108837 s, 1.0 MB/s root@localhost:/tmp# time dd count=1024 ibs=1024 if=/dev/urandom > /dev/null # 读取1MB的随机码元祖 1024+0 records in 2048+0 records out 1048576 bytes (1.0 MB) copied, 0.0832226 s, 12.6 MB/s










