web-dev-qa-db-ja.com

BusyBoxコマンドは本当に組み込まれていますか?

有名な nix Recovery Legend を読んでいて、不思議に思いました:

BusyBoxシェルを開いていて、BusyBoxバイナリ自体が削除されている場合でも、BusyBoxバイナリに含まれているすべてのコマンドを使用できますか?

BusyBoxファイルがあるため、bashなどのシェルを実行しているanotherからのコマンドのBBバージョンを使用できないことは明らかです。 bash自体を開いて実行することはできません。しかし、BusyBoxの実行中のインスタンスから、BBがコマンドを実行する2つの方法があるように思えます。

  1. これは、BusyBoxの新しいインスタンスをフォークして実行し、適切な名前を使用して呼び出し、ディスクからBusyBoxファイルを読み取って実行します。
  2. これは、フォークして、指定されたコマンドを実行するためのいくつかの内部ロジックを実行できます(たとえば、関数呼び出しとして実行することにより)。

(1)がBusyBoxの動作方法である場合、BBバイナリが削除された後、実行中のBBのインスタンス内から特定のBusyBox提供のコマンドが使用できなくなると予想します。

(2)が機能している場合、BusyBoxの実行中のインスタンスがまだアクセス可能であれば、BB自体が削除されたシステムの回復にもBusyBoxを使用できます。

これはどこかに文書化されていますか?そうでない場合、安全にテストする方法はありますか?

28
Wildcard

デフォルトでは、BusyBoxは、組み込みのアプレット(busybox --helpでリストされたコマンド)に関して特別なことは何もしません。

ただし、FEATURE_SH_STANDALONEおよびFEATURE_PREFER_APPLETSオプションがコンパイル時に有効になっている場合、BusyBoxsh¹が既知のアプレット名であるコマンドを実行すると、通常のPATHルックアップは行われません。 、しかし代わりにショートカットを通してビルトインアプレットを実行します:

  • ソースコードで「noexec」と宣言されているアプレットは、フォークされたプロセスで関数呼び出しとして実行されます。 BusyBox 1.22以降、次のアプレットはnoexecです:chgrpchmodchowncksumcpcutdddos2unixenvfoldhdheadhexdumplnlsmd5summkfifomknodsha1sumsha256sumsha3sumsha512sumsorttacunix2dos
  • ソースコードで「nofork」と宣言されているアプレットは、同じプロセスで関数呼び出しとして実行されます。 BusyBox 1.22以降、次のアプレットはノーフォークです:[[[basenamecatdirnameechofalsefsynclengthlognamemkdirprintenvprintfpwdrmrmdirseqsynctesttrueusleepwhoamiyes
  • 他のアプレットは実際に実行されます(forkおよびexecveを使用)。ただし、PATHルックアップを実行する代わりに、BusyBoxは/proc/self/exeを実行します(可能な場合)。 Linuxの場合)、それ以外の場合はコンパイル時に定義されるパス。

これは docs/nofork_noexec.txt でもう少し詳しく説明されています。アプレット宣言は、ソースコードのinclude/applets.src.hにあります。

ほとんどのデフォルト設定ではこれらの機能がオフになっているため、BusyBoxは他のシェルと同様に外部コマンドを実行します。 Debianはbusyboxおよびbusybox-staticパッケージの両方でこれらの機能をオンにします。

したがって、FEATURE_SH_STANDALONEおよびFEATURE_PREFER_APPLETSでコンパイルされたBusyBox実行可能ファイルがある場合、実行可能ファイルが削除されていても、BusyBoxシェルからすべてのBusyBoxコマンドを実行できます(上記にリストされていないアプレットを除く)。 /proc/self/exeは使用できません)。

¹ BusyBoxには実際には「sh」の2つの実装(ashとhush)がありますが、この点では同じように動作します。

is there a way to safely test it?一般的なx86 openwrtイメージ:

vbox screenshot

ほとんどのコマンドは組み込みではありませんが、echoprintfなどの一部のコマンドは組み込まれています。任意の内容のバイナリファイルは、printfを使用して作成できますが、chmod +xが問題になります。

8
basin