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.