vim은 루트가 소유한 파일을 어떻게 훔치나요?

vim은 루트가 소유한 파일을 어떻게 훔치나요?

다음을 목격하십시오.

sh-3.2$ mkdir testcase
sh-3.2$ cd testcase
sh-3.2$ sudo touch temp
sh-3.2$ ls -al
total 0
drwxr-xr-x   3 glen  staff  102 19 Dec 12:38 .
drwxr-xr-x  12 glen  staff  408 19 Dec 12:38 ..
-rw-r--r--   1 root  staff    0 19 Dec 12:38 temp

sh-3.2$ echo nope > temp
sh: temp: Permission denied

sh-3.2$ vim temp
# inside vim
itheivery
# press [ESC]
:wq!
# vim exits

sh-3.2$ ls -al
total 8
drwxr-xr-x   3 glen  staff  102 19 Dec 12:38 .
drwxr-xr-x  12 glen  staff  408 19 Dec 12:38 ..
-rw-r--r--   1 glen  staff    7 19 Dec 12:38 temp

어쨌든 vim은 이 루트 소유 파일을 가져와서 사용자 소유 파일로 변경합니다!

이는 사용자가 디렉토리를 소유한 경우에만 작동하는 것처럼 보이지만 여전히 불가능한 것처럼 느껴집니다. 이것이 어떻게 달성되는지 설명할 수 있는 사람이 있습니까?

답변1

당신 glen은 소유자입니다목차( .매니페스트의 설명서를 참조하세요). 디렉토리는 단순히 파일 목록이며 귀하는 이 목록을 변경할 수 있는 권한(예: 파일 추가, 파일 삭제, 소유권을 다시 귀하에게 속하도록 변경 등)을 갖습니다. 변경하지 못할 수도 있습니다.콘텐츠파일을 직접 읽을 수 있지만 읽고풀리다(삭제) 전체 파일을 삭제한 후 새 파일을 추가합니다. 1 전후의 목격자만 있는데, 이건다음과 같이 보일 수도 있습니다파일이 변경되었습니다.

Vim은 스왑 파일을 사용하고 파일을 물속으로 이동합니다.~인 것 같다쉘에서와 동일한 파일에 쓰기는 하지만 동일한 것은 아닙니다. 2

따라서 Vim의 기능은 다음과 같습니다.

cat temp > .temp.swp          # copy file by contents into a new glen-owned file
echo nope >> .temp.swp        # or other command to alter the new file
rm temp && mv .temp.swp temp  # move temporary swap file back

1이것은 Windows와 Unices 간의 파일 권한 처리에 있어 중요한 차이점입니다. Windows에서는 일반적으로 쓰기 권한이 없는 파일을 삭제할 수 없습니다.

2 업데이트: 주석에서 지적했듯이 Vim은 실제로 소유권을 변경하기 위해 이 작업을 수행하지 않습니다. 파일의 inode 번호는 temp변경되지 않기 때문입니다( ls -li전후 비교). 이것을 사용하면 strace그것이 무엇을 하는지 정확히 알 수 있습니다 vim. 재미있는 부분은 다음과 같습니다.

open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = -1 EACCES (Permission denied)
unlink("temp")                               = 0
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 4
write(4, "more text bla\n", 14)              = 14
close(4)                                     = 0
chmod("temp", 0664)                          = 0

이는 단지풀리다,하지만폐쇄.it 에 대한 파일 설명 temp자는 전체 내용을 덮어씁니다( more text bla\n내 경우에는). 이것이 inode 번호가 변경되지 않은 이유를 설명하는 것 같습니다.

답변2

앞으로:

-rw-r--r-- 1 root staff 0 19 Dec 12:38 temp

뒤쪽에:

-rw-r--r-- 1 glen staff 7 19 Dec 12:38 temp

vim은 권한 장벽을 뚫지 않습니다. 나열된 파일 정보를 자세히 살펴보면 vim이 실제로 원본 파일을 삭제한 다음(파일을 삭제할 권한이 있지만 내용을 변경할 수는 없기 때문에) 자신만의 새 파일을 생성했다는 것을 알 수 있습니다. (소유자가 더 이상 "루트"가 아님을 확인하십시오).

vim에서 원본 파일을 편집하면 읽기 전용 파일이 변경된다는 경고가 표시됩니다. 따라서 명령(강제 조치)을 입력하면 :wq!vim은 기존 파일을 삭제하고 동일한 이름으로 새 파일을 생성만 할 수 있습니다.

도움이 되길 바랍니다.

답변3

파일 또는 기타 객체의 고유 식별자(파일 시스템 내)인 inode 번호를 보려면 -i옵션을 사용합니다 .ls

파일이 다른 개체로 대체된 것을 볼 수 있습니다. 즉, inode 번호가 변경될 수 있습니다.

동일한 inode 번호를 보는 것은 아무 것도 증명하지 못합니다. inode 번호는 재활용될 수 있습니다. 파일에 대한 마지막 링크를 제거한 다음 새 파일을 생성하면 동일한 inode 번호를 가진 파일이 생성될 수 있습니다. 하지만 새 파일을 만든 후 이전 파일을 삭제하면 이런 일이 발생하지 않습니다. 예를 들어 mv file file.tmp; touch file; rm file.tmp. 나는 vim이 실제로 비슷한 일을 하고 있다고 생각합니다 echo new_content > tmpfile; mv tmpfile file. 이 mv작업은 시스템 호출로 변환되므로 renameinode 번호 할당은 파일 시스템이 링크되지 않은 대상의 이름 바꾸기를 구현하는 방법에 따라 달라집니다.

관련 정보