概要
- 本記事は、前回のシリーズの補足として、単独で理解可能な内容
- curlで取得したスクリプトの正体を解析し、安全性や動作を詳細に解説
- スクリプトがLinuxカーネルとinitrdを再帰的にkexecする仕組みを説明
- initrdやELFの解釈、自己複製(Quine)プログラムとの関係性を考察
- Linuxカーネルや実行形式の「解釈者」としての側面を深堀り
curlで取得した謎のスクリプトの正体
- コマンド例: curl https://astrid.tech/rkx.gz | gunzip | sudo sh
- 何をしているか分からず不安を感じるコマンド
- ファイルの正体を調査
- gunzip後のrkxは POSIXシェルスクリプト
- 中身は約20MBの巨大なbase64データ
- スクリプトの動作概要
- root権限の確認
- kexec, base64, cpio の有無をチェック
- base64データをデコードしcpioアーカイブ「r」を生成
- cpioから「k」ファイル(カーネルイメージ)を抽出
- kexecで「k」(カーネル)と「r」(ramdisk)をロード・実行
スクリプトの実体と再帰的kexec
- 「r.cpio」は initramfs として機能
- /bin, /init, k(カーネルイメージ)を含む
- /initスクリプトの内容
- /procをマウント
- 自身のファイル群をcpioで新たな/rにまとめる
- kexecで新たなカーネルとramdiskを再起動的に実行
- この仕組みの特徴
- 再帰的にkexecを呼び出すLinuxディストリビューション
- 実行のたびにカーネルとinitrdを置き換え続ける
- まるで「自分の尻尾を追いかける」ような再帰
initrdとQuine(自己複製プログラム)
- Quineの定義: 自分自身を出力する自己複製プログラム
- /initの最後にcat /rを追加すると、 initrd Quine となる
- RAM上のファイルのみを扱うため、実質I/Oは発生しない
- 読者への問い
- 「最小のinitrd Quineはどれくらい小さくできるか?」
Linuxカーネル・ELF・インタプリタの解釈連鎖
- Linuxカーネルは「initrdのインタプリタ」として機能
- スクリプトの実行
- シェバン(#!/bin/sh等)により、 インタプリタに渡されて解釈実行
- ELFバイナリにはインタプリタとしてld.soが指定されている場合がある
- ELFの実行プロセス
- カーネルがld.soを起動
- ld.soがELFを読み込み、必要なライブラリをロードして実行
- 静的リンクの場合はカーネルが直接解釈
- 解釈の連鎖
- /bin/shはスクリプトを解釈
- ld.soは/bin/sh(や他のELF)を解釈
- カーネルはld.so(静的リンク)やELF自体を解釈
- 実行形式でないファイルを実行しようとした場合
- 例:cpioアーカイブを直接実行→「exec format error」
Linuxの実行モデルと「プログラムとしてのinitrd」
- initrdは「プログラム」、カーネルはその「インタプリタ」
- kexecを用いた再帰的なOS置換のユニークさ
- プログラミング言語や実行形式の「解釈される立場」の再考
- シェルスクリプト、ELF、initrdそれぞれの「解釈」構造の対比
このように、curlで取得したスクリプトは「再帰的に自分自身をkexecするLinux OS」という、シンプルながらも奥深い仕組みを持つものでした。initrdや実行形式の「自己複製性」や「解釈者」の連鎖といった、OSやプログラミングの根本的な仕組みを考えるきっかけとなる内容です。