chown은 setuid 비트를 제거합니다: 버그 또는 기능?

chown은 setuid 비트를 제거합니다: 버그 또는 기능?

재현 단계:

germar@host:~$ cd /tmp/
germar@host:/tmp$ touch test && chmod u+s test && ls -la test
-rwSr--r-- 1 germar germar 0 Nov  2 20:11 test
germar@host:/tmp$ chown germar:germar test && ls -la test
-rw-r--r-- 1 germar germar 0 Nov  2 20:11 test

Debian squeeze 및 Ubuntu 12.04로 테스트되었습니다.

답변1

chown 문서에 따르면 이는 오류가 아닙니다.

$info coreutils 'chown invocation'

   The `chown' command sometimes clears the set-user-ID or set-group-ID
permission bits.  This behavior depends on the policy and functionality
of the underlying `chown' system call, which may make system-dependent
file mode modifications outside the control of the `chown' command.
For example, the `chown' command might not affect those bits when
invoked by a user with appropriate privileges, or when the bits signify
some function other than executable permission (e.g., mandatory
locking).  When in doubt, check the underlying system behavior.

답변2

이는 의도적으로 설계된 동작이며 표준 동작입니다. 인용하다POSIX 표준:

적절한 권한이 있는 프로세스에서 chown을 호출하지 않는 한, 일반 파일의 set-user-ID 및 set-group-ID 비트는 성공적으로 완료되면 다른 파일의 set-user-ID 및 set-group-ID 비트를 지워야 합니다. 유형이 삭제될 수 있습니다.

( s그런데 그것은 고정되지 않은 setuid(또는 그룹 열의 setgid)입니다.)

이 동작은 다음과 같습니다낮은 수준의 시스템 호출(일부 시스템을 제외하고 setxid 비트는 실행 파일에 대해서만 지워집니다.)

setuid 비트를 제거하는 이유는 소유자를 변경하면 프로세스의 유효 사용자 ID가 될 사용자도 변경되기 때문입니다. 특히 사용자가 파일을 추출할 수 있는 시스템에서는 cp /bin/sh foo; chmod u+s foo; chown joe foojoe에 속한 setuid 실행 파일이 생성되는데 이는 큰 보안 허점입니다.

관련 정보