int openat(int dirfd, const char *pathname, int flags);
这篇博客说的很详细了---关于 TOCTTOU 攻击的简介,摘抄其中一段关于 openat 可以避免 TOCCTOU 的内容:
现在考虑这样一种攻击,“setuid 受害者”进程会在 open() 中使用了相对路径 ./foo.txt 打开一个文件,并随后进行操作。** 攻击者可以将“受害者”进程的工作目录修改指向为敏感目录,从而修改不同文件。 **但如果我们能够保证有一个确定合法的文件夹句柄(文件描述符),然后使用 openat() 访问相对的文件,那么即使攻击者修改了“那个”目录,我们在进程中依然可以确保访问文件夹 /文件是合法的。
foo.txt 文件已经打开了,这个文件的句柄就不会改变了,就算攻击者将这个程序的工作目录修改指向为其他目录,再对这个句柄操作,操作的还是 foo.txt 这个文件啊,怎么就可以修改不同文件了?
OCTTOU 错误的基本思想是:如果有两个基于文件的函数调用, 其中第二个调用依赖于第一个调用的结果,那么程序是脆弱的.因为两 个调用并不是原子操作,在两个函数调用之间文件可能改变了,这样也 就造成了第一个调用的结果就不再有效,使得程序最终的结果是错误 的。文件系统命名空间中的 TOCTTOU 错误通常处理的就是那些颠覆文件系统权限的小把戏,这些小把戏通过骗取特权程序降低特权文件的权限控制或者让特权文件打开一个安全漏洞等方式进行。Wei 和 Pu[2005]在 UNIX 文件系统接口中讨论了 TOCTTOU 的缺陷。
另外问个问题,v2ex 的 markdown 不支持粗体和斜体吗?