#include <sys/capability.h>
#include <stdio.h>
#include <errno.h>
#define NOM_PROGRAMME "mon_programme"
int main(int argc, char** argv){
if(geteuid()!=0) {fprintf(stderr,"Ce programme doit être setuid root!"); return 1;}
cap_set_proc(cap_sys_rawio);/* Abandon de toutes les autres capacités */
seteuid(getuid());/* Abandon des droits root. */
execvp(MON_PROGRAMME,argv);
perror("échec de l'execvp().");
return 1;
}
/*Attention quand même, cela change le nom d'appel du
processus en question. En général, ce n'est pas gênant, mais il y
a des exceptions (comme gcc ou gzip). Mais c'est assez facile à
résoudre, si besoin est.
--
CoinKoin.
P.S. : je ne l'ai pas testé, ni même compilé. Mais je pense qu'il marche. */
# En C :
Posté par CoinKoin . En réponse au message Capability. Évalué à 3.
#include <sys/capability.h> #include <stdio.h> #include <errno.h> #define NOM_PROGRAMME "mon_programme" int main(int argc, char** argv){ if(geteuid()!=0) {fprintf(stderr,"Ce programme doit être setuid root!"); return 1;} cap_set_proc(cap_sys_rawio);/* Abandon de toutes les autres capacités */ seteuid(getuid());/* Abandon des droits root. */ execvp(MON_PROGRAMME,argv); perror("échec de l'execvp()."); return 1; } /*Attention quand même, cela change le nom d'appel du processus en question. En général, ce n'est pas gênant, mais il y a des exceptions (comme gcc ou gzip). Mais c'est assez facile à résoudre, si besoin est. -- CoinKoin. P.S. : je ne l'ai pas testé, ni même compilé. Mais je pense qu'il marche. */