test: add some security checks.
This commit is contained in:
parent
fff0df39ba
commit
f579940ae7
1 changed files with 78 additions and 3 deletions
|
|
@ -12,7 +12,7 @@ RES=$(mktemp)
|
||||||
echo "false" >"$RES"
|
echo "false" >"$RES"
|
||||||
MAX_JOBS=$(nproc)
|
MAX_JOBS=$(nproc)
|
||||||
declare WITH_CHECK
|
declare WITH_CHECK
|
||||||
readonly MAX_JOBS APPARMORD="apparmor.d"
|
readonly RES MAX_JOBS APPARMORD="apparmor.d"
|
||||||
readonly reset="\033[0m" fgRed="\033[0;31m" fgYellow="\033[0;33m" fgWhite="\033[0;37m" BgWhite="\033[1;37m"
|
readonly reset="\033[0m" fgRed="\033[0;31m" fgYellow="\033[0;33m" fgWhite="\033[0;37m" BgWhite="\033[1;37m"
|
||||||
_msg() { printf '%b%s%b\n' "$BgWhite" "$*" "$reset"; }
|
_msg() { printf '%b%s%b\n' "$BgWhite" "$*" "$reset"; }
|
||||||
_warn() {
|
_warn() {
|
||||||
|
|
@ -58,6 +58,12 @@ _check() {
|
||||||
while IFS= read -r line; do
|
while IFS= read -r line; do
|
||||||
line_number=$((line_number + 1))
|
line_number=$((line_number + 1))
|
||||||
|
|
||||||
|
# Rules checks
|
||||||
|
_check_abstractions
|
||||||
|
_check_directory_mark
|
||||||
|
_check_equivalent
|
||||||
|
_check_too_wide
|
||||||
|
|
||||||
# Guidelines check
|
# Guidelines check
|
||||||
_check_abi
|
_check_abi
|
||||||
_check_include
|
_check_include
|
||||||
|
|
@ -84,13 +90,82 @@ _check() {
|
||||||
_res_vim
|
_res_vim
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Rules checks: security, compatibility and rule issues
|
||||||
|
|
||||||
|
readonly ABS="abstractions"
|
||||||
|
readonly ABS_DANGEROUS=(dbus-session dbus-system dbus-accessibility user-tmp)
|
||||||
|
declare -A ABS_DEPRECATED=(
|
||||||
|
["nameservice"]="nameservice-strict"
|
||||||
|
["bash"]="shell"
|
||||||
|
["X"]="X-strict"
|
||||||
|
["dbus-accessibility-strict"]="bus-accessibility"
|
||||||
|
["dbus-network-manager-strict"]="bus/org.freedesktop.NetworkManager"
|
||||||
|
["dbus-session-strict"]="bus-session"
|
||||||
|
["dbus-system-strict"]="bus-system"
|
||||||
|
)
|
||||||
|
_check_abstractions() {
|
||||||
|
_is_enabled abstractions || return 0
|
||||||
|
|
||||||
|
local absname
|
||||||
|
for absname in "${ABS_DANGEROUS[@]}"; do
|
||||||
|
if [[ "$line" == *"<$ABS/$absname>"* ]]; then
|
||||||
|
_err security "$file:$line_number" "dangerous abstraction '<$ABS/$absname>'"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
for absname in "${!ABS_DEPRECATED[@]}"; do
|
||||||
|
if [[ "$line" == *"<$ABS/$absname>"* ]]; then
|
||||||
|
_err security "$file:$line_number" "deprecated abstraction '<$ABS/$absname>', use '<$ABS/${ABS_DEPRECATED[$absname]}>' instead"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
readonly DIRECTORIES=('@{HOME}' '@{MOUNTS}' '@{bin}' '@{sbin}' '@{lib}' '@{tmp}' '_dirs}' '_DIR}')
|
||||||
|
_check_directory_mark() {
|
||||||
|
_is_enabled directory_mark || return 0
|
||||||
|
for pattern in "${DIRECTORIES[@]}"; do
|
||||||
|
if [[ "$line" == *"$pattern"* ]]; then
|
||||||
|
[[ "$line" == *'='* ]] && continue
|
||||||
|
if [[ ! "$line" == *"$pattern/"* ]]; then
|
||||||
|
_err issue "$file:$line_number" "missing directory mark: '$pattern' instead of '$pattern/'"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
declare -A EQUIVALENTS=(
|
||||||
|
["awk"]="{m,g,}awk"
|
||||||
|
["grep"]="{,e}grep"
|
||||||
|
["which"]="which{,.debianutils}"
|
||||||
|
)
|
||||||
|
_check_equivalent() {
|
||||||
|
_is_enabled equivalent || return 0
|
||||||
|
local prgmname
|
||||||
|
for prgmname in "${!EQUIVALENTS[@]}"; do
|
||||||
|
if [[ "$line" == *"/$prgmname"* ]]; then
|
||||||
|
if [[ ! "$line" == *"${EQUIVALENTS[$prgmname]}"* ]]; then
|
||||||
|
_err compatibility "$file:$line_number" "missing equivalent program: '@{bin}/$prgmname' instead of '@{bin}/${EQUIVALENTS[$prgmname]}'"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
readonly TOOWIDE=('/**' '/tmp/**' '/var/tmp/**' '@{tmp}/**' '/etc/**' '/dev/shm/**' '@{run}/user/@{uid}/**')
|
||||||
|
_check_too_wide() {
|
||||||
|
_is_enabled too_wide || return 0
|
||||||
|
for pattern in "${TOOWIDE[@]}"; do
|
||||||
|
if [[ "$line" == *" $pattern "* ]]; then
|
||||||
|
_err security "$file:$line_number" "rule too wide: '$pattern'"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
# Guidelines check: https://apparmor.pujol.io/development/guidelines/
|
# Guidelines check: https://apparmor.pujol.io/development/guidelines/
|
||||||
|
|
||||||
RES_ABI=false
|
RES_ABI=false
|
||||||
readonly ABI_SYNTAX='abi <abi/4.0>,'
|
readonly ABI_SYNTAX='abi <abi/4.0>,'
|
||||||
_check_abi() {
|
_check_abi() {
|
||||||
_is_enabled abi || return 0
|
_is_enabled abi || return 0
|
||||||
if [[ "$line" =~ ^' '*"$ABI_SYNTAX" ]]; then
|
if [[ "$line" == *"$ABI_SYNTAX" ]]; then
|
||||||
RES_ABI=true
|
RES_ABI=true
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
@ -104,7 +179,7 @@ _res_abi() {
|
||||||
RES_INCLUDE=false
|
RES_INCLUDE=false
|
||||||
_check_include() {
|
_check_include() {
|
||||||
_is_enabled include || return 0
|
_is_enabled include || return 0
|
||||||
if [[ "$line" =~ ^.*"${include}"$ ]]; then
|
if [[ "$line" == *"${include}"* ]]; then
|
||||||
RES_INCLUDE=true
|
RES_INCLUDE=true
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue