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

Respondre per correu electrònic a