Tato otázka souvisí s Kde je nainstalován základní soubor s abrt-hook-cpp? .
Zatímco jsem se pokoušel vygenerovat základní soubor pro záměrně shazující program, zpočátku se zdálo, že generování základního souboru bylo zmařeno abrt-ccpp. Zkusil jsem tedy ručně upravit /proc/sys/kernel/core_pattern
s vim:
> sudo vim /proc/sys/kernel/core_pattern
Když jsem se pokusil soubor uložit, vim ohlásil tuto chybu:
"/proc/sys/kernel/core_pattern" E667: Fsync failed
Myslel jsem, že jde o problém s oprávněními, a tak jsem se pokusil oprávnění změnit:
> sudo chmod 666 /proc/sys/kernel/core_pattern
chmod: changing permissions of '/proc/sys/kernel/core_pattern': Operation not permitted
Nakonec jsem na základě tohoto příspěvku zkusil toto:
>sudo bash -c 'echo /home/user/foo/core.%e.%p > /proc/sys/kernel/core_pattern'
Toto fungovalo.
Na základě funkčního řešení jsem vyzkoušel i tyto, které se nezdařily:
> echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
-bash: /proc/sys/kernel/core_pattern: Permission denied
>
> sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
-bash: /proc/sys/kernel/core_pattern: Permission denied
Otázka :
Proč je to ta úprava, chmod
ing a přesměrování echo
výstup do souboru /proc/sys/kernel/core_pattern
vše selhalo a pouze zaznamenané vyvolání sudo bash...
byl schopen přepsat/upravit soubor?
Otázka :
Konkrétně wrt pokusy o vyvolání sudo
ve výše uvedených neúspěšných pokusech:proč selhaly? Myslel jsem sudo
provedl následující příkaz s oprávněním root, o kterém jsem si myslel, že vám v Linuxu umožní dělat cokoli.
Přijatá odpověď:
Záznamy v procfs jsou spravovány ad hoc kódem. Kód, který by nastavil oprávnění a vlastnictví souborů pod /proc/sys
(proc_sys_setattr
) odmítá změny oprávnění a vlastnictví s EPERM. Takže není možné změnit oprávnění nebo vlastnictví těchto souborů, tečka. Takové změny nejsou implementovány, takže být root nepomůže.
Při pokusu o zápis jako uživatel bez oprávnění root se zobrazí chyba oprávnění. I s sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
, pokoušíte se napsat jako uživatel bez oprávnění root:sudo
spustí echo
jako root, ale k přesměrování dojde v shellu, ze kterého sudo
je spuštěn a tento shell nemá žádná zvýšená oprávnění. Pomocí sudo bash -c '… >…'
, přesměrování se provádí v instanci bash, kterou spouští sudo
a který běží jako root, takže zápis proběhne úspěšně.
Důvod, proč pouze root musí mít povoleno nastavit kernel.core_pattern
sysctl spočívá v tom, že umožňuje zadat příkaz, a protože se jedná o globální nastavení, může tento příkaz provést kterýkoli uživatel. To je ve skutečnosti případ všech nastavení sysctl v různé míře:všechna jsou globální nastavení, takže je může změnit pouze root. kernel.core_pattern
je jen zvlášť nebezpečný případ.