brintos

brintos / linux-shallow public Read only

0
0
Text · 5.2 KiB · 641ef05 Raw
220 lines · bash
1#!/bin/sh2# SPDX-License-Identifier: GPL-2.03#4# Kselftest framework defines: ksft_pass=0, ksft_fail=1, ksft_skip=45 6VERBOSE="${VERBOSE:-1}"7IKCONFIG="/tmp/config-`uname -r`"8KERNEL_IMAGE="/boot/vmlinuz-`uname -r`"9SECURITYFS=$(grep "securityfs" /proc/mounts | awk '{print $2}')10 11log_info()12{13	[ $VERBOSE -ne 0 ] && echo "[INFO] $1"14}15 16# The ksefltest framework requirement returns 0 for PASS.17log_pass()18{19	[ $VERBOSE -ne 0 ] && echo "$1 [PASS]"20	exit 021}22 23# The ksefltest framework requirement returns 1 for FAIL.24log_fail()25{26	[ $VERBOSE -ne 0 ] && echo "$1 [FAIL]"27	exit 128}29 30# The ksefltest framework requirement returns 4 for SKIP.31log_skip()32{33	[ $VERBOSE -ne 0 ] && echo "$1"34	exit 435}36 37# Check efivar SecureBoot-$(the UUID) and SetupMode-$(the UUID).38# (Based on kdump-lib.sh)39get_efivarfs_secureboot_mode()40{41	local efivarfs="/sys/firmware/efi/efivars"42	local secure_boot_file=""43	local setup_mode_file=""44	local secureboot_mode=045	local setup_mode=046 47	# Make sure that efivar_fs is mounted in the normal location48	if ! grep -q "^\S\+ $efivarfs efivarfs" /proc/mounts; then49		log_info "efivars is not mounted on $efivarfs"50		return 0;51	fi52	secure_boot_file=$(find "$efivarfs" -name SecureBoot-* 2>/dev/null)53	setup_mode_file=$(find "$efivarfs" -name SetupMode-* 2>/dev/null)54	if [ -f "$secure_boot_file" ] && [ -f "$setup_mode_file" ]; then55		secureboot_mode=$(hexdump -v -e '/1 "%d\ "' \56			"$secure_boot_file"|cut -d' ' -f 5)57		setup_mode=$(hexdump -v -e '/1 "%d\ "' \58			"$setup_mode_file"|cut -d' ' -f 5)59 60		if [ $secureboot_mode -eq 1 ] && [ $setup_mode -eq 0 ]; then61			log_info "secure boot mode enabled (CONFIG_EFIVAR_FS)"62			return 1;63		fi64	fi65	return 0;66}67 68# On powerpc platform, check device-tree property69# /proc/device-tree/ibm,secureboot/os-secureboot-enforcing70# to detect secureboot state.71get_ppc64_secureboot_mode()72{73	local secure_boot_file="/proc/device-tree/ibm,secureboot/os-secureboot-enforcing"74	# Check for secure boot file existence75	if [ -f $secure_boot_file ]; then76		log_info "Secureboot is enabled (Device tree)"77		return 1;78	fi79	log_info "Secureboot is not enabled (Device tree)"80	return 0;81}82 83# Return the architecture of the system84get_arch()85{86	echo $(arch)87}88 89# Check efivar SecureBoot-$(the UUID) and SetupMode-$(the UUID).90# The secure boot mode can be accessed as the last integer of91# "od -An -t u1 /sys/firmware/efi/efivars/SecureBoot-*".  The efi92# SetupMode can be similarly accessed.93# Return 1 for SecureBoot mode enabled and SetupMode mode disabled.94get_secureboot_mode()95{96	local secureboot_mode=097	local system_arch=$(get_arch)98 99	if [ "$system_arch" == "ppc64le" ]; then100		get_ppc64_secureboot_mode101		secureboot_mode=$?102	else103		get_efivarfs_secureboot_mode104		secureboot_mode=$?105	fi106 107	if [ $secureboot_mode -eq 0 ]; then108		log_info "secure boot mode not enabled"109	fi110	return $secureboot_mode;111}112 113require_root_privileges()114{115	if [ $(id -ru) -ne 0 ]; then116		log_skip "requires root privileges"117	fi118}119 120# Look for config option in Kconfig file.121# Return 1 for found and 0 for not found.122kconfig_enabled()123{124	local config="$1"125	local msg="$2"126 127	grep -E -q $config $IKCONFIG128	if [ $? -eq 0 ]; then129		log_info "$msg"130		return 1131	fi132	return 0133}134 135# Attempt to get the kernel config first by checking the modules directory136# then via proc, and finally by extracting it from the kernel image or the137# configs.ko using scripts/extract-ikconfig.138# Return 1 for found.139get_kconfig()140{141	local proc_config="/proc/config.gz"142	local module_dir="/lib/modules/`uname -r`"143	local configs_module="$module_dir/kernel/kernel/configs.ko*"144 145	if [ -f $module_dir/config ]; then146		IKCONFIG=$module_dir/config147		return 1148	fi149 150	if [ ! -f $proc_config ]; then151		modprobe configs > /dev/null 2>&1152	fi153	if [ -f $proc_config ]; then154		cat $proc_config | gunzip > $IKCONFIG 2>/dev/null155		if [ $? -eq 0 ]; then156			return 1157		fi158	fi159 160	local extract_ikconfig="$module_dir/source/scripts/extract-ikconfig"161	if [ ! -f $extract_ikconfig ]; then162		log_skip "extract-ikconfig not found"163	fi164 165	$extract_ikconfig $KERNEL_IMAGE > $IKCONFIG 2>/dev/null166	if [ $? -eq 1 ]; then167		if [ ! -f $configs_module ]; then168			log_skip "CONFIG_IKCONFIG not enabled"169		fi170		$extract_ikconfig $configs_module > $IKCONFIG171		if [ $? -eq 1 ]; then172			log_skip "CONFIG_IKCONFIG not enabled"173		fi174	fi175	return 1176}177 178# Make sure that securityfs is mounted179mount_securityfs()180{181	if [ -z $SECURITYFS ]; then182		SECURITYFS=/sys/kernel/security183		mount -t securityfs security $SECURITYFS184	fi185 186	if [ ! -d "$SECURITYFS" ]; then187		log_fail "$SECURITYFS :securityfs is not mounted"188	fi189}190 191# The policy rule format is an "action" followed by key-value pairs.  This192# function supports up to two key-value pairs, in any order.193# For example: action func=<keyword> [appraise_type=<type>]194# Return 1 for found and 0 for not found.195check_ima_policy()196{197	local action="$1"198	local keypair1="$2"199	local keypair2="$3"200	local ret=0201 202	mount_securityfs203 204	local ima_policy=$SECURITYFS/ima/policy205	if [ ! -e $ima_policy ]; then206		log_fail "$ima_policy not found"207	fi208 209	if [ -n $keypair2 ]; then210		grep -e "^$action.*$keypair1" "$ima_policy" | \211			grep -q -e "$keypair2"212	else213		grep -q -e "^$action.*$keypair1" "$ima_policy"214	fi215 216	# invert "grep -q" result, returning 1 for found.217	[ $? -eq 0 ] && ret=1218	return $ret219}220