簡體   English   中英

可執行文件設置了root suid,但是access(path,W_OK)仍然返回-1?

[英]Executable file set root suid, but access(path, W_OK) still return -1?

為什么可執行文件設置了root suid,但是access(path,W_OK)仍然返回-1?

碼:

#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("privilege => %d\n", access("/usr/local/etc/t.conf", W_OK));
    return 0;
}

測試運行:

[www@mypy access]$ ll
總用量 12
-rwsrwxr-x. 1 root root 6600 1月  22 10:05 access
-rw-rw-r--. 1 www  www   135 1月  22 10:05 access.c

[www@mypy access]$ ./access 
privilege => -1

[root@mypy access]# ./access 
privilege => 0

access庫功能故意檢查實際用戶的訪問權限,而忽略了可執行文件具有不同的有效UID / GID的事實。

如果僅想知道是否可以進行讀取或寫入訪問,則可以打開文件並查看是否有錯誤。 但是,小心謹慎的setuid可執行文件通常想知道真實用戶是否能夠對文件執行操作。 為了找到答案,他們可以使用access庫功能。

這在man 2 access解釋:

檢查是使用調用進程的實際UID和GID完成的,而不是像實際在文件上嘗試執行操作(例如open(2) )時所執行的有效ID。…

這允許設置用戶ID程序和賦予功能的程序輕松確定調用用戶的權限。 換句話說,access()無法回答“我可以讀取/寫入/執行此文件嗎?” 題。 它回答了一個稍有不同的問題:“(假設我是setuid二進制文件)調用我的用戶可以讀取/寫入/執行此文件嗎?”,這使set-user-ID程序可以防止惡意用戶導致它們出現。讀取用戶不應該讀取的文件。

感謝rici的回答!我按如下完成了它

int accesswriteable(char const *path)
{
    if(access(path, F_OK))
    {
        return 1;
    }
    FILE *fp = fopen(path, "a");
    if(fp == NULL)
    {
        return 1;
    }
    fclose(fp);
    return 0;
}

#define PATH_WRITE_ABLE(path) (accesswriteable(path) == 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM