#!/bin/sh # Copyright (c) 2009 IBM Corporation # Copyright (c) 2018 Petr Vorel <pvorel@suse.cz> # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # This program is distributed in the hope that it would be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # # Author: Mimi Zohar, zohar@ibm.vnet.ibm.com # # Test replacing the default integrity measurement policy. TST_SETUP="setup" TST_CNT=2 . ima_setup.sh check_policy_writable() { local err="IMA policy already loaded and kernel not configured to enable multiple writes to it (need CONFIG_IMA_WRITE_POLICY=y)" [ -f /sys/kernel/security/ima/policy ] || tst_brk TCONF "$err" # CONFIG_IMA_READ_POLICY echo "" 2> log > $IMA_POLICY grep -q "Device or resource busy" log && tst_brk TCONF "$err" } setup() { IMA_POLICY="$IMA_DIR/policy" check_policy_writable VALID_POLICY="$TST_DATAROOT/measure.policy" [ -f $VALID_POLICY ] || tst_brk TCONF "missing $VALID_POLICY" INVALID_POLICY="$TST_DATAROOT/measure.policy-invalid" [ -f $INVALID_POLICY ] || tst_brk TCONF "missing $INVALID_POLICY" } load_policy() { local ret exec 2>/dev/null 4>$IMA_POLICY [ $? -eq 0 ] || exit 1 cat $1 >&4 2> /dev/null ret=$? exec 4>&- [ $ret -eq 0 ] && \ tst_res TINFO "IMA policy updated, please reboot after testing to restore settings" return $ret } test1() { tst_res TINFO "verify that invalid policy isn't loaded" local p1 check_policy_writable load_policy $INVALID_POLICY & p1=$! wait "$p1" if [ $? -ne 0 ]; then tst_res TPASS "didn't load invalid policy" else tst_res TFAIL "loaded invalid policy" fi } test2() { tst_res TINFO "verify that policy file is not opened concurrently and able to loaded multiple times" local p1 p2 rc1 rc2 check_policy_writable load_policy $VALID_POLICY & p1=$! load_policy $VALID_POLICY & p2=$! wait "$p1"; rc1=$? wait "$p2"; rc2=$? if [ $rc1 -eq 0 ] && [ $rc2 -eq 0 ]; then tst_res TFAIL "policy opened concurrently" elif [ $rc1 -eq 0 ] || [ $rc2 -eq 0 ]; then tst_res TPASS "policy was loaded just by one process and able to loaded multiple times" else tst_res TFAIL "problem loading or extending policy (may require policy to be signed)" fi } tst_run