`/proc`にprocfが必要なのはなぜですか?

`/proc`にprocfが必要なのはなぜですか?

/procだから中に何があるのか​​知っています。いいえ実際のファイルシステムですが、擬似ファイルシステム(647551)。今私の質問は: なぜ私達がそれにそこに置くか。

これをファイルシステムのようにリストすると、これらのprocfs「ファイル」に対する潜在的に危険な読み取りと書き込みが発生し、特定の悪用(例:プロセスファイルへの読み書きアクセス)。

procfs一般化とシンプルな設計のために擬似ファイルシステムにすることができますが、Linuxはプロセスの内容を公開することなくメモリ内にすべてを保持できるはずです。

procfsそれではなぜatが必要ですか/proc

答え1

待つ。 「/procの内容が実際のファイルシステムではなく、擬似ファイルシステム(647551)であることを知っています。」と言われました。

許してくださいが、読んだことを考えるとそれ、あなたの質問はほとんど意味がありません。あなた必要システムAPI呼び出し/proc"filesystem"はファイルとしてレンダリングされる API 呼び出し。つまり、プロセスAPIのファイルの可用性のために失うことも、取得することもありません。使い方がやや簡単なだけでなく。 procfsファイルを介して実行できるすべての操作は、対応するioctl / kernel呼び出しを使用して実行できます。

同様のファイルシステムを削除してAPIを維持することが例です。あいまいさによるセキュリティだからあいまいなことはないでしょう。加害者はすぐに別のマクロインクルードファイルをロードするだけです。

同様に、これはprocfsパフォーマンスの問題でもセキュリティの問題でもありません。

(これは確かにいいえもちろん、これらのAPIへのアクセスを保護したり悪用したりしないでください。 )

答え2

なぜ我々はまだ/procそこにいるのですか?

psあなたのプロセスについて読むためにこれを持っています。これは、デバッグ中または実行中のバックグラウンドプロセスが途切れて終了したい場合に便利です。まずそれを見つける必要があります。

まあ、確かに/procそのような情報を提供する唯一の方法ではありません。伝説によると、昔は特権psバイナリがあったそうです。カーネルメモリから直接プロセス情報を読み込む。関連ファイルはありませんが、より安全であるとは感じません。もちろん、3番目のオプションは、プロセス情報を見つけるために1つ以上の専用システムコールを作成することです。ここでファイルシステムを作成するのはデザインの選択です。おそらく、ファイルシステムが作成されたとき、人々はlscatまた、これは情報を処理するのではなく、プロセス全体がカーネルとユーザー空間間の転送に役立つあらゆる種類のランダムデータのゲートウェイとして機能します。これをファイルシステムにすると、階層用の既成のフレームワークが提供されます。

さらに、ファイルシステムにはproc利用可能な既存のアクセス制御システムがあります。

ファイルシステムなどのprocfを一覧表示すると、これらの「ファイル」への読み書きが危険になる可能性があります。

自分が所有するプロセスでのみ機能します。伝統的に、単一のユーザーのプロセスは大幅に分離されていませんでした。一体システムによっては、実行中のプロセスでデバッガを実行してから実行できます。欲しいものは何でも構いませんそれに。 (しかし、/proc/sys/kernel/yama/ptrace_scopeLinuxでは何が起こるのか見てください。)

これにより、特定の脆弱性(プロセスファイルへの読み取り/書き込みアクセス)に関するステートメントが開きます。

ビデオに提示された問題は、に関するものではなく、procファイル記述子を開いたままにして、優先度の低いコンテキスト(再びユーザー自身のUIDに)に変更することです。そこで彼らはfdを開くシェルを実行し、シェルにcatそのfdを直接読み取るように指示します。これはせずに行うことができproc、表示が難しい場合でもfdは存在しません。しかし、最も低いものから順に割り当てられているので、fdがどの数値を取得するのかを推測することは難しくありません。

また、そのビデオで戻り値を確認していないsetuid()ため、フルroot権限でシェルを実行できました。また、指示に従ってルートでコンパイラを実行しないでください。コンパイラがどんな状況でも意図的に悪意のある作業を行わないことを信頼する必要があります。ただし、これは大きな問題であり、バグがある可能性があり、rootとして実行すると露出のリスクが高くなります。

Setuid バイナリ硬い正しいことをしてください。失われたファイル記述子に加えて、他にも多くの理由があります。これには、特権プログラムから無許可プログラムに戻るだけでなく、setuidプロセスが継承する環境も含まれます。訪問者、一般ユーザーが制御するプロセスです。

procfsはおそらく一般化と単純な設計のための擬似ファイルシステムで作ることができますが、Linuxはプロセスの内容を公開することなくメモリ内にすべてを保持できるはずです。

確かに。マウントしないでください/proc。記載されているように、あなたは仕事を持っていませんps。ただし、ファイルシステムなので、実行するだけでchmod 0550 /procルートとグループ所有のメンバーだけに/procアクセスできます。

/proc/$pid/fdそれとも何か特別なことを言われますか?それする親から商品を継承するプロセスの一般的な概念では、許可されていないいくつかの奇妙なトリックが許可されています。しかし、それ自体はあまり良いことをしません。ユーザーのプロセスはさまざまな方法で互いに干渉する可能性があります。

答え3

  1. procfssysコードを書かなくても、システムの現在の状態に関する情報を取得できます。だからそれが作られました。

  2. ファイルの代わりにC APIを使用すると、独自の欠点があります。たとえば、APIが生成された場合いいえこれらのAPIを使用する既存のアプリケーションを再構築/変更する必要があるため、簡単に拡張できます。

はい、procfsファイルをsys使用してシステムを悪用する可能性がありますが、実際には通常のAPIがこの目的に使用されます。もっと

それ完璧これらのファイルシステムは、完全な経験を得るためにインストールまたは使用する必要さえありません。たとえば、FreeBSD / OpenBSD / NetBSD、QNXなどの他のPOSIX準拠のオペレーティングシステムを確認してください。

関連情報