Linux が 'init=/bin/bash' を許可するのはなぜですか?

Linux が 'init=/bin/bash' を許可するのはなぜですか?

最近、起動前に GRUB を編集して追加すると、rw init=/bin/bashルート シェルになることがわかりました。

すべてを理解したいという状況なので、なぜこのようなことが起こるのかを知りたいです。つまり、これはバグですか? これは機能ですか? コンピューターに物理的にアクセスできる場合にのみ機能するため、管理者が問題を修正できるようにするためにあるのですか?

それは GRUB によって提供されるのでしょうか、それとも実際のカーネルによって提供されるのでしょうか?

答え1

これはシステムメンテナンスのために使用される機能です。これにより、システム管理者は、混乱した初期化ファイルからシステムを回復したり、忘れたパスワードを変更したりすることができます。

Red Hatメーリングリストのこの投稿いくつかのことを説明します:

Unix 系システムでは、init は最初に実行されるプロセスであり、実行されるすべてのプロセスの最終的な祖先です。すべての init スクリプトを実行する役割を担っています。

Linux カーネルに、システム init ではなく、init として /bin/bash を実行するように指示しています。 [...]

したがって、何も悪用しているわけではなく、単に標準のカーネル機能を使用しているだけです。

また、コメントに記載されているように、rwフラグは とは別のものでありinit=、ルート ファイル システムを読み取り/書き込みとしてマウントするようにシステムに指示するだけです (そのため、たとえば、誤って構成されたファイルを編集したり、パスワードを変更したりできます)。

答え2

システムには実行とデバッグのためのメカニズム (init パラメータなど) があり、望ましくないユーザーがそれを利用できないようにするセキュリティ メカニズムも備わっている可能性があります。これらは機能であり、バグではありません。

ブートローダは OS を起動する役割を担っています。この時点では OS セキュリティは当然適用されません。別のカーネル、initrd、ルート ファイルシステムをロードするか、別のオプション (init パスなど) を設定するだけで済みます。ユーザーがこれを行わないようにするには、ブートローダで行う必要があります。

システム (おそらく PC なので BIOS) はブートローダをロードするため、当然のことながら、ブートローダのセキュリティは適用されません。ユーザーが USB などから BIOS を起動するのを阻止したい場合は、そのレベルでそれを実行する必要があります。

システムはどこかの机の上にあるかもしれません。ユーザーがコンピューターを開けて、自分の HDD と交換したり、ドライブを取り外して自分のマシンにマウントしたりすることを阻止したい場合は、物理的なレベルでそれを行う必要があります。また、ユーザーが机全体を持ち上げて逃走用バンで走り去ることも阻止できません...

セキュリティとはそういうものです。どこまでも象の群れです。

答え3

これはカーネルの設計上の単純なやり方です。何かコンピュータの起動時に実行されるもので、デフォルトはありますが、カーネル コマンド ラインを使用してそのデフォルトを変更できます。

通常、/bin/initまたはにある「init」と呼ばれるプログラムを実行します/sbin/init。このプログラムは、すべてのシステムの起動と使用可能な環境の作成を担当します。

を指定するとinit=/bin/bash、カーネルは/bin/bash代わりに実行します (これはシェルです)。 を指定すると、rwカーネルはハードディスクを読み取り専用モードではなく読み取り/書き込みモードで起動するように指示します。 従来、カーネルはディスクを読み取り専用モードで起動し、その後プロセスがディスクの整合性をチェックしてから読み取り/書き込みモードに切り替えます。

答え4

init=取っていいよどれでも実行可能

init=実行ファイルなら何でもOK。シェルスクリプト根本的な理由は、execsyscallはELF実行ファイルとシェバンの両方を直接処理できる

ここでは、たとえば、任意の最小限の C コンパイルを作成する方法を示しますinit1 つのプログラムだけを実行し、他のプログラムは実行しないカスタム Linux ディストリビューションを作成するにはどうすればよいでしょうか?

ではなぜない/bin/bashなんと、accept は通常の実行可能ファイルですが、実際に役に立つのでしょうか? :-)

init次に、 systemdやBusyboxなどの通常のシステムとのトレードオフが何であるかを理解する必要があります。

基本的に、raw を使用すると/bin/bash、次のようになります。

-ジョブ制御は、Busybox の init および の先頭に があるその他の同様の init で復元できますinittab

tty3::respawn:-/bin/sh

inittabログインを使用し、Ctrl+D を実行するとシェルを生成し続ける、より一般的なエントリは次のとおりです。

::respawn:/sbin/getty -L ttyS0 0 vt100

これらはgetty実行可能ファイルを使用しますが、TODO: Busybox なしでは自分で生成できませんでしたinitgetty をコマンドラインから起動しますか?

使用できますこの設定いろいろ試してみて、上記の結論に達しました。

関連情報