我的 bash shell 需要一个临时文件。假设文件名冲突不是问题,我可以说mktemp
不如手动触摸临时文件umask 066
吗?
我的假设是:mktemp 是一个系统函数,与手动触摸文件相比,它仍然需要更多的资源。
我读过一些关于ln -s etc/passwd
攻击的东西,但它看起来像是几十年前没有隐藏密码的故事。
如果我的理解有误,请纠正我。
这两个命令注定不会做同样的事情。 mktemp
以灵活的方式创建文件,并具有确保使用唯一名称的功能。 touch
将修改文件的时间戳(如果文件不存在则创建它),但您提供名称。
如果要创建一个已有名称的空文件,请使用touch
; 如果您要在之后立即写入该文件,则无需先创建它,只需重定向到它即可。
但是,如果您确实需要制作一个临时文件并确保不会覆盖任何其他文件,touch
那么您什么也做不了。也许它“更轻”,但在这种情况下没用,你需要mktemp
.
mktemp 命令由 OpenBSD 的 Todd C. Miller 编写,用于防止 shell 脚本中的常见漏洞。用他自己的话来说:
Mktemp 是一个简单的实用程序,旨在使 shell 脚本中的临时文件处理变得安全和简单。传统上,编写 shell 脚本的人使用的结构如下:
TFILE=/tmp/foop.$$
这是微不足道的攻击。如果这样的脚本以 root 身份运行,则本地主机上的攻击者可能会获得对 root 登录的访问权限、损坏或取消链接系统文件,或执行各种其他令人讨厌的事情。
基本问题是大多数 shell 没有等效于 open(2) 的 O_EXCL 标志。虽然使用临时目录可以避免这种情况,但我认为使用 mktemp(1) 在简单性和健壮性方面都更胜一筹。
影子密码在这里没有帮助。如果脚本以 root 身份运行并且它以不安全的方式写入临时文件,那么攻击者可能会利用竞争条件来修改 /etc/password 或 /etc/shadow 或两者!