Forum Linux.général Capability

Posté par  .
Étiquettes : aucune
0
30
août
2004
Hello !

Depuis le 2.6.8, il faut avoir cap_sys_rawio pour envoyer des commandes raw scsi ( ce qui est logique somme tout ). Mais comme pas mal d'application user-space s'ammusent à balancer des commandes raw scsi à tout va, ce nouveau kernel fou un peux la zone.

Heureusement, certaines peuvent êtres setuid-root et patché afin de droper tous les droits sauf cap_sys_rawio (et ce, dès les premières lignes de main(), donc pas de trou de sécu ) , malheureusement d'autres ne peuvent pas être setuid root ( toutes les applis utilisant les lib kde, ou gtk ).

Etant donné que cap_setpcap est automatiquement dropée par init et ne peux pas être changée ( sauf par un thread du kernel, mais bon ... ), et que linux ne supporte pas les capability sur le système de fichier ( donc les hineritables sont totalement innutiles ), *comment* lancer un programme avec uniquement cap_sys_rawio sans qu'il soit suid-root ( je veux bien le patcher et/ou le lancer par un wrapper )

Mes seulent tentatives se sont soldée par un processus qui a cap_sys_rawio comme hineritable, mais qui n'as rien dans effective ou allowed ....
  • # En C :

    Posté par  . É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. */
    
    
    • [^] # Re: En C :

      Posté par  . Évalué à 2.

      execvp(MON_PROGRAMME,argv);

      Non, désolé, mais ca ne marchera pas.
      car si l'application que tu lance n'est pas setuid root, toutes les capability seront remise à 0 ( sauf les héritables).

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.