web-dev-qa-db-ja.com

core_patternの編集が制限されているのはなぜですか?

この質問は abrt-hook-cppがインストールされたコアファイルはどこですか? に関連付けられています。

意図的にクラッシュするプログラムのコアファイルを生成しようとしていましたが、最初はコアファイルの生成がabrt-ccppによって妨げられているように見えました。だから私はvimで手動で/proc/sys/kernel/core_patternを編集しようとしました:

> Sudo vim /proc/sys/kernel/core_pattern

ファイルを保存しようとすると、vimが次のエラーを報告しました。

"/proc/sys/kernel/core_pattern" E667: Fsync failed

これは権限の問題だと思ったので、権限を変更しようとしました:

> Sudo chmod 666 /proc/sys/kernel/core_pattern
chmod: changing permissions of '/proc/sys/kernel/core_pattern\': Operation not permitted

最後に、 この投稿 に基づいて、私はこれを試しました:

>Sudo bash -c 'echo /home/user/foo/core.%e.%p > /proc/sys/kernel/core_pattern'

これはうまくいきました。

作業ソリューションに基づいて、私もこれらを試しましたが、失敗しました:

> 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

質問

編集、chmoding、およびecho出力のファイル/proc/sys/kernel/core_patternへのリダイレクトがすべて失敗し、記載されているSudo bash...の呼び出しのみが上書き/編集できたのはなぜですか。ファイル?

質問

具体的には、上記の失敗した試行でSudoを呼び出す試行について:なぜ失敗したのですか?私はSudoがroot権限で後続のコマンドを実行したと思いました。これはLinuxで何でもできると思いました。

6
StoneThrow

Procfsのエントリは、アドホックコードによって管理されます。 /proc/sysproc_sys_setattr )の下のファイルに権限と所有権を設定するコードは、EPERMによる権限と所有権の変更を拒否します。したがって、これらのファイルの権限や所有権を変更することはできません。このような変更は実装されていないため、rootであっても役に立ちません。

非rootユーザーとして書き込もうとすると、アクセス権エラーが発生します。 Sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_patternを使用しても、root以外のユーザーとして記述しようとしている:Sudoechoをrootとして実行しますが、リダイレクトはSudoが実行され、そのシェルには昇格された特権がありません。 Sudo bash -c '… >…'では、リダイレクトはSudoによって起動され、ルートとして実行されるbashインスタンスで実行されるため、書き込みは成功します。

Rootのみがkernel.core_pattern sysctlの設定を許可されなければならない理由は、コマンドを指定できることです。これはグローバル設定であるため、このコマンドはどのユーザーでも実行できます。これは実際には、さまざまな程度のすべてのsysctl設定に当てはまります。これらはすべてグローバル設定であるため、rootだけが変更できます。 kernel.core_patternは特に危険なケースです。

Ubuntu 18.04では、パターンを次のように更新できます。

Sudo bash -c 'echo "/data/app_crash/%t.%e.core.%p" > /proc/sys/kernel/core_pattern'

/etc/sysctl.confを更新して、次の行を追加することもできます。

kernel.core_pattern = /data/app_crash/%t.%e.core.%p

ただし、kernel.core_patternまたは/etc/sysctl.conf/etc/sysctl.d/*を設定する行が他にない場合でも、再起動すると、パターンは再びデフォルト値に設定されます。

$ Sudo sysctl -a | grep kernel.core_pattern
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P

apportが私が行った変更を上書きしていることがわかりました。 apportSudo apt-get remove apportでアンインストールすると、変更が使用されました。

1
Earl Ruby

Ubuntu 16.04 LTSでは、

 Sudo bash -c 'echo /home/user/foo/core.%e.%p > /proc/sys/kernel/core_pattern'

失敗する

No such file or directory

私は走らなければならない

Sudo sysctl -w kernel.core_pattern=/home/user/foo/core.%e.%p
0
Tom Phan