
最近、起動前に 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。シェルスクリプト根本的な理由は、exec
syscallはELF実行ファイルとシェバンの両方を直接処理できる。
ここでは、たとえば、任意の最小限の C コンパイルを作成する方法を示しますinit
。1 つのプログラムだけを実行し、他のプログラムは実行しないカスタム Linux ディストリビューションを作成するにはどうすればよいでしょうか?
ではなぜない/bin/bash
なんと、accept は通常の実行可能ファイルですが、実際に役に立つのでしょうか? :-)
init
次に、 systemdやBusyboxなどの通常のシステムとのトレードオフが何であるかを理解する必要があります。
基本的に、raw を使用すると/bin/bash
、次のようになります。
- パスワードによるログインを制御する機能が失われます。ただし、システム エミュレーションを行う場合など、これが望ましい場合もあります。Buildroot BusyBox init で root ユーザー名やパスワードを入力せずに自動的にログインするにはどうすればよいですか?
- ジョブ制御が失われます。例: Ctrl + C は機能しません
- Ctrl+Cを実行すると、シェルが終了し、カーネルパニックが
init
発生します。
-
ジョブ制御は、Busybox の init および の先頭に があるその他の同様の init で復元できますinittab
。
tty3::respawn:-/bin/sh
inittab
ログインを使用し、Ctrl+D を実行するとシェルを生成し続ける、より一般的なエントリは次のとおりです。
::respawn:/sbin/getty -L ttyS0 0 vt100
これらはgetty
実行可能ファイルを使用しますが、TODO: Busybox なしでは自分で生成できませんでしたinit
。getty をコマンドラインから起動しますか?
使用できますこの設定いろいろ試してみて、上記の結論に達しました。