Re: (deb-cat) sudo as lp
El Fri, Sep 16, 2016 at 12:27:55AM +0200, Alex Muntada deia:
> Narcis Garcia:
>
> > Ja he avançat en el problema (que no en la solució): CUPS executa el
> > controlador /etc/cups/interfaces/Epson1 engabiat d'alguna manera, de
> > manera que només té accés a alguns directoris.
> >
> > Això és el què obtinc si el programet només executa "ls /":
> > ls: no s’ha pogut obrir el directori /: S’ha denegat el permís
> >
> > I això per fi he aconseguit si executa sudo -n -u UnUsuari /bin/bash -c
> > "ls /"
> > sudo: no s'ha pogut obrir /etc/sudoers: S’ha denegat el permís
> > sudo: no valid sudoers sources found, quitting
> > sudo: unable to initialize policy plugin
>
> Fa pudor d'apparmor:
>
> $ apt-file search /etc/apparmor.d/ | grep cups
> apparmor: /etc/apparmor.d/abstractions/cups-client
> cups-browsed: /etc/apparmor.d/usr.sbin.cups-browsed
> cups-daemon: /etc/apparmor.d/usr.sbin.cupsd
>
> Mira quines restriccions té /etc/apparmor.d/usr.sbin.cupsd perquè
> m'ensumo que la cosa va per aquí.
>
> Salut,
> Alex
>
No conec gaire apparmour, però no sé si aquestos s'aplicarien a l'script
de /etc/cups/interfaces.
Cupsd no executara l'script d'interfície directament (crec, podria
segons casos, sembla). El que fa és generar un profile d'apparmor (en
un fitxer temporal) i cridar a /usr/lib/cups/daemon/cups-exec amb el
profile i l'script perquè el cridi ell. cups-exec crea un sandbox amb
el profile i llavors fa l'exec de l'script
El fitxer temporal amb el profile sembla que permet llegir els fitxers
de la tasca d'impressió actual (i escriure alguns altres i fer algunes
connexions, segons la configuració concreta dels directoris que usa
cupsd). No he investigat en detall però possiblement els fitxers de
claus públiques de servidors no es poden llegir i ssh (si l'arribes a
poder executar) ho té fotut. S'hauria de mirar amb lupa.
start_job() crea un profile d'apparmor en un fitxer temporal (a a partir de text hardcoded al programa).
https://github.com/apple/cups/blob/master/scheduler/job.c#L4711
https://github.com/apple/cups/blob/master/scheduler/process.c#L72
Després start_job() crida continueJob()
https://github.com/apple/cups/blob/master/scheduler/job.c#L482
que crida cupsdStartProcess()
https://github.com/apple/cups/blob/master/scheduler/job.c#L1198
https://github.com/apple/cups/blob/master/scheduler/process.c#L450
que decideix si crida cups-exec basat en opcions de compilació i si té profile
(sembla que sempre en té, de manera que sempre deu cridar cups_exec)
https://github.com/apple/cups/blob/master/scheduler/process.c#L548
cups-exec "si cal" crea un sandbox per executar el procés
https://github.com/apple/cups/blob/master/scheduler/cups-exec.c
https://github.com/apple/cups/blob/master/scheduler/cups-exec.c#L145
Però cal, perquè li passen el fitxer temporal que han creat abans com
a paràmetre profile (no és el primer paràmetre, sinó el primer sense
-, el comentari del principi del fitxer és incorrecte, el missatge
d'ús del final és correcte).
El nom del fitxer temporal no és molt aleatori, es basa en l'hora actual
passada a hexadecimal. Segurament hi ha maneres millors de crear fitxers
temporals, però potser no tan portables ? El directori serà /tmp, o el
valor de $TMPDIR.
https://github.com/apple/cups/blob/master/cups/tempfile.c
Reply to: