使用C代码查找文件的inode编号

时间:2012-02-28 10:54:14

标签: c security root-access

我有程序,比如名字giverootAccess。该程序可以在当前目录(giverootAccess所在的位置)中接收文件名作为命令行参数。然后该文件将获得root访问权限。该文件可以是可执行文件或shell脚本。

现在的问题是,黑客可以通过将请求重定向到bash来获得root访问权限。我想限制用户只对giverootAccess所在目录中的那些文件提供root访问权限。黑客可以将文件名重定向到不需要的程序,从而获得root权限。

所以我需要一种机制来唯一地识别文件,而不是它的名字(因为它可以被模仿和黑客攻击)。 inode可以用于此目的吗?

我的计划是,当应用程序安装时,我将存储目录中所有文件的inode,每当有人运行带有文件名的giverootAccess时,我将检查文件名及其inode与存储的匹配。如果匹配,那么只有giverootAccess程序实际上提供对该文件的root访问权。

你有没有其他简单的机制来完成这项工作?

3 个答案:

答案 0 :(得分:6)

您可以使用文件描述符来获取inode编号,使用以下代码:

int fd, inode;  
fd = open("/path/to/your/file", YOUR_DESIRED_OPEN_MODE);

if (fd < 0) {  
    // some error occurred while opening the file  
    // use [perror("Error opening the file");] to get error description
}  

struct stat file_stat;  
int ret;  
ret = fstat (fd, &file_stat);  
if (ret < 0) {  
   // error getting file stat  
} 

inode = file_stat.st_ino;  // inode now contains inode number of the file with descriptor fd  

// Use your inode number
// ...

fstat 是一个系统调用,用于根据文件描述符确定文件的相关信息。 它被描述为here

stat 是一种包含文件元信息的结构,并说明here
使用stat结构和fstat系统调用,您应该在代码中添加#include <sys/stat.h>

答案 1 :(得分:2)

您可以使用stat:http://linux.die.net/man/2/stat

找到文件的inode编号

答案 2 :(得分:0)

您可以使用stat()系统调用找到索引节点号。但是,如果您使用的是FAT32和NTFS之类的非ext系统,则将动态生成inode表。这意味着索引节点号可能会更改,应用程序不应依赖它。