Dopo l'avvio, vorrei che il mio programma Linux rilasciasse i privilegi di root e passasse a un account non privilegiato. Ho trovato diversi esempi online, ma niente canonica per le mie esigenze, in particolare:rilasciano permanentemente i privilegi di root su Linux moderno
- questo è un calo permanente
- entrambi (e) UID ed (e) gid dovrebbe passare a non root solo
- supporto Linux (kernel> 2.6.32)
- alcuna necessità di gruppi supplementari
L'approccio migliore che ho trovato è:
uid_t new_uid = ...;
gid_t new_gid = ...;
gid_t rgid, egid, sgid;
if (setresgid(new_gid, new_gid, new_gid) < 0)
{
perror("setresgid");
exit(EXIT_FAILURE);
}
if (getresgid(&rgid, &egid, &sgid) < 0)
{
perror("getresgid");
exit(EXIT_FAILURE);
}
if (rgid != new_gid || egid != new_gid || sgid != new_gid)
{
printf("unexpected gid");
exit(EXIT_FAILURE);
}
if (setgroups(0, 0) != 0)
{
perror("setgroups");
exit(EXIT_FAILURE);
}
uid_t ruid, euid, suid;
if (setresuid(new_uid, new_uid, new_uid) < 0)
{
perror("setresuid");
exit(EXIT_FAILURE);
}
if (getresuid(&ruid, &euid, &suid) < 0)
{
perror("getresuid");
exit(EXIT_FAILURE);
}
if (ruid != new_uid || euid != new_uid || suid != new_uid)
{
printf("unexpected uid");
exit(EXIT_FAILURE);
}
posso avvolgere questo in un exe e dimostrare che l'UID di e gid di apparire corretto utilizzando:
ps -eO user,uid,ruid,suid,group,gid,rgid,sgid
il programma non può legarsi a una porta privilegiata o manipolare la maggior parte dei file di proprietà di root, in modo che è tutto bene.
Ho anche trovato il programma captest (incluso in libcap-ng-utils) che verifica che il processo non abbia imprevisto capabilities(7).
Tuttavia, dal momento che la sicurezza è una preoccupazione mi piacerebbe essere più sicuro di aver eliminato tutti i privilegi non essenziali correttamente. Come posso essere sicuro?
Grazie.
Avete verificato [setuidgid] (http://cr.yp.to/daemontools/setuidgid .html)? Fa parte di [D.J. Bernstein's] (http://cr.yp.to/djb.html) [pacchetto Daemon Tools] (http://cr.yp.to/daemontools.html). Riesaminare la fonte di questo programma potrebbe essere utile. –
Si potrebbe dare un'occhiata al sorgente 'sudo' o' su' per vedere come ciò potrebbe essere realizzato. – Kevin