Binários ptrace suid após a eliminação do privilégio

Binários ptrace suid após a eliminação do privilégio

Entendo que provavelmente não podemos fazer ptrace em binários suid. No entanto, estou me perguntando por que não podemos fazer ptrace depois que o binário reduz seu privilégio para uid em vez de euid.

Por exemplo, no binário, o binário suid elimina o privilégio após algumas etapas.

 seteuid (euid);
 ret_chdir = chdir (path);
 seteuid (ruid);

 system("whoami");
 printf("Enter any char");
 scanf("%c", &junk);

No meu caso, quando “whoami” é impresso, é o nome de usuário do processo, mas não o proprietário do processo. Quando o programa está aguardando uma entrada indesejada, eu estava tentando anexar ao processo em execução com o uid como nome de usuário, mas falhou mesmo que o binário tivesse eliminado o privilégio. É possível que ptrace attachment use o estado save-uid para decidir que não sou o proprietário?

Responder1

Seu código de exemplo não elimina privilégios! Ele pode elevar privilégios livremente novamente chamando seteuid(euid). Se você puder rastreá-lo, poderá fazê-lo chamar seteuid(euid)e, assim, executar código privilegiado.

Você está perguntando isso porque pensou que ptraceera somente leitura? Não, não é: straceé apenas uma coisa que você pode fazer com isso; ptracepermite que o rastreador execute código arbitrário no tracee, e não apenas observe. Não há controle de acesso refinado que conceda acesso ptrace “somente leitura”.

Mas mesmo um ptrace somente leitura é perigoso. Um aplicativo que possui privilégios elevados pode estar manipulando dados confidenciais. Portanto, você não pode rastrear um processo que foi privilegiado, mesmo que ele tenha sido descartado. O processo deve chamar execvepara eliminar todos os vestígios de ter sido privilegiado.

Responder2

Isso parece um bom palpite, devido à possibilidade de mudarvoltar, que é uma área conhecida onde resultaria um problema de segurança.

Leitura adicional:

informação relacionada