suid-root는 효과가 없습니다

suid-root는 효과가 없습니다

프로그램은 다음에서 제공됩니다.아푸에.

#include "apue.h"
#include <fcntl.h>

int main(int argc, char *argv[])
{
    if(argc!=2)
        err_quit("usage: a.out <pathname>");

    if(access(argv[1], R_OK)<0)
        err_ret("access error for %s",argv[1]);
    else
        printf("read access OK\n");
    if (open(argv[1], O_RDONLY)) {
        err_ret("open error for %s", argv[1]);
    } else {
        printf("open for reading OK\n");
    }

    return 0;
}

나는 그것을 호출된 실행 파일로 컴파일 4-2하고 소유자를 변경하고 suid를 설정했습니다. 이것은 다음과 같은 출력입니다 ls -l.

-rwsr-xr-x 1 root sinners 8490 Jan  7 18:50 4-2*

그리고 /etc/shadow:

-rw------- 1 root root 421 Jan  4 01:29 /etc/shadow

하지만 실행해보면:

user% ./4-2 /etc/shadow 
access error for /etc/shadow: Permission denied
open error for /etc/shadow: Permission denied

access누군가 이러한 오류가 발생하는 이유를 설명할 수 있습니까 open?

답변1

인용하다access() 맨페이지:

이 검사는 실제로 파일에 대해 작업을 시도할 때(예: open(2)) 유효한 ID를 사용하는 대신 호출 프로세스의 실제 UID 및 GID를 사용하여 수행됩니다. 이를 통해 SetUserID 프로그램은 호출 사용자의 권한을 쉽게 확인할 수 있습니다.

사용자 ID 비트를 설정하면 프로세스가 활성화됩니다.유효한 UID파일 소유자와 동일하지만 실제 사용자 ID는 변경되지 않습니다(즉, 이전 상태를 유지함 exec()).

당신은 그것을 사용할 수 있습니다setreuid()프로세스의 유효 UID와 실제 UID를 수정하거나 이를 사용하여 open()권한을 결정할 수 있습니다. 특히 이미 전화를 걸었으므로 두 번째 해결 방법을 권장합니다 open(). errno같음을 확인하여 EPERM권한 부족으로 인해 open()오류가 발생했는지 확인할 수 있습니다 .

open()open()반환 값을 if 조건으로 사용하고 있기 때문에 코드에서 호출이 실패합니다 . 나는 호출이 실제로 성공하고 0이 아닌 유효한 파일 설명자를 반환하여 제어가 오류 처리 분기로 들어가게 한다고 생각합니다. if의 오류 처리 분기는 호출로 인해 발생한 마지막 오류이기 EPERM때문에 오류 메시지를 표시합니다. access()오류 처리 분기를 입력하는 조건은 open()-1이 반환되는지 확인해야 합니다.

관련 정보