mirror of
https://github.com/freebsd/freebsd-src
synced 2024-09-06 17:18:32 +00:00
![Simon J. Gerraty](/assets/img/avatar_default.png)
Debugging boot issues can be helped by logging each rc.d script as it is run and being able to selectively enable/disable set -x debug.sh provides an elaborate framework for debugging shell scripts. For secure systems, we want to be paranoid about what we read during boot. dot() simply reads (.) arg file if it exists vdot() if mac_veriexec is active, ignore unverified files otherwise behaves much the same as dot() safe_dot() in safe_eval.sh allows reading an untrusted file; limiting the input to simple variable assignments. In load_rc_config allow caller to provide an option to indicate how to handle its arg: -v use vdot() -s use sdot() which will try to use vdot() and fallback to safe_dot() The default is to read using dot() rc_run_scripts() encapsulate the running of rc.d scripts so that we can easily call it more than twice. We vdot local.rc.subr to pick up extensions (like run_rc_scripts_final) and overrides. We also allow rc.subr.local or rc.conf to set rc_config_xtra eg (rc_config_xtra=XXX for historic compatibility) rc use set -o verify around the reading in of rc.subr This has no effect if mac_veriexec is not active, but if it is; ensures rc.subr has not been tampered with. Reviewed by: imp Sponsored by: Juniper Networks, Inc. Differential Revision: https://reviews.freebsd.org/D43671
67 lines
1.3 KiB
Bash
67 lines
1.3 KiB
Bash
# SPDX-License-Identifier: BSD-2-Clause
|
|
|
|
# RCSid:
|
|
# $Id: safe_eval.sh,v 1.12 2023/10/12 18:46:53 sjg Exp $
|
|
#
|
|
# @(#) Copyright (c) 2023 Simon J. Gerraty
|
|
#
|
|
# This file is provided in the hope that it will
|
|
# be of use. There is absolutely NO WARRANTY.
|
|
# Permission to copy, redistribute or otherwise
|
|
# use this file is hereby granted provided that
|
|
# the above copyright notice and this notice are
|
|
# left intact.
|
|
#
|
|
# Please send copies of changes and bug-fixes to:
|
|
# sjg@crufty.net
|
|
|
|
_SAFE_EVAL_SH=:
|
|
|
|
##
|
|
# safe_set
|
|
#
|
|
# return a safe variable setting
|
|
# any non-alphanumeric chars are replaced with '_'
|
|
#
|
|
safe_set() {
|
|
sed 's/[ ]*#.*//;/^[A-Za-z_][A-Za-z0-9_]*=/!d;s;[^A-Za-z0-9_. "$,/=-];_;g'
|
|
}
|
|
|
|
##
|
|
# safe_eval [file]
|
|
#
|
|
# eval variable assignments only from file
|
|
# taking care to eliminate any shell meta chars
|
|
#
|
|
safe_eval() {
|
|
eval `cat "$@" | safe_set`
|
|
}
|
|
|
|
##
|
|
# safe_dot file [...]
|
|
#
|
|
# feed all "file" that exist to safe_eval
|
|
#
|
|
safe_dot() {
|
|
local ef= f
|
|
|
|
for f in "$@"
|
|
do
|
|
test -s $f || continue
|
|
ef="${ef:+$ef }$f"
|
|
dotted="$dotted $f"
|
|
done
|
|
test -z "$ef" && return 1
|
|
safe_eval $ef
|
|
return 0
|
|
}
|
|
|
|
case /$0 in
|
|
*/safe_eval*)
|
|
case "$1" in
|
|
dot|eval|set) op=safe_$1; shift; $op "$@";;
|
|
*) safe_dot "$@";;
|
|
esac
|
|
;;
|
|
esac
|