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

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

この質問は以下に関連しています。abrt-hook-cppがインストールされているコアファイルはどこにありますか?

故意にクラッシュしたプログラムに対してコアファイルを生成しようとしたとき、最初はabrt-ccppによってコアファイルの生成がブロックされているようです。だから/proc/sys/kernel/core_patternvimで手動で編集しようとしました。

> 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

質問:

出力をファイルに編集、chmod転送、およびリダイレクトする操作がすべて失敗し、指定された呼び出しだけがファイルを上書きまたは編集できるのはなぜですか。echo/proc/sys/kernel/core_patternsudo bash...

質問:

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

答え1

procfs のエントリは一時コードで管理されます。/proc/sysファイルの権限と所有権を設定するコード(以下proc_sys_setattr)権限と所有権を変更するためのEPERMの使用を拒否します。したがって、これらのファイルの権限や所有権を完全に変更することはできません。これらの変更はまだ実装されていないため、ルートになることは役に立ちません。

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

ルートだけがsysctl設定を許可するのは、kernel.core_patternコマンドを指定できるようにするためです。これはグローバル設定なので、すべてのユーザーがコマンドを実行できるからです。実際、これはすべてのsysctl設定に対してある程度真実です。グローバル設定なので、ルートのみ変更できます。kernel.core_pattern特に危険な場合です。

答え2

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これが私が変更した内容を上書きすることがわかりました。削除しapportてからsudo apt-get remove apport変更を使用しました。

答え3

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

関連情報