나는 우리가 suid 바이너리에서 ptrace를 수행하지 못할 수도 있다는 것을 알고 있습니다. 그런데 바이너리가 euid 대신 uid로 권한을 낮춘 후에 왜 ptrace를 수행할 수 없는지 궁금합니다.
예를 들어 바이너리에서 suid 바이너리는 특정 단계를 수행한 후 권한을 제거합니다.
seteuid (euid);
ret_chdir = chdir (path);
seteuid (ruid);
system("whoami");
printf("Enter any char");
scanf("%c", &junk);
내 경우에는 "whoami"가 인쇄되면 프로세스의 소유자가 아니라 프로세스의 사용자 이름입니다. 프로그램이 가비지 입력을 기다리는 동안 uid를 사용자 이름으로 사용하여 실행 중인 프로세스에 연결을 시도했지만 바이너리에 권한이 제거되었음에도 불구하고 실패했습니다. ptrace Attach가 저장된 uid 상태를 사용하여 내가 소유자가 아닌지 확인하는 것이 가능합니까?
답변1
귀하의 예제 코드는 권한을 포기하지 않습니다! seteuid(euid)
전화를 통해 권한을 다시 확대할 수 있습니다. 이를 ptrace할 수 있다면 호출하여 seteuid(euid)
권한 있는 코드를 실행할 수 있습니다.
ptrace
읽기 전용이라고 생각해서 묻는 겁니까 ? 아니요, 그렇지 않습니다. strace
추적기 ptrace
가 추적자에서 임의의 코드를 실행하도록 허용하는 것입니다. "읽기 전용" ptrace 액세스 권한을 부여하는 세분화된 액세스 제어가 없습니다.
그러나 읽기 전용 ptrace도 위험합니다. 높은 권한을 가진 애플리케이션이 기밀 데이터를 조작하고 있을 수 있습니다. 따라서 권한을 포기한 경우에도 권한을 얻은 프로세스를 추적할 수 없습니다. execve
획득한 권한의 모든 흔적을 제거하려면 프로세스를 호출해야 합니다 .
답변2
전환이 가능하기 때문에 이것은 좋은 추측처럼 보입니다.뒤쪽에보안 문제를 일으키는 것으로 알려진 영역입니다.
추가 자료: