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