루트는 일반 사용자가 소유한 파일에 쓸 수 없습니다

루트는 일반 사용자가 소유한 파일에 쓸 수 없습니다

일반 사용자로 파일을 만듭니다 testuser.

$ cat > /tmp/zz

예상대로 이 사용자가 파일을 소유하고 있습니다.

$ ls -lA /tmp/zz 
-rw------- 1 testuser testuser 0 Feb 20 15:32 zz

이제 다음과 같이 자르려고 하면 root권한이 거부되었습니다.

# truncate --size=0 /tmp/zz
truncate: cannot open '/tmp/zz' for writing: Permission denied

을(를 ) 사용하려고 하면 strace다음이 표시됩니다.

openat(AT_FDCWD, "/tmp/zz", O_WRONLY|O_CREAT|O_NONBLOCK, 0666) = -1 EACCES (Permission denied)
write(2, "truncate: ", 10truncate: )              = 10
write(2, "cannot open '/tmp/zz' for writin"..., 33cannot open '/tmp/zz' for writing) = 33
...
write(2, ": Permission denied", 19: Permission denied)     = 19
write(2, "\n", 1

루트에 이 파일에 쓸 수 있는 권한이 없는 이유는 무엇입니까? 루트는 파일을 삭제할 수 있지만 쓸 수는 없습니다.

답변1

이는 Linux 커널에서 사용할 수 있는 새로운 동작입니다.버전 4.19기술을 사용하여 공격을 방지합니다 /tmp/. 이 옵션의 기본값은 나중에 활성화되거나 배포판에 따라 달라질 수 있습니다.

(기능) 공격자가 제어하는 ​​FIFO 또는 일반 파일에 대한 부주의한 쓰기 방지: 소유자가 디렉터리 또는 파일의 소유자와 동일하지 않는 한 전역적으로 쓰기 가능한 고정 디렉터리에서 사용자에게 속하지 않은 FIFO 또는 일반 파일 열기를 비활성화합니다. 열려 있는 파일은 배너가 아닙니다 O_CREAT. 목적은 데이터 스푸핑 공격을 더욱 어렵게 만드는 것입니다. 이 보호는 심볼릭 링크/하드 링크 보호와 마찬가지로 FIFO( protected_fifos) 및 일반 파일( ) 에 대해 각각 sysctl을 통해 켜고 끌 수 있습니다.protected_regular범죄

이는 사용자(일반적으로 충분한 권한이 있는 루트 포함)가 디렉터리에 있는 기존 파일에 쓰거나 파일 자체를 생성하려는 경우 등을 /tmp방지 하기 위한 것입니다./var/tmp

이 토글을 사용하면 활성화 됩니다 sysctl.fs.protected_regular. 사람들은 다음과 같은 방법으로 이전 행동으로 돌아갈 수 있습니다.

sysctl -w fs.protected_regular=0

그러나 이는 OP의 경우와 같은 이상한 "버그"를 사라지게 하면서 전반적인 보안을 저하시킬 수 있습니다.

루트가 여전히 .않고 쓰기 위해 열립니다(또는truncate -s ...파일은 쓰기 위해 열리지파일을 삭제할 수 있는 이유는 추가 보안 기능이 링크가 해제될 때가 아니라 쓰기 위해 파일을 열 때만 트리거되기 때문입니다.rmunlinkunlinkat

관련 정보