일반 사용자는 루트가 소유한 파일을 수정할 수 있습니다.

일반 사용자는 루트가 소유한 파일을 수정할 수 있습니다.

파일이 루트에 의해 생성된 일반 텍스트 파일인 경우 다음 명령을 사용하십시오:

echo 'foo' > ./file.txt

당신의 ls -l것은:

-rw-r--r-- root root ./file.txt

하지만 일반 사용자로서 이 설정을 변경할 수 있습니다.와 함께 저장 :w!하거나sed명령, 이런 일이 발생하면사용자 및 그룹파일 소유자가 다음과 같이 변경됩니다.

-rw-r--r-- user user ./file.txt

다른 사람의 읽기 권한이 제거되면 chmod o-r ./file.txt더 이상 변경할 수 없지만 복원되면 chmod o+r ./file.txt다시 변경할 수 있다는 것을 알았습니다.

여기서 무슨 일이 일어나고 있는 걸까요? "기타" 읽기 권한을 통해 루트가 소유한 파일을 변경하고 사용자 및 그룹 소유권을 변경할 수 있는 이유는 무엇입니까?

왜 이런 일이 발생합니까?

추신: 저는 데비안 SID를 사용하고 있습니다.

답변1

이는 다음 두 가지 때문에 발생합니다.

  • vim(적어도 이 경우에는) 그리고 sed라이브 편집을 하면 실제로는 원본 파일이 삭제되고 같은 이름의 새 파일이 생성됩니다.

  • 파일 삭제 기능은 파일 자체의 권한이 아니라 파일이 포함된 디렉터리의 권한에 따라 달라집니다.

따라서 여기서 일어나는 일은 디렉터리에 대한 쓰기 권한이 있다는 것입니다. 이는 파일 삭제 및 생성을 포함하여 디렉터리의 내용을 변경할 수 있음을 의미합니다. 그래서 를 실행 sed -i하거나 저장 하면 :w!원본 파일을 삭제하고 새 파일을 생성하게 됩니다. 이것이 소유권이 변경되는 이유이기도 합니다. 실제로는 다른 파일입니다.

파일의 내용을 확인할 수 있습니다.인덱스 노드편집 전과 후:

$ ls -ld foo/
drwxr-xr-x 2 terdon terdon 266240 Nov 16 13:43 foo/
$ cd foo
$ sudo sh -c 'echo foo > file'
$ ls -l 
total 4
-rw-r--r-- 1 root root 4 Nov 16 13:43 file

이 명령 후에 일반 사용자는 file쓰기 권한이 있는 디렉터리에 대한 루트 소유권을 갖습니다. foo/이제 ls -i다음을 사용하여 inode를 확인한 다음 변경 sed하고 다시 확인해 보겠습니다.

$ ls -li file 
26610890 -rw-r--r-- 1 root root 4 Nov 16 13:43 file
$ sed -i 's/foo/bar/' file
$ ls -li file 
26610859 -rw-r--r-- 1 terdon terdon 4 Nov 16 15:40 file

vim다음을 실행하여 동일한 작업을 수행하는 것을 볼 수도 있습니다.

strace vim file 2> strace.out

그런 다음 파일을 편집하고 다른 :w!이름 으로 저장하면 다음 strace.out이 표시됩니다.

    unlink("file")                           = 0
    open("file", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
    write(4, "bar\n", 11)            = 11

따라서 파일이 먼저 삭제되고( unlink("file")), 같은 이름의 새 파일이 생성되고( open("file", O_WRONLY|O_CREAT|O_TRUNC, 0644)) 수정 사항이 해당 파일에 기록됩니다( write(4, "bar\n", 11)).

위에서 볼 수 있듯이 inode가 변경되었습니다. 동일한 이름을 가진 새 파일입니다. 따라서 쓰기 권한이 없는 파일을 실제로 변경하는 것이 아니라목차해당 디렉터리에서 파일을 삭제한 다음 해당 디렉터리에 이전 파일과 동일한 이름으로 새 파일을 생성하면 쓰기 액세스 권한을 갖게 됩니다.

나는 비슷한 질문에 대답했습니다.https://askubuntu.com/a/815849/85695.

답변2

vim파일은 수정할 수 없지만 파일이 연결된 디렉터리에 대한 쓰기 권한이 있고 디렉터리를 소유하거나 t해당 권한에 비트를 설정하지 않은 경우 파일을 삭제하고 소유한 새 복사본으로 바꿀 수 있습니다. 당신에 의해.

이를 방지하려면 다음을 root수행하십시오.

  • 파일에 immutable( chattr +i) 또는 ( ) 플래그를 설정합니다 append-only. (그러면 삭제할 수도 없습니다.)chattr +aroot
  • 상위 디렉터리에 대한 쓰기 권한 만 있는지 확인하세요 root(사용자 root와 비트만 소유함 ; , ).wchown root:chmod u=rwx,go=rx
  • 소유한 디렉토리는 root다른 사람이 쓸 수 있지만 권한에 t(삭제 제한²) 비트( )가 있습니다(따라서 사용자는 자신이 소유한 파일만 삭제하거나 이름을 바꿀 수 있습니다).chmod o+t

/a/b/file¹ if라는 이름의 파일에 대해 then user에 대한 쓰기 액세스 권한이 있으면 이름을 바꾸고 그 안에 자신만의 이름을 다시 만들 /a수도 있습니다 ./a/b/a/b.old/a/b/a/b/file

² 들어본 적이 있을 것입니다.끈끈한 비트이 비트에 대한 용어이지만 일반 실행 파일(아주 오래된 시스템에서만)에 적용될 때 실행 파일의 텍스트를 메모리에 유지하도록 시스템에 지시(지시하는 데 사용됨)됩니다. 이 비트는 디렉터리에 적용될 때 다른, 관련 없는 의미를 갖습니다.

관련 정보