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


39

다음을 목격하십시오.

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은이 루트 소유 파일을 가져 와서 사용자 소유 파일로 변경했습니다!

이것은 사용자가 디렉토리를 소유 한 경우에만 작동하는 것처럼 보이지만 여전히 가능하지 않은 것처럼 느낍니다. 누구든지 이것이 어떻게 수행되는지 설명 할 수 있습니까?

답변:


51

귀하 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은 실제로 temp파일 의 inode 번호 가 변경되지 않기 때문에 ( 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

이것은 연결 해제 만을 하고 파일 디스크립터를 닫지 는 않음을 보여줍니다 temp. 오히려 전체 내용을 덮어 씁니다 ( more text bla\n필자의 경우). 이것이 왜 inode 번호가 변하지 않는지를 설명합니다.


3
FOWW ls -il이전과 이후 에 실행 하여이 문제가 발생했는지 확인할 수 있습니다 ... tempinode 번호가 변경된 경우 동일한 이름의 다른 파일임을 알 수 있습니다.
쓸모없는

3
rm이 실제로 파일을 제거하지는 않지만 파일에 대한 링크 만 제거하고 링크 수가 0으로 감소하기 전에 파일이 삭제되지 않는다고 추가 할 수 있습니다. rm은 디렉토리의 파일에 대한 항목을 제거합니다. 루트에 다른 디렉토리의 파일에 대한 다른 링크 (하드 링크)가 있으면 사용자는 파일을 제거 할 수 없습니다.
gerrit

1
@ 쓸모없는 시도했지만 소유자와 타임 스탬프가 변경되었지만 번호는 변경되지 않았습니다!
amyassin

1
@amyassin 당신이 맞아요! 나는 그것을 설명하는 strace 발췌로 답변을 업데이트했습니다.
gertvdijk 2014

1
Windows와 Unix 권한에 대한 메모 외에도 Unix에서 Windows와 같은 동작을 원한다면 루트가 소유 한 디렉토리 (또는 보편적 인 제거 / 이름 바꾸기 / 기타 권한을 가져야하는 다른 사용자)를 만들고 고정을 설정할 수 있습니다. 디렉토리에 비트. 그러면 사용자는 자신의 파일 만 삭제할 수 있습니다.
Matthew Crumley

16

전에:

-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 만 할 수있는 것은 기존 파일을 삭제하고 동일한 이름의 새 파일을 만드는 것입니다.

희망이 도움이됩니다.


1

파일 또는 다른 객체의 고유 식별자 인 inode 번호를 보려면 -iof 옵션을 사용하십시오 ls.

파일이 다른 객체로 바뀌 었음을 알 수 있습니다. inode 번호가 변경 될 수 있습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.