Domanda

Sto cercando di cambiare la mia uid a 0 per non root con la capacità CAP_SETUID. Ho il seguente programma:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/capability.h>
#include <sys/prctl.h>

int main(int argc, char *argv[])
{
    printf("cap setuid in bset: %d\n", prctl(PR_CAPBSET_READ, CAP_SETUID, 0, 0, 0));
    printf("%s\n", cap_to_text(cap_get_file(argv[0]), NULL));
    printf("%s\n", cap_to_text(cap_get_proc(), NULL));
    printf("uid: %d\n", (int) getuid());
    setresuid(0, 0, 0);
    printf("uid: %d\n", (int) getuid());
    return 0;
}

I assegnare la capacità setuid come segue:

sudo /sbin/setcap cap_setuid=ep ./capsetuid

E ottengo il seguente output

cap setuid in bset: 1
= cap_setuid+ep
=
uid: 1000
uid: 1000

mi aspetto il secondo printf () per mostrare anche la capacità CAP_SETUID. In qualche modo il mio processo non ottiene la capacità di file setuid. Che cosa sto facendo male qui?

È stato utile?

Soluzione

appena scoperto che le funzionalità di file devono essere abilitati dalla linea di comando kernel con file_caps = 1.

Altri suggerimenti

setuid() imposta il efficace user-id del processo, ma getuid() ottiene il reale user-id.

Cambia il getuid() per geteuid() e dovrebbe funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top