如何确保正确的文件权限

时间:2013-05-23 16:44:56

标签: c file security unix permissions

为了保护应用程序不被错误地使用,我正在尝试检查其配置文件是否具有正确的权限,以便应用程序可以信任其他人未修改的文件内容。

我相信以下规则是正确的:

  • 该文件不得被其他人写入
  • 该文件必须由受信任的用户/组拥有:root 或
  • 该文件必须由运行该应用程序的有效用户/组拥有(想想setuid程序)

这是一个例子:

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>

#include <string.h>
#include <errno.h>

static
int is_secure(const char *name)
{
    struct stat st;

    uid_t euid = geteuid();
    gid_t egid = getegid();

    if (stat(name, &st) != 0) {
        int err = errno;
        fprintf(stderr, "can't stat() '%s': %d (%s)\n", name, err, strerror(err));
        return 0;
    }

    /* writable by other: unsecure */
    if ((st.st_mode & S_IWOTH) != 0) {
        return 0;
    }

    /* not owned by group root and not owned by effective group: unsecure */
    if (st.st_gid != 0 && st.st_gid != egid) {
        return 0;
    }

    /* not owned by user root and not owned by effective user: unsecure */
    if (st.st_uid != 0 && st.st_uid != euid) {
        return 0;
    }

    return 1;
}

int
main(int argc, char *argv[])
{
    int i;

    for(i = 1; i < argc; i++) {
        printf("'%s' : %s\n", argv[i], is_secure(argv[i]) ? "sure" : "unsure");
    }

    return 0;
}

由于我不确定我的假设,有人可以检查我是否在文件权限检查中留下了一些漏洞。

更新

sudo有一个函数:sudo_secure_path,它只检查一个uid / gid,但它负责检查组写位。

问候。

2 个答案:

答案 0 :(得分:8)

您的规则和代码对我来说是正确的,但您应该了解以下可能仍会影响您的实施的安全风险。

  1. 具有对计算机的物理访问权限或NFS / SMB访问权限的攻击者可以使用具有root权限的框装入文件系统,然后修改您的文件。
  2. 另一个以受信任用户或root用户身份运行的程序中的漏洞可能允许该程序被利用来修改您的文件。
  3. 打破安全检查所需要的只是一个粗心的用户或sys-admin,它会破坏文件的权限设置。我已经看到这种情况发生在备份和复制到拇指驱动器等等。
  4. 还要确保该文件不可执行。我无法想象一个可以在配置文件中利用它的实例,但是具有安全性的一般规则是不提供该作业不需要的任何权限。
  5. 正如您所看到的,这些不是代码控制下的问题。因此,在确保客户端确认配置文件不可篡改之前,应确保客户端了解这些风险。

答案 1 :(得分:7)

我相信您还想检查目录的权限。

如果允许用户写入目录,则用户可以mv另一个属于正确用户的文件替换此文件。

类似的东西:

sudo touch foo.conf
sudo touch foo.conf-insecure-sample
mv -f foo.conf-insecure-sample foo.conf