setresuid()/setreuid()/seteuid() 대신 setuid()를 사용하는 것이 적절합니까?

setresuid()/setreuid()/seteuid() 대신 setuid()를 사용하는 것이 적절합니까?

C 소스 파일에서 컴파일된 실행 가능한 바이너리가 있습니다.

실행 파일에는 setuid 권한이 있습니다.

실행 파일의 소유자가뿌리, 사용할 수 있어요

setuid(geteuid());

파일 컴파일 시 설정실제 UID실행 파일을 실행하는 프로세스는 다음과 같습니다.뿌리. 해당 실행 파일을 실행하는 사람은 누구나 다음과 같이 실행할 수 있습니다.뿌리.

그러나 실행 파일의 소유자가뿌리. 주려고 하면 잘 안 돼요.테스트 사용자실행 파일의 소유권(그리고 setuid를 다시 포함하도록 권한 수정) 이 문서 페이지를 읽은 후(1,2,) 그리고 읽어보세요이 게시물, 나는 이것이 setuid(new_euid)변화를 위해 수행되었다는 것을 알았습니다유효한 UID대신에실제 UID실행 파일을 실행하는 프로세스의 이름입니다. 공교롭게도 특정 상황에서는 (유효한 UID루트임), setuid(new_euid)또한 설정됨실제 UID그리고저장된 UID실행 파일을 실행하는 프로세스입니다 new_euid.

setreuid대신 다음을 사용하여 문제를 해결했습니다 setuid.

setreuid(geteuid(), geteuid());

이를 통해 다음을 설정할 수 있습니다.실제 UID프로세스의유효한 UID(실행 파일의 소유자) 및 재설정유효한 UID그 가치에 맞게 (중복성).

나는 이것이 특정 조건에서 작동한다는 것을 알고 있지만 변경하거나 setuid()사용하는 경우 또는 덜 혼란스럽지 않고 setreuid()setresuid()적절할 것입니다.seteuid()실제 UID,저장된 UID, 또는유효한 UID항상 작동하기 때문에 이상적입니까?

추가: 내가 아는 한, 이것은 설명된 것과 동일한 차이점 seteuid()인 것 같습니다 .setuid()여기(유효한 UID루트)입니다. 루트 권한이 있는 프로그램이 권한을 제거한 후 권한을 다시 얻는 것을 허용해서는 안 됩니까(3개의 UID가 모두 동일한 값으로 변경되므로 setuid())? 그렇다면 setuid()다른 프로그램과 비교해도 루트 권한이 있는 프로그램만 사용해야 합니까 setresuid()?

setuid()루트 권한이 있는 프로그램이 제거 후 권한을 다시 얻는 것을 허용하지 않는다는 점에서 이것이 안전할 수 있다고 생각 하지만, 언급된 다른 기능을 사용하여 혼동을 줄이기 위해 동작을 달성할 수 있습니다.

또 다른 일 getuid()이 돌아오다실제 UID절차가 진행되는 동안 setuid()수정하도록 설계되었습니다.유효한 UID(특권이 없는 한) 이는 또한 혼란스럽습니다.

답변1

이 모든 것 뒤에는 해커의 역사가 있을 수 있습니다. 말씀하신 대로 setreuid()더 확실하게표준에 명시된, 나는 그것을 사용할 것이다. 다음 단계는 반환 값을 주의 깊게 확인하고 getuid()및 를 사용하여 확인하는 것 입니다 geteuid().

setresuid()POSIX에는 없으므로 널리 사용되지 않을 수 있습니다(FreeBSD와 OpenBSD에는 있는 것 같습니다). 구현이 setreuid()문서와 일치하는 경우 저장된 UID를 명시적으로 설정할 필요가 없습니다 setreuid().

실제 사용자 ID를 설정 중이거나(ruid가 -1이 아님) 유효 사용자 ID가 실제 사용자 ID와 다른 값으로 설정된 경우 현재 프로세스에서 저장한 set-user-ID를 설정해야 합니다. 새로운 유효 사용자 ID와 동일합니다.

그런 다음 가능하다면 별도로 실행되는 권한 있는 프로세스를 선호하여 setuid 프로그램을 모두 사용하지 않고 소켓을 통해 통신하는 것이 좋습니다. 프로세스에서 하위 프로세스로 상속되는 많은 것들이 있으며 setuid를 통해 권한이 낮은 프로세스가 이를 권한이 더 높은 프로세스로 설정할 수 있습니다.

관련 정보