找回密码
 立即注册
搜索
查看: 2744|回复: 9

[软件] c语言里有没有办法通过文件句柄删除一个文件

[复制链接]
     
发表于 2023-4-2 10:34 | 显示全部楼层 |阅读模式
类似于fd = open...
delete_by_fd(fd)
查了下,unlink传的是路径名,这会导致一个问题,如下,但是它说的目录权限设置没看懂

Opening a UNIX file and unlinking it later creates
a race condition.

By replacing the named open file with another file
or symbolic link, an attacker can cause
unlink() to be applied to the wrong file.

This problem can be avoided with proper
permissions on the file’s containing directories.







回复

使用道具 举报

     
发表于 2023-4-2 10:41 | 显示全部楼层
用readlink拿路径再删

  1. #include<stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>

  4. int delete_file(int fd) {
  5.    char *str_fd = itoa(fd, str_fd, 10);
  6.    char *path = strcat("/proc/self/fd/", str_fd);
  7.    
  8.    if (read_link(path, buffer, bufsize) == -1)
  9.         return -1;
  10.         
  11.    int del = remove(filename);
  12.    if (!del)
  13.       printf("The file is Deleted successfully");
  14.    else
  15.       printf("The file is not Deleted");
  16.    return 0;
  17. }
复制代码
回复

使用道具 举报

     
 楼主| 发表于 2023-4-2 12:15 | 显示全部楼层
shinzero 发表于 2023-4-2 10:41
用readlink拿路径再删

readlink 只是读取fd这个文件对应的内容,调用完readlink函数,cpu切换到另外一个进程,对该文件重命名,然后用其他文件重命名,切换回来后,remove函数删除的是被替换的文件,而不是原来的那个文件
回复

使用道具 举报

     
发表于 2023-4-2 12:22 | 显示全部楼层
这是并发问题,但是你的环境下真的会去做这种操作吗,你要照你贴的东西那样搞破坏?
回复

使用道具 举报

     
 楼主| 发表于 2023-4-2 12:55 | 显示全部楼层
本帖最后由 b0207191 于 2023-4-2 12:56 编辑
shinzero 发表于 2023-4-2 12:22
这是并发问题,但是你的环境下真的会去做这种操作吗,你要照你贴的东西那样搞破坏? ...

所以是想请教下怎么写可以防止并发的破坏
本来想用
    old_flags |= FS_IMMUTABLE_FL;
    if (ioctl(fd, FS_IOC_SETFLAGS, &old_flags) < 0){
        perror("ioctl(2) error");
        return 0;
    }

但这样,程序自己都不能unlink这个文件了
回复

使用道具 举报

     
发表于 2023-4-2 15:58 | 显示全部楼层
不知道是否正确理解了楼主意思:
主楼里文档部分描述的解决方法是让程序运行在一个独立账户下(使用该账户的只有本程序),同时这个待删除文件的目录只准许该账户访问,那么其他任何程序就无法访问该文件了,自然也无法出现上面所说的其他程序并发操作问题(相当于文件被本程序独占了)。
回复

使用道具 举报

     
 楼主| 发表于 2023-4-2 20:33 | 显示全部楼层
xyx19851106 发表于 2023-4-2 15:58
不知道是否正确理解了楼主意思:
主楼里文档部分描述的解决方法是让程序运行在一个独立账户下(使用该账户 ...

这种方法感觉太复杂了,比如遇到这种的情况,应该是很常见的一个逻辑
1,判断一个文件大小,使用stat函数
2.  如果太大删除它, unlink函数
如何让1,2步骤实现原子化
回复

使用道具 举报

     
发表于 2023-4-2 20:42 | 显示全部楼层
我比较好奇是什么实际场景需要在这种地方要求原子化
回复

使用道具 举报

     
发表于 2023-4-2 20:52 | 显示全部楼层
本帖最后由 xyx19851106 于 2023-4-2 21:02 编辑
b0207191 发表于 2023-4-2 20:33
这种方法感觉太复杂了,比如遇到这种的情况,应该是很常见的一个逻辑
1,判断一个文件大小,使用stat函数 ...

可以考虑使用flopen在打开文件时加锁互斥(删除仍然用unlink),但是这个接口貌似不是posix的标准接口(linux和bsd下应该是可用的)。
更正:忘了楼主是个完全不可控的并发环境,这应该是不行的。


回复

使用道具 举报

     
 楼主| 发表于 2023-4-2 21:48 | 显示全部楼层
ckl80 发表于 2023-4-2 20:42
我比较好奇是什么实际场景需要在这种地方要求原子化

是为了避免toctou

https://resources.infosecinstitu ... -vulnerability-lab/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-11-13 16:48 , Processed in 0.053443 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表