어떤 시나리오에서 SUID 비트를 설정하고 싶나요?

어떤 시나리오에서 SUID 비트를 설정하고 싶나요?

나는 SUID 비트의 개념과 그것이 유용한 이유를 이해하려고 애쓰고 있습니다.

예를 들어 다음과 같은 프로그램이 있다고 가정해 보겠습니다.

-rwsr-xr-x 1 root root 12364 Jan 12 2013 /usr/bin/foo

내가 이해한 바에 따르면 s사용자 소유자의 실행 비트는 본질적으로 파일 소유자의 권한을 가진 다른 사용자가 파일을 실행할 수 있다는 것을 의미합니다.

내가 왜 이런 걸 원하겠어요? 모든 사용자가 속한 그룹에서 작동하도록 파일의 그룹을 변경하면 어떨까요?

답변1

Setuid 및 setgid(및 존재하는 경우 setcap)는 권한을 높이는 유일한 방법입니다. 이 메커니즘을 통하지 않고 프로세스는 권한을 포기할 수 있지만 결코 얻을 수는 없습니다. 따라서 추가 권한이 필요한 작업은 수행할 수 없습니다.

예를 들어, 프로그램은 su모든 sudo사용자로서 명령을 실행할 수 있어야 합니다. 따라서 어떤 사용자가 호출했는지에 관계없이 루트로 실행해야 합니다.

또 다른 예는 입니다 ping. TCP 및 UDP 소켓은 모든 사용자가 액세스할 수 있습니다. 이러한 프로토콜에는 포트 개념이 있고 프로세스가 포트를 제어할 수 있으므로(바인딩이라고 함) 커널이 패킷을 보낼 위치를 알 수 있기 때문입니다. ICMP에는 그러한 개념이 없으므로 루트로 실행되는 프로그램(또는 적절한 기능을 갖춘 프로그램)만 ICMP 패킷이 전달되도록 요청할 수 있습니다. 모든 사용자가 를 실행할 수 있으려면 ping프로그램 ping에 추가 권한이 있어야 하므로 setuid 루트(또는 setcap)입니다.

그룹 권한의 예로 로컬 최고 점수를 파일에 저장하는 게임을 생각해 보세요. 스코어 파일에는 사용자가 실제로 달성한 최고 점수만 저장되어야 하므로, 플레이어가 스코어 파일을 쓸 수 없어야 합니다. 게임 프로그램에서만 점수 파일에 쓸 수 있도록 허용해야 합니다. 그래서 게임 프로그램은 setgid로 만들어지고 games점수 파일은 그룹이 쓸 수 있지만 games플레이어는 쓸 수 없습니다.

권한을 높이는 다른 방법은 권한이 있는 실행 프로그램에서 추가 권한이 필요한 프로그램을 시작하는 것입니다. 사용자가 추가 권한이 필요한 작업을 수행하려는 경우 특정 형태의 프로세스 간 통신을 사용하여 권한 있는 작업을 수행하는 프런트엔드 프로그램을 실행합니다. 이는 옵션을 구문 분석하고 진행 상황을 보고하는 ping하나의 프로그램과 패킷을 보내고 받는 서비스와 같은 일부 사용 사례에서는 잘 작동 하지만 게임 최고 점수 파일과 같은 다른 사용 사례에서는 그렇지 않습니다.pingping-backend

답변2

가장 일반적인 이유는 실행 파일을 루트로 실행할 수 있기 때문입니다. 예를 들어:

find /bin/ -type f \( -perm -4000 -o -perm -2000 \) -ls  | awk '{print $3,$NF}'
-rwsr-xr-x /bin/su
-rwsr-xr-x /bin/mount
-rwsr-xr-- /bin/fusermount
-rwsr-xr-x /bin/ping6
-rwsr-xr-x /bin/ping
-rwsr-xr-x /bin/umount

이는 모두 일반 사용자가 실행할 수 있지만 높은 권한이 필요한 명령입니다. mount완벽한 예입니다. user또는 이와 유사한 옵션이 설정된 디스크를 마운트할 수 있지만 /etc/fstab마운트하려면 rootSUID 비트가 설정되도록 권한이 필요합니다.

답변3

suid(또는 sgid) 비트는 실행 파일을 호출하는 사용자와 다른 사용자/그룹으로 실행되도록 합니다.

그렇게 하는 유일한 이유가 특정 파일에 액세스하는 것이라면, 다른 메커니즘을 사용하여 해당 파일을 쓰기 가능하게 만들 수 있습니다. 그러나 사용자는 다음을 수행할 수 있습니다.아무것프로그램에서 허용하는 것만이 아니라 파일에 추가합니다.

예를 들어, 프로그램에서 특정 형식으로만 파일에 줄을 추가하도록 허용할 수 있습니다. 그러나 방금 파일 시스템 권한을 사용한 경우 사용자는 파일에서 줄을 삭제할 수도 있습니다. 또는 형식이 잘못된 줄을 입력하세요.

기본적으로 suid 프로그램은 임의의 정책을 시행할 수 있습니다. 파일 시스템 권한은 불가능합니다. 예를 들어, 시스템에 suid 프로그램이 있습니다 /bin/su. 예를 들어 루트 셸을 제공하지만 정책을 먼저 충족하는 경우에만 일반적으로 루트 비밀번호를 입력합니다. 권한만으로는 그렇게 할 수 없습니다.

답변4

나에게 있어 가장 간단한 예는 passwd-명령이다. 이 명령을 사용하면 모든 사용자는 루트 권한 없이도 자신의 비밀번호를 변경할 수 있습니다. 그러나 모든 비밀번호가 저장된 파일은 루트만 쓸 수 있습니다.

비밀번호 및 섀도우

누구든지 콘텐츠를 변경할 수 있도록 섀도우에 대한 권한을 666으로 설정할 수 있지만 이는 끔찍한 보안 결함이 됩니다. 따라서 SUID가 필요합니다. 이렇게 하면 사용자는 passwd-스크립트를 통해서만 Shadow 파일을 변경할 수 있으므로 통제된 방식으로 모든 사용자에게 높은 권한을 부여할 수 있습니다. 스크립트 자체는 사용자가 다른 사람의 비밀번호를 변경할 수 없도록 합니다.

물론 passwd는 쓰기 금지되어 있어야 합니다. 그렇지 않은 경우 사용자는 이 파일을 변경하고 이를 사용하여 루트 권한으로 스크립트를 실행할 수 있습니다.

관련 정보