![동일한 부팅 주기에서 setuid(0)를 사용하여 프로세스에 루트 권한을 다시 할당할 수 없습니다.](https://linux55.com/image/198763/%EB%8F%99%EC%9D%BC%ED%95%9C%20%EB%B6%80%ED%8C%85%20%EC%A3%BC%EA%B8%B0%EC%97%90%EC%84%9C%20setuid(0)%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%97%90%20%EB%A3%A8%ED%8A%B8%20%EA%B6%8C%ED%95%9C%EC%9D%84%20%EB%8B%A4%EC%8B%9C%20%ED%95%A0%EB%8B%B9%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
터미널에서 다음 cmd를 사용하여 이 기능(임베디드 파일에 CAP_SETUID를 설정하는 대신)을 추가했습니다. 확인된 setuid/seteuid가 제대로 작동하고 있습니다.
setcap cap_sys_admin,cap_setuid+ep /usr/bin/<processname>
이제 내 프로세스를 루트 권한으로 설정하고 싶습니다-->sync()-->원래 권한으로 설정--->몇 가지 작업 수행-->다시 루트로 설정--->sync()
setuid()를 사용하는 동안 부팅 주기당 한 번만 프로세스를 루트로 설정할 수 있다는 것을 발견했습니다. 그러나 seteuid()를 통해서도 수행할 수 있습니다. 시도해 보았지만 여전히 예상한 결과를 얻을 수 없습니다.
제가 놓치고 있는 부분이나 작업 중인 부분을 제안해 주실 수 있나요?
int id = geteuid();
int r0= seteuid(0); // This will raise process to root mode
sync(); //process can perform operation as root user
seteuid(id); //set process as non root user
첫 번째 r0은 0[성공]이고, 두 번째 r0은 -1[seteuid(0)의 오류]입니다. (동일한 출시주기에서) 미리 감사드립니다.
답변1
불행히도 커널 문서에서 명확한 설명을 찾을 수 없습니다. 힌트는 다음과 같습니다 man 2 setuid
.
사용자가 루트이거나 프로그램이 set-user-ID-root인 경우 특별한 주의가 필요합니다. setuid()는 호출자의 유효 사용자 ID를 확인하고 슈퍼유저인 경우 모든 프로세스 관련 사용자 ID가 uid로 설정됩니다. .이 일이 발생한 후에는 프로그램이 루트 권한을 다시 얻는 것이 불가능해집니다.
이 주장이 유효하지 않도록 기능을 추가하는 것은 별로 의미가 없습니다. FSCAP 프로그램이 SUID 루트 프로그램보다 더 강력한 이유는 무엇입니까?
만약에이 답변SO에서 정확하다면 귀하의 질문은 다음과 같이 해석될 수 있습니다.
기본적으로 UID 변환 중에 기능 세트가 손실됩니다.
setuid()
및 의 다양한 동작 seteuid()
은 의도적이며 다양한 시나리오를 포괄합니다(루트로 다시 전환하는 것을 허용하지 않음(허용하지 않음)).