일반 사용자가 왜 파일을 '잡을'수 없습니까?


75

chown명령이 루트 전용입니까? 루트가 아닌 사용자가 chown을 사용하여 소유 한 파일을 제공 할 수없는 이유는 무엇입니까?


캔트 귀하의 질문에 대한 Chown의 명령은 비 루트 사용자가 사용할 수 있습니다 이해
harish.venkat

어쩌면 내가 잘못 넣었을 수도 있습니다. 내 전문가의 정확한 질문은 "유닉스 시스템에서 일반 사용자의 권한 이동이 허용되지 않는 이유는 무엇입니까?"입니다.
phleg

19
실제 질문은 왜 루트가 아닌 사용자가 자신이 소유 한 파일 chown제공 하는 데 사용할 수 없는가하는 것 입니다. (파일 시스템 구성에 따라 가능한 시스템을 보았습니다.)
Keith Thompson

답변:


96

대부분의 유닉스 시스템은 사용자가 파일을 "주지"못하게합니다. 즉 chown, 대상 사용자 및 그룹 권한이있는 사용자 만 실행할 수 있습니다 . 사용 chown하려면 파일을 소유하거나 루트가되어야 하므로 (사용자는 다른 사용자의 파일을 적절하게 사용할 수 없음) 루트 만 실행 chown하여 파일 소유자를 다른 사용자로 변경할 수 있습니다 .

이 제한의 이유는 다른 사용자에게 파일을 제공하면 흔하지는 않지만 여전히 중요한 상황에서 나쁜 일이 발생할 수 있기 때문입니다. 예를 들면 다음과 같습니다.

  • 시스템에 디스크 할당량이 활성화되어있는 경우 Alice는 자신 만 액세스 할 수있는 디렉토리 아래에 세계 기록 가능한 파일 chown을 만든 다음 다른 사람이 해당 세계 기록 가능한 파일에 액세스 할 수 없으므로 다른 사용자 Bill이 해당 파일을 소유하도록 실행할 수 있습니다. 그러면 Alice 만 파일을 사용할 수 있지만 파일은 Bill의 디스크 할당량으로 계산됩니다.
  • Alice가 Bill에 파일을 제공하면 Bill이 해당 파일을 작성하지 않은 흔적이 없습니다. 파일에 잘못된 데이터가 있거나 손상된 데이터가 포함되어 있으면 문제가 될 수 있습니다.
  • 일부 프로그램에서는 요청을 인증하기 위해 입력 파일이 특정 사용자에게 속해야합니다 (예를 들어, 파일에는 프로그램이 해당 사용자 대신 수행 할 명령이 포함되어 있음). Bill이 구문 적으로 올바른 지시 사항이 포함 된 파일을 작성 했더라도이 특정 시간에 실행하려고하지 않았기 때문에 이는 일반적으로 안전한 설계가 아닙니다. 그럼에도 불구하고 Alice가 임의의 컨텐츠로 파일을 작성하고 Bill의 입력으로 가져 오도록 허용하면 상황이 더 악화 될 수 있습니다.

3
이전 직장에서, 나는 파일을 줄 수없는 것에 의존하는 소프트웨어 시스템을 구축했습니다. 파일 소유권을 사용하여 특정 사용자가 요청을 제출했는지 확인했습니다. 설치 중에 파일을 제공 할 수 있는지 여부를 확인했으며, 허용하지 않으면 진행을 거부했습니다.
Keith Thompson

2
더 중요한 또 다른 문제는 사용자가 복사 /bin/bash하여 설정 한 다음 chown원하는 사람에게 배포 할 수 있다는 것입니다. 이제 그들은 그 사람으로서 쉘 액세스 권한을 갖습니다.
Patrick

18
@Patrick은 chown항상 setuid 및 setgid 비트를 지 웁니다.
Gilles

1
@Gilles and good reason ... 쉘 바이너리를 어딘가에 복사하여 액세스 할 수 있다면 setuid / gid 비트를 설정하고 루트 (또는 순서가 6755/0 : 0 perms 인 순서)로 chown / ownership) 해당 시스템에서 루트를 얻을 수 있습니다. 오 패트릭의 의견을 정확히 놓쳤다.
hanetzer

나는 디렉토리를 (소유하고 있다면 좋아,하지만 drwxr-xr-x ring0 ring0 .) 어떤 루트 (일반 파일이 -rw-r--r-- root root file) 내가 할 수없는 이유, chown ring0 file그것 때문에 어쨌든로, 할 수있다 ring0, cp file x ; rm file ; mv x file(일부 옵션 touch sometime file...)?
Ring Ø

15

Linux에서는 CAP_CHOWN 기능이 필요합니다. 그런 루트가 부여됩니다. 설명은 http://vouters.dyndns.org/tima/Linux-OpenVMS-C-Implementing_chown.html 을 참조하십시오 . :에 의해 증명 당신은 CAP_CHOWN 기능을 제공 libcap-ng에 또는 libcap 사용하여 코드를 빌드하려는 경우 http://vouters.dyndns.org/tima/Linux-PAM-C-Pluggable_Authentication_Modules_programming_example.html 바꿀 간단한 CAP_AUDIT_WRITE 있어야 할 곳에 CAP_CHOWN으로


1
+1은 루트가 아니어도됩니다. 더 이상 뿌리를 내릴 필요가 없기 때문입니다.
ctrl-alt-delor

1
때로는 CAP_CHOWN이 필요하지 않습니다. unix.stackexchange.com/questions/399975/… 커널 소스를 읽음으로써 각 파일 시스템 구현은 chown에 대한 권한을 확인하는 작업을 수행합니다. 그리고 NFS를 사용하면 서버 쪽에서 권한이 확인됩니다. 그리고 서버가 이상하다면 ... 가능합니다.
Mike S

0

명령을 실행할 수 있지만 루트가 아닌 경우 작동하지 않습니다. 쉽다 : 소프트웨어를 루트 사용자로 변경할 수있는 사용자를 상상해보십시오. 그것은 setuid 비트를 추가 할 수 있으며, 그 사람은 루트입니다! 따라서 사용하면 chmod를 사용하여 비트를 추가 할 수 있지만 파일 소유자를 변경할 수는 없습니다.


12
소유하지 않은 파일에 setuid 비트를 추가 할 수 없으며 파일을 setuid 비트에서 제거 할 수있는 구현이 가능합니다.
Gilles

Dom의 대답의 요점은 이것이라고 생각합니다. 가능하다면 상상해보십시오. 그러면 문제가 생길 것입니다. 할 수없는 요점은 맞습니다. 그러나 OP는 "왜?" setuid 비트를 지우는 것은 "왜?"라는 질문을 다시 제기하는 또 다른 보안 기능입니다. 그런 다음 Dom의 답변을 참조하십시오. 사용자가 숨을 쉴 수 있고 사용자가 설정할 수 있으면 그 콤보는 비참 할 것입니다. 조금 빠졌더라도 좋은 지적을합니다.
Mike S
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.