作为this one的后续问题,我想到了另一种方法,它构建了@ caf的答案,用于我想要附加到文件name
的情况,并在不存在的情况下创建它。模拟O_NOFOLLOW(2):这种其他方法安全吗?
这里是我想出了:
- 在系统临时目录在同一文件系统的文件
name
创建模式0700的临时目录。 打开文件name
只读和O_CREAT
。如果它是符号链接,则操作系统可能会遵循name
。使用mkstemp
在临时目录中创建一个临时文件,并尝试rename
由mkstemp
创建的临时文件到name
。
打开文件name
仅供阅读和O_CREAT | O_EXCL
。- 以临时目录中的临时名称迭代尝试建立到
name
的硬链接。如果由于除“链接目标存在”(错误号码EEXIST
)之外的错误导致link
呼叫失败,请退出。 (也许有人来过并删除了文件name
,谁知道?) - 使用
lstat
对temp_name
(硬链接)。如果S_ISLNK(lst.st_mode)
,则退出。 open
temp_name
写作&附加(O_WRONLY | O_APPEND
)。- 把一切写出来。关闭文件描述符。
unlink
硬链接。- 删除临时目录。
(所有这一切,顺便说一下,是一个open source project是我的工作。你可以查看我的实现这种方法here的来源。)
这是程序安全对符号链接攻击?例如,是否有可能恶意进程确保name
的inode代表lstat
检查期间的常规文件,然后使inode成为指向新的符号链接的硬链接的符号链接?
我假设恶意进程不会影响temp_name
。
编辑:link
不会覆盖目标,因此创建一个“占位符”临时文件是不是我想要做的。之后我更新了代码并更新了上述步骤。
EDIT2:我现在使用的是备用程序步骤2中,如果不存在的话,我不认为是易受this problem创建文件name
。
EDIT3:比重命名一个临时的,空的,常规文件name
,其中也有取消链接name
,然后重命名的效果更妙的是,我可以打开该文件O_RDONLY | O_CREAT | O_EXCL
。
为open
状态POSIX标准:
如果
O_EXCL
和O_CREAT
设置,并path
名的符号链接,open()
失败,将设置errno
到EEXIST
,不管符号链接的内容。
您的最终POSIX引用看起来像一个答案。如果是这样,为什么不把它作为答案并接受它,所以这个问题不再显示为“未答复”? – 2010-08-08 04:59:38
@ R。抱歉。我已经接受了我的回答。 – 2010-08-08 17:50:47