Path: blob/master/tools/testing/selftests/bpf/ima_setup.sh
26285 views
#!/bin/bash1# SPDX-License-Identifier: GPL-2.023set -e4set -u5set -o pipefail67IMA_POLICY_FILE="/sys/kernel/security/ima/policy"8TEST_BINARY="/bin/true"9VERBOSE="${SELFTESTS_VERBOSE:=0}"10LOG_FILE="$(mktemp /tmp/ima_setup.XXXX.log)"1112usage()13{14echo "Usage: $0 <setup|cleanup|run|modify-bin|restore-bin|load-policy> <existing_tmp_dir>"15exit 116}1718ensure_mount_securityfs()19{20local securityfs_dir=$(grep "securityfs" /proc/mounts | awk '{print $2}')2122if [ -z "${securityfs_dir}" ]; then23securityfs_dir=/sys/kernel/security24mount -t securityfs security "${securityfs_dir}"25fi2627if [ ! -d "${securityfs_dir}" ]; then28echo "${securityfs_dir}: securityfs is not mounted" && exit 129fi30}3132setup()33{34local tmp_dir="$1"35local mount_img="${tmp_dir}/test.img"36local mount_dir="${tmp_dir}/mnt"37local copied_bin_path="${mount_dir}/$(basename ${TEST_BINARY})"38mkdir -p ${mount_dir}3940dd if=/dev/zero of="${mount_img}" bs=1M count=104142losetup -f "${mount_img}"43local loop_device=$(losetup -a | grep ${mount_img:?} | cut -d ":" -f1)4445mkfs.ext2 "${loop_device:?}"46mount "${loop_device}" "${mount_dir}"4748cp "${TEST_BINARY}" "${mount_dir}"49local mount_uuid="$(blkid ${loop_device} | sed 's/.*UUID="\([^"]*\)".*/\1/')"5051ensure_mount_securityfs52echo "measure func=BPRM_CHECK fsuuid=${mount_uuid}" > ${IMA_POLICY_FILE}53echo "measure func=BPRM_CHECK fsuuid=${mount_uuid}" > ${mount_dir}/policy_test54}5556cleanup() {57local tmp_dir="$1"58local mount_img="${tmp_dir}/test.img"59local mount_dir="${tmp_dir}/mnt"6061local loop_devices=$(losetup -a | grep ${mount_img:?} | cut -d ":" -f1)6263for loop_dev in "${loop_devices}"; do64losetup -d $loop_dev65done6667umount ${mount_dir}68rm -rf ${tmp_dir}69}7071run()72{73local tmp_dir="$1"74local mount_dir="${tmp_dir}/mnt"75local copied_bin_path="${mount_dir}/$(basename ${TEST_BINARY})"7677exec "${copied_bin_path}"78}7980modify_bin()81{82local tmp_dir="$1"83local mount_dir="${tmp_dir}/mnt"84local copied_bin_path="${mount_dir}/$(basename ${TEST_BINARY})"8586echo "mod" >> "${copied_bin_path}"87}8889restore_bin()90{91local tmp_dir="$1"92local mount_dir="${tmp_dir}/mnt"93local copied_bin_path="${mount_dir}/$(basename ${TEST_BINARY})"9495truncate -s -4 "${copied_bin_path}"96}9798load_policy()99{100local tmp_dir="$1"101local mount_dir="${tmp_dir}/mnt"102103echo ${mount_dir}/policy_test > ${IMA_POLICY_FILE} 2> /dev/null104}105106catch()107{108local exit_code="$1"109local log_file="$2"110111if [[ "${exit_code}" -ne 0 ]]; then112cat "${log_file}" >&3113fi114115rm -f "${log_file}"116exit ${exit_code}117}118119main()120{121[[ $# -ne 2 ]] && usage122123local action="$1"124local tmp_dir="$2"125126[[ ! -d "${tmp_dir}" ]] && echo "Directory ${tmp_dir} doesn't exist" && exit 1127128if [[ "${action}" == "setup" ]]; then129setup "${tmp_dir}"130elif [[ "${action}" == "cleanup" ]]; then131cleanup "${tmp_dir}"132elif [[ "${action}" == "run" ]]; then133run "${tmp_dir}"134elif [[ "${action}" == "modify-bin" ]]; then135modify_bin "${tmp_dir}"136elif [[ "${action}" == "restore-bin" ]]; then137restore_bin "${tmp_dir}"138elif [[ "${action}" == "load-policy" ]]; then139load_policy "${tmp_dir}"140else141echo "Unknown action: ${action}"142exit 1143fi144}145146trap 'catch "$?" "${LOG_FILE}"' EXIT147148if [[ "${VERBOSE}" -eq 0 ]]; then149# Save the stderr to 3 so that we can output back to150# it incase of an error.151exec 3>&2 1>"${LOG_FILE}" 2>&1152fi153154main "$@"155rm -f "${LOG_FILE}"156157158