Openwrtセキュリティモードfailsafe分析
2933 ワード
セキュリティ・モードの役割:
基本的なファイルシステムだけをロードして、パスワード、ネットワークの配置などを修正することができて、アップグレードシステム、Ubootなどの操作を行うことができます;
hotplugメカニズムに依存する.
Procdでpreinit初期化を行う.hotplugイベントを同時に登録します.
ファイル/etc/hotplug-preinit.json
[[exec],[/etc/rc.button/failsafe]]キーを検出してこのスクリプトを実行
キーピンの状態が変化している限り、/tmp/failsafe_を作成します.buttonファイル、スクリプト/lib/preinit/30_failsafe_wait使用
fs_wait_for_key関数は、キー「f」メッセージを処理し、システムデバッグシリアルポートを介してデバッグ情報出力レベルを設定する.
[ -f "/tmp/failsafe_button"] && FAILSAFE=true &&echo "- failsafe button "`cat/tmp/failsafe_button`"was pressed-"ここでfailsafeを判断するbuttonファイルが存在する、すなわちセキュリティモードに入る.
注意しなければならないのは、procdがキー情報を取得し、hotplugスクリプトを呼び出すのはpreinitフェーズであり、overlayファイルシステムはまだロードされておらず、romfsが使用されているため、セキュリティモードを無効にするには、システム起動後に/etc/rc.button/failsafeスクリプトを変更することはできません.したがってpreinitフェーズでは、romfsが使用され、ユーザーが変更したファイルはoverlayfsにロードされていません.
So,キーを無効にしてセキュリティモードに入る方法は,sysupgrade.binファームウェアコンパイル段階で/etc/rc.button/failsafeスクリプトを変更し,/tmp/failsafe_を作成しないことである.buttonファイルでいいです.
基本的なファイルシステムだけをロードして、パスワード、ネットワークの配置などを修正することができて、アップグレードシステム、Ubootなどの操作を行うことができます;
hotplugメカニズムに依存する.
Procdでpreinit初期化を行う.hotplugイベントを同時に登録します.
ファイル/etc/hotplug-preinit.json
[
[ "case", "ACTION", {
"add": [
[ "if",
[ "has", "FIRMWARE" ],
[
[ "exec", "/sbin/hotplug-call", "%SUBSYSTEM%" ],
[ "load-firmware", "/lib/firmware" ],
[ "return" ]
]
],
],
}, ],
[ "if",
[ "and",
[ "eq", "SUBSYSTEM", "button" ],
],
[ "exec", "/etc/rc.button/failsafe" ]
],
]
すなわち[[exec],[/etc/rc.button/failsafe]]キーを検出してこのスクリプトを実行
#!/bin/sh
[ "${TYPE}" = "switch" ] || echo ${BUTTON} > /tmp/failsafe_button
return 0
キーピンの状態が変化している限り、/tmp/failsafe_を作成します.buttonファイル、スクリプト/lib/preinit/30_failsafe_wait使用
failsafe_wait() {
FAILSAFE=
grep -q 'failsafe=' /proc/cmdline && FAILSAFE=true && export FAILSAFE
if [ "$FAILSAFE" != "true" ]; then
pi_failsafe_net_message=true
preinit_net_echo "Please press button now to enter failsafe"
pi_failsafe_net_message=false
fs_wait_for_key f 'to enter failsafe mode' $fs_failsafe_wait_timeout && FAILSAFE=true
[ -f "/tmp/failsafe_button" ] && FAILSAFE=true && echo "- failsafe button "`cat /tmp/failsafe_button`" was pressed -"
[ "$FAILSAFE" = "true" ] && export FAILSAFE && touch /tmp/failsafe
fi
}
boot_hook_add preinit_main failsafe_wait
fs_wait_for_key関数は、キー「f」メッセージを処理し、システムデバッグシリアルポートを介してデバッグ情報出力レベルを設定する.
[ -f "/tmp/failsafe_button"] && FAILSAFE=true &&echo "- failsafe button "`cat/tmp/failsafe_button`"was pressed-"ここでfailsafeを判断するbuttonファイルが存在する、すなわちセキュリティモードに入る.
注意しなければならないのは、procdがキー情報を取得し、hotplugスクリプトを呼び出すのはpreinitフェーズであり、overlayファイルシステムはまだロードされておらず、romfsが使用されているため、セキュリティモードを無効にするには、システム起動後に/etc/rc.button/failsafeスクリプトを変更することはできません.したがってpreinitフェーズでは、romfsが使用され、ユーザーが変更したファイルはoverlayfsにロードされていません.
So,キーを無効にしてセキュリティモードに入る方法は,sysupgrade.binファームウェアコンパイル段階で/etc/rc.button/failsafeスクリプトを変更し,/tmp/failsafe_を作成しないことである.buttonファイルでいいです.