Le voci in procfs sono gestite da codice ad hoc. Il codice che imposterebbe i permessi e la proprietà sui file in /proc/sys
(proc_sys_setattr
) rifiuta le modifiche ai permessi e alla proprietà con EPERM. Quindi non è possibile modificare i permessi o la proprietà di questi file, punto e basta. Tali modifiche non vengono implementate, quindi essere root non aiuta.
Quando provi a scrivere come utente non root, ricevi un errore di autorizzazione. Anche con sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
, stai tentando di scrivere come utente non root:sudo
esegue echo
come root, ma il reindirizzamento avviene nella shell da cui sudo
viene eseguito e quella shell non ha privilegi elevati. Con sudo bash -c '… >…'
, il reindirizzamento viene eseguito nell'istanza bash avviata da sudo
e che viene eseguito come root, quindi la scrittura riesce.
Il motivo per cui solo root deve essere autorizzato a impostare kernel.core_pattern
sysctl è che consente di specificare un comando e, poiché si tratta di un'impostazione globale, questo comando potrebbe essere eseguito da qualsiasi utente. Questo è infatti il caso di tutte le impostazioni di sysctl a vari livelli:sono tutte impostazioni globali, quindi solo root può modificarle. kernel.core_pattern
è solo un caso particolarmente pericoloso.
Su Ubuntu 18.04 posso aggiornare il pattern con:
sudo bash -c 'echo "/data/app_crash/%t.%e.core.%p" > /proc/sys/kernel/core_pattern'
Posso anche aggiornare /etc/sysctl.conf
e aggiungi la riga:
kernel.core_pattern = /data/app_crash/%t.%e.core.%p
Tuttavia, anche se non ci sono altre righe che impostano kernel.core_pattern
in /etc/sysctl.conf
o /etc/sysctl.d/*
, dopo il riavvio il pattern viene nuovamente impostato sul valore predefinito:
$ sudo sysctl -a | grep kernel.core_pattern
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P
Si è scoperto che apport
stava sovrascrivendo tutte le modifiche apportate. Ho disinstallato apport
con sudo apt-get remove apport
e poi sono state utilizzate le mie modifiche.