• execvp() e shell invalida...

    From Marco Gaiarin@21:1/5 to All on Wed Sep 7 16:00:01 2022
    Scrivo qui perchè non so dove sbattere la testa.


    Sto cercando d far funzionare il software 'vchanger':

    https://sourceforge.net/projects/vchanger/

    un plugin per bacula (software di backup client server) che permette di
    gestire dischi removibili.

    Il software viene sviluppato su RH, dove però c'è una configurazione simile (vedete poi).


    Funziona tutto, se non che ad un certo punto viene eseguito un comando
    esterno (bconsole, la console testuale di bacula) all'interno del servizio 'storage daemon', che gira con utente 'bacula', un utente con shell
    invalida:

    root@vbaculalpb:~# getent passwd | grep bacula
    bacula:x:107:115:Bacula:/var/lib/bacula:/usr/sbin/nologin


    Orbene, il comando in questione, eseguito con execvp() da qui:

    https://sourceforge.net/p/vchanger/code/ci/master/tree/src/mypopen.cpp#l299

    fallisce (rc=1).


    Anche in RH-like bacula ha shell invalida, ma li sembra che l'esecuzioni funzioni senza problemi...


    C'è qualcosa che fa differire debian da RH su questi aspetti?

    Qualcuno ha qualche idea su cosa poter andare a guardare?


    Grazie...

    --
    ...ma quel suo volo certo vuol dire
    che bisognava volare (F. Guccini)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Giuseppe Sacco@21:1/5 to All on Wed Sep 7 22:50:01 2022
    Ciao Marco,

    Il giorno mer, 07/09/2022 alle 15.07 +0200, Marco Gaiarin ha scritto:
    [...]
    Orbene, il comando in questione, eseguito con execvp() da qui:

            https://sourceforge.net/p/vchanger/code/ci/master/tree/src/mypopen.c
    pp#l299

    fallisce (rc=1).

    Hai verificato quale comando viene eseguito? Il primo argomento della execvp() deve essere un file binario, oppure uno di testo che inizi con «#!interpreter [optional-arg]» e dove «interpreter» dovrebbe essere un percorso (assoluto?) relativo ad un file binario.

    Inoltre, prima della execvp(), c'è una chiamata a vlog.Debug(). Cosa c'è scritto nel debug? Il file eseguito è quello corretto?

    Ciao,
    Giuseppe

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marco Gaiarin@21:1/5 to All on Thu Sep 8 11:50:01 2022
    Mandi! Giuseppe Sacco
    In chel di` si favelave...

    fallisce (rc=1).
    Hai verificato quale comando viene eseguito? Il primo argomento della execvp()
    deve essere un file binario, oppure uno di testo che inizi con «#!interpreter [optional-arg]» e dove «interpreter» dovrebbe essere un percorso (assoluto?) relativo ad un file binario.

    Con le mie scarsissime competenze di C ho cercato di leggere il codice, e sembra tutto a posto.

    Il comando viene eseguito da qui:

    https://sourceforge.net/p/vchanger/code/ci/master/tree/src/bconsole.cpp

    nella funzione issue_bconsole_command(), che poi richiama mypopen_raw() che richiama do_mypopen_raw() per l'escuzione.


    Inoltre, prima della execvp(), c'è una chiamata a vlog.Debug(). Cosa c'è scritto nel debug? Il file eseguito è quello corretto?

    Nei log vedo:

    Aug 29 09:36:16: [8987]: ==== preforming REFRESH command
    Aug 29 09:36:16: [8987]: running '/usr/sbin/bconsole -n -u 30'
    Aug 29 09:36:16: [8987]: popen: child stdin uses pipe (4 -> 5)
    Aug 29 09:36:16: [8987]: popen: child stdout uses pipe (6 -> 7)
    Aug 29 09:36:16: [8987]: popen: forking now
    Aug 29 09:36:16: [8987]: popen: parent closing pipe ends 4,7,-1 used by child
    Aug 29 09:36:16: [8987]: popen: parent writes child's stdin to 5
    Aug 29 09:36:16: [8987]: popen: parent reads child's stdout from 6
    Aug 29 09:36:16: [8987]: popen: parent returning pid=8988 of child
    Aug 29 09:36:16: [8987]: sending bconsole command 'update slots storage="VIPVE2RDX" drive="0"'
    Aug 29 09:36:16: [8988]: popen: child closing pipe ends 5,6,-1 used by parent
    Aug 29 09:36:16: [8988]: popen: child will read stdin from 4
    Aug 29 09:36:16: [8988]: popen: child will write stdout to 7
    Aug 29 09:36:16: [8988]: popen: child executing '/usr/sbin/bconsole'
    Aug 29 09:36:16: [8987]: bconsole: exited with rc=1

    e sembra tutto a posto, nel senso che tutto funziona fino alla execvp(), che fallisce.


    Ovviamente /usr/sbin/bconsole è il path corretto.


    Volevo provare a mettere la shell all'utente bacula, giusto per capire se
    così funziona, ma mi sembra una extrema ratio...

    --
    Does anybody here remember Vera Lynn?
    (Pink Floyd)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Alessandro Rubini@21:1/5 to All on Thu Sep 8 12:40:01 2022
    Mi sembra sbagliata la diagnosi. execvp() funziona.

    Il link iniziale mostra questo codice (corretto!)

    execvp(argv[0], argv);
    /* only gets here if execvp fails */
    return -1;

    Perche` exec non ritorna. E se tornasse la funzione tornerebbe -1, non 1.
    "rc" = return command. Qui e` il processo figlio che fa exit(1).

    Consiglio di guardarlo con "strace -f" per vedere cosa fa il processo
    figlio e perche` termina male.

    Ovviamente non si vedranno le sue if che sbagliano e generano l'errore,
    ma spesso la sequenza di chiamate di sistema indica chiaramente cosa
    e` andato storto. Certo, se il codice fa solo:

    if (!getenv("VARIABILE_STRANA")) exit(1);

    mica lo vediamo da strace, ma e` improbabile che non si noti niente
    di sbagliato nei suoi accessi.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marco Gaiarin@21:1/5 to All on Thu Sep 8 15:20:01 2022
    Mandi! Alessandro Rubini
    In chel di` si favelave...

    Perche` exec non ritorna. E se tornasse la funzione tornerebbe -1, non 1. "rc" = return command. Qui e` il processo figlio che fa exit(1).

    Urco, non mi ero accorto... grazie Alessandro...


    Consiglio di guardarlo con "strace -f" per vedere cosa fa il processo
    figlio e perche` termina male.

    OK, ma stiamo parlando di un binario eseguito all'interno di un servizio (bacula-sd): come posso 'strecciarlo'? ;-)

    Faccio un wrapper shell a vchanger al cui interno lo eseguo con strace?
    Meglio fare lo strace di tutto il servizio, lanciandolo a mano?


    La cosa che non mi torna è il perchè questa cosa non sia il problema di
    altri pacchetti (non credo che Bacula sia l'unico software che esegue un
    altro software al suo interno, da utente senza shell...) ma solo di questo.

    --
    I segreti per restare a galla tu li conosci meglio di me.
    Ed e` per questo che non mi piaci
    e grazie al cielo io non piaccio a te (F. De Gregori)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Alessandro Rubini@21:1/5 to All on Thu Sep 8 15:40:01 2022
    Consiglio di guardarlo con "strace -f" per vedere cosa fa il processo
    figlio e perche` termina male.

    OK, ma stiamo parlando di un binario eseguito all'interno di un servizio (bacula-sd): come posso 'strecciarlo'? ;-)

    "-f" segue i fork. E "-p <pid>" si collega ad un processo gia` in
    esecuzione. "man strace".

    E` abbastanza comune, almeno nel mio mondo, collegarsi ad un servizio
    con "-f -o <outputfile>", fargli incorrere nell'errore che vogliamo
    capire e poi aprire il file di output. Usare "-t" aiuta,
    cosi` si genera l'errore ad un'ora specifica e si cerca solo li` attorno.

    (non credo che Bacula sia l'unico software che esegue un
    altro software al suo interno, da utente senza shell...)

    L'utente senza shell e` irrilevante. Come dicevo, "diagnosi sbagliata.
    Nel dubbio, si puo` sempre regalare /bin/sh all'utente e vedere che
    l'errore persiste. Per poi togliergli la shell come prima.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marco Gaiarin@21:1/5 to All on Mon Sep 12 18:20:01 2022
    Mandi! Alessandro Rubini
    In chel di` si favelave...

    "-f" segue i fork. E "-p <pid>" si collega ad un processo gia` in
    esecuzione. "man strace".

    Quante cose si imparano... ;-)


    L'utente senza shell e` irrilevante. Come dicevo, "diagnosi sbagliata.

    E di brutto. Il comando non viene eseguito dallo storage daemon, quindi da utente 'bacula', ma direttamente da 'vchanger', eseguito dentro degli script per udev, quindi eseguiti da root.


    Infatti se lo eseguo DA ROOT con strace con:

    root@sdpve2:~# strace -f /usr/bin/vchanger --force /etc/vchanger/SDPVE2RDX.conf refresh

    fa correttamente il fork, esegue bconsole, la quale ad un certo punto:

    [pid 22011] openat(AT_FDCWD, "/etc/bacula/bconsole.conf", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)

    Come può qualcosa eseguito come root NON avere i permessi di accesso a un
    file? Se serve la chiamata a clone() prima del'execve() è:


    22729 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb0f063ea90) = 22746
    [...]
    22746 execve("/usr/sbin/bconsole", ["/usr/sbin/bconsole", "-n", "-u", "30"], 0x7ffcab66de30 /* 20 vars */) = 0

    --
    Mentre il cuore d'Italia, da Palermo ad Aosta
    si gonfiava in un coro di vibrante protesta (F. De Andre`)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marco Gaiarin@21:1/5 to All on Tue Sep 13 22:50:01 2022
    Mandi! Marco Gaiarin
    In chel di` si favelave...

    Ho un nuovo mistero, e ancora tanta curiosità... ;-)

    Per essere ancora più preciso-preciso: ho un processo che ad un certo punto
    si cambia (drop) user e group a bacula:tape usando la funzione drop_provs():

    https://sourceforge.net/p/vchanger/code/ci/master/tree/src/util.cpp#l154

    e deve leggere un file che è 640 root:bacula.

    L'utente 'bacula' ha gruppo primario 'bacula'.

    E non riesce a leggere il file.


    Cosa non capisco?!

    --
    E allora osservi gli altri giocare
    e` un gioco strano devi imparare (E. Bennato)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marco Gaiarin@21:1/5 to All on Tue Sep 13 22:20:01 2022
    Mandi! Marco Gaiarin
    In chel di` si favelave...

    Come può qualcosa eseguito come root NON avere i permessi di accesso a un

    ...perchè vchanger 'droppa' i permessi, di default a bacula:tape; in debian
    il gruppo 'tape' ha come membro l'utente bacula, ma non è il 'primary
    group' (in debian è 'bacula').

    Se modifico la configurazione di modo che droppi a bacula:bacula, funziona tutto.

    Ho anche scoperto che 'strace' non è in grado di 'vedere' i drop di
    permessi...


    Ho un nuovo mistero, e ancora tanta curiosità... ;-)

    --
    A: http://en.wikipedia.org/wiki/Top_post
    Q: Were do I find info about this thing called top-posting?
    A: Because it messes up the order in which people normally read text.
    Q: Why is top-posting such a bad thing?
    A: Top-posting.
    Q: What is the most annoying thing in e-mail?
    A: No.
    Q: Should I include quotations after my reply?

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marco Gaiarin@21:1/5 to All on Wed Sep 14 22:20:01 2022
    Mandi! Marco Gaiarin
    In chel di` si favelave...

    Cosa non capisco?!

    ...che è un baco. ;-)

    https://sourceforge.net/p/vchanger/bugs/20/

    --
    I politici dovrebbero leggere fantascienza,
    non western o storie di polizia. (Arthur C. Clarke)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)