2012-02-28 28 views
3

我有程序,说名字giverootAccess。该程序可以在当前目录(giverootAccess所在的位置)接收文件名作为命令行参数。然后该文件将获得根访问权限。该文件可以是可执行文件或shell脚本。使用C代码找到一个文件的inode号码

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

所以我需要一个机制来唯一标识一个文件,而不是它的名字(因为它可以被模仿和黑客入侵)。 inode是否可以用于此目的?

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

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

+0

我正在尝试做类似的事情。如果你找到答案,请你就此更新我。 – 2012-04-25 11:36:49

+0

“给root访问权限”是什么意思?设置'suid'位?你能澄清吗? – dpp 2012-05-02 21:25:30

回答

4

您可以使用文件描述符来获得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

统计是一个包含文件的元信息,并描述here
使用stat结构和FSTAT系统调用你应该添加#include <sys/stat.h>到您的代码的结构。