Isso não é possível. Não porque não haja nenhuma função em C, mas porque o modelo de segurança Unix proíbe isso.
No modelo de segurança Unix, um programa pode apenas reduzir seus privilégios, mas nunca pode aumentar seus privilégios. Um processo pode reduzir temporariamente seus privilégios efetivos e recuperar seus privilégios "reais" originais mais tarde, mas nunca pode ir mais longe do que onde começou.
Um processo que registra usuários deve começar com privilégios de root, ou seja, com o direito de fazer tudo. Uma vez que o usuário tenha inserido seu nome e senha e o programa de login tenha verificado, o processo muda permanentemente para o usuário desejado. Ele pode obter privilégios de root de duas maneiras:
- Pode ser iniciado por outro processo que está sendo executado como root. É assim que o login do console e o login SSH funcionam.
- Pode ser um executável setuid pertencente ao root. É assim que
su
esudo
funcionam.
Eu simplifiquei algumas coisas aqui, mas o princípio fundamental de que um programa não pode aumentar seus privilégios é sempre verdadeiro. Existe apenas uma maneira em que um processo pode ganhar privilégios, e isso é por executando um executável setuid¹.
Se um programa precisar executar algumas tarefas com privilégios mais altos, ele não poderá fazê-lo sozinho. Deve obter um processo de privilégios mais altos para isso. Ele pode fazer isso entrando em contato com um servidor já em execução que é executado com os privilégios desejados ou executando um executável setuid. O executável setuid pode ser algo como su
ou sudo
, que por sua vez executa um executável que não tem nenhuma permissão especial, mas se houver elevação de privilégio, deve haver um executável setuid na cadeia.
¹ ou setgid, setpcap…