passwd
이와 같은 SUID 프로그램을 호출하는 함수가 어떤 기능을 사용하고 있는지 알고 싶습니다 setuid()
. 루트 권한을 포기하는 이유는 무엇입니까?
이는 어떤 유형의 공격으로부터 보호하는 데 도움이 됩니까? 버퍼 오버 플로우?
답변1
먼저 passwd가 사용하는 setuid 비트에 대해 설명하겠습니다. 이는 setuid()
시스템 호출과 다릅니다(passwd는 사용하지 않음). 이런 점에서 이 문제에 대해 약간의 혼란이 있을 수 있습니다.
버퍼 오버플로에 대한 보호는 아닙니다.취약한이러한 유형의 공격 또는 기본적으로 공격자가 의도하지 않은 사악한 목적을 위해 권한 있는 프로세스를 사용할 수 있도록 허용하는 모든 공격입니다. 이는 setuid 비트가 "권한 포기"와 반대이기 때문입니다.두다루트 권한은 있지만프로세스실제 사용자보다는 포함하다 passwd
.
passwd
이 형태의 setuid 는 읽기 및 쓰기 권한이 필요하기 때문에 실행 파일에 파일 시스템 setuid 비트를 설정해야 합니다 /etc/passwd
. 그러나 우리는 passwd에 부도덕한 사람이 /etc/passwd를 읽고 쓰는 것 외에 다른 작업을 수행할 수 있게 하는 알려진 보안 취약성(예: 잠재적인 오버플로 취약성)이 없기를 바랍니다. 루트로 실행되므로할 수 있다무엇이든 하세요. 단, 특정 작업 하나만 수행하고 다른 작업을 수행하도록 설계된 경우는 제외됩니다.~해야 한다(다시 말하지만, 희망)은 불가능합니다.
그래서이런 의미에서 setuid를 사용해도 아무 것도 방지되지 않습니다., 그러나 잠재적인 취약점은 WRT setuid 실행 파일에 매우 중요하기 때문에 취약점과 관련하여 자주 논의됩니다.
하지만: setuid 비트가 설정되었습니다.UID실제 uid 대신 실제로 seteuid()
시스템 호출과 유사합니다.아니요 setuid()
.
권한을 제거하는 "setuid"의 반대 형식이 있습니다. 이는 실제 setuid()
시스템 호출을 포함하며 setuid 비트가 필요하지 않습니다. 이는 루트로 실행 중인 프로세스(root 또는 sudo가 시작했기 때문에)의 uid가 권한이 낮은 사용자로 변경되었음을 의미합니다. 일반적으로 서버와 데몬이 시작할 때(예: 권한 있는 포트 열기) 루트 권한이 필요하지만 이후에는 그렇지 않은 경우에 수행됩니다. 이렇게 하면 서버가 이후에 하이재킹될 경우 수퍼유저 권한이 없습니다. 루트 권한을 호출하거나 다시 얻을 수는 없습니다 setuid(0)
. 하지만 set*을 사용할 수는 있습니다.이자형*UID).
답변2
이는 단지 예방 조치일 뿐입니다. 잘못 코딩하면 모든 애플리케이션이 공격에 취약해질 수 있습니다. 발생할 수 있는 피해를 줄이는 방법은 최소한의 권한으로 작업을 수행하는 것입니다. 필요하지 않을 때 루트로 실행을 포기하는 것이 좋은 시작입니다.