2012-09-05 6 views
13

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

  1. questo è un calo permanente
  2. entrambi (e) UID ed (e) gid dovrebbe passare a non root solo
  3. supporto Linux (kernel> 2.6.32)
  4. 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.

+0

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. –

+0

Si potrebbe dare un'occhiata al sorgente 'sudo' o' su' per vedere come ciò potrebbe essere realizzato. – Kevin

risposta

1

Il modo "canonico" per farlo è stato implementato da D.J.Bernstein nel suo codice "setuidgid", che era originariamente utilizzato nel suo programma QMail, oggi incluso in "daemontools".

Il codice effettivo utilizzato in coreutils GNU è basato sulla descrizione di DJB della procedura, il suo codice è visibile qui https://github.com/wertarbyte/coreutils/blob/master/src/setuidgid.c

+0

Ah, fantastico. Ho intenzione di andare avanti e accettare questa risposta anche se non posso utilizzarla direttamente a causa delle licenze. –

+0

Il collegamento è interrotto. – alexander255

+0

grazie per aver notato, corretto ora – Jaromil