2020-11-24 15:12:10 +00:00
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
set -e
set -u
2020-12-03 19:14:34 +00:00
set -o pipefail
2020-11-24 15:12:10 +00:00
IMA_POLICY_FILE = "/sys/kernel/security/ima/policy"
TEST_BINARY = "/bin/true"
2020-12-11 01:07:11 +00:00
VERBOSE = " ${ SELFTESTS_VERBOSE : =0 } "
LOG_FILE = " $( mktemp /tmp/ima_setup.XXXX.log) "
2020-11-24 15:12:10 +00:00
usage( )
{
2022-03-02 12:14:03 +01:00
echo " Usage: $0 <setup|cleanup|run|modify-bin|restore-bin|load-policy> <existing_tmp_dir> "
2020-12-03 19:14:37 +00:00
exit 1
2020-11-24 15:12:10 +00:00
}
2020-12-03 19:14:35 +00:00
ensure_mount_securityfs( )
{
2020-12-03 19:14:37 +00:00
local securityfs_dir = $( grep "securityfs" /proc/mounts | awk '{print $2}' )
2020-12-03 19:14:35 +00:00
2020-12-03 19:14:37 +00:00
if [ -z " ${ securityfs_dir } " ] ; then
securityfs_dir = /sys/kernel/security
mount -t securityfs security " ${ securityfs_dir } "
fi
2020-12-03 19:14:35 +00:00
2020-12-03 19:14:37 +00:00
if [ ! -d " ${ securityfs_dir } " ] ; then
echo " ${ securityfs_dir } : securityfs is not mounted " && exit 1
fi
2020-12-03 19:14:35 +00:00
}
2020-11-24 15:12:10 +00:00
setup( )
{
2020-12-03 19:14:37 +00:00
local tmp_dir = " $1 "
local mount_img = " ${ tmp_dir } /test.img "
local mount_dir = " ${ tmp_dir } /mnt "
local copied_bin_path = " ${ mount_dir } / $( basename ${ TEST_BINARY } ) "
mkdir -p ${ mount_dir }
2020-11-24 15:12:10 +00:00
2020-12-03 19:14:37 +00:00
dd if = /dev/zero of = " ${ mount_img } " bs = 1M count = 10
2020-11-24 15:12:10 +00:00
2020-12-03 19:14:37 +00:00
losetup -f " ${ mount_img } "
local loop_device = $( losetup -a | grep ${ mount_img : ? } | cut -d ":" -f1)
2020-11-24 15:12:10 +00:00
2020-12-03 19:14:37 +00:00
mkfs.ext2 " ${ loop_device : ? } "
mount " ${ loop_device } " " ${ mount_dir } "
2020-11-24 15:12:10 +00:00
2020-12-03 19:14:37 +00:00
cp " ${ TEST_BINARY } " " ${ mount_dir } "
local mount_uuid = " $( blkid ${ loop_device } | sed 's/.*UUID="\([^"]*\)".*/\1/' ) "
2020-12-03 19:14:34 +00:00
2020-12-03 19:14:37 +00:00
ensure_mount_securityfs
echo " measure func=BPRM_CHECK fsuuid= ${ mount_uuid } " > ${ IMA_POLICY_FILE }
2022-03-02 12:14:03 +01:00
echo " measure func=BPRM_CHECK fsuuid= ${ mount_uuid } " > ${ mount_dir } /policy_test
2020-11-24 15:12:10 +00:00
}
cleanup( ) {
2020-12-03 19:14:37 +00:00
local tmp_dir = " $1 "
local mount_img = " ${ tmp_dir } /test.img "
local mount_dir = " ${ tmp_dir } /mnt "
2020-11-24 15:12:10 +00:00
2020-12-03 19:14:37 +00:00
local loop_devices = $( losetup -a | grep ${ mount_img : ? } | cut -d ":" -f1)
2020-12-03 19:14:34 +00:00
2020-12-03 19:14:37 +00:00
for loop_dev in " ${ loop_devices } " ; do
losetup -d $loop_dev
done
2020-11-24 15:12:10 +00:00
2020-12-03 19:14:37 +00:00
umount ${ mount_dir }
rm -rf ${ tmp_dir }
2020-11-24 15:12:10 +00:00
}
run( )
{
2020-12-03 19:14:37 +00:00
local tmp_dir = " $1 "
local mount_dir = " ${ tmp_dir } /mnt "
local copied_bin_path = " ${ mount_dir } / $( basename ${ TEST_BINARY } ) "
2020-11-24 15:12:10 +00:00
2020-12-03 19:14:37 +00:00
exec " ${ copied_bin_path } "
2020-11-24 15:12:10 +00:00
}
2022-03-02 12:14:01 +01:00
modify_bin( )
{
local tmp_dir = " $1 "
local mount_dir = " ${ tmp_dir } /mnt "
local copied_bin_path = " ${ mount_dir } / $( basename ${ TEST_BINARY } ) "
echo "mod" >> " ${ copied_bin_path } "
}
restore_bin( )
{
local tmp_dir = " $1 "
local mount_dir = " ${ tmp_dir } /mnt "
local copied_bin_path = " ${ mount_dir } / $( basename ${ TEST_BINARY } ) "
truncate -s -4 " ${ copied_bin_path } "
}
2022-03-02 12:14:03 +01:00
load_policy( )
{
local tmp_dir = " $1 "
local mount_dir = " ${ tmp_dir } /mnt "
echo ${ mount_dir } /policy_test > ${ IMA_POLICY_FILE } 2> /dev/null
}
2020-12-11 01:07:11 +00:00
catch( )
{
local exit_code = " $1 "
local log_file = " $2 "
if [ [ " ${ exit_code } " -ne 0 ] ] ; then
cat " ${ log_file } " >& 3
fi
rm -f " ${ log_file } "
exit ${ exit_code }
}
2020-11-24 15:12:10 +00:00
main( )
{
2020-12-03 19:14:37 +00:00
[ [ $# -ne 2 ] ] && usage
local action = " $1 "
local tmp_dir = " $2 "
[ [ ! -d " ${ tmp_dir } " ] ] && echo " Directory ${ tmp_dir } doesn't exist " && exit 1
if [ [ " ${ action } " = = "setup" ] ] ; then
setup " ${ tmp_dir } "
elif [ [ " ${ action } " = = "cleanup" ] ] ; then
cleanup " ${ tmp_dir } "
elif [ [ " ${ action } " = = "run" ] ] ; then
run " ${ tmp_dir } "
2022-03-02 12:14:01 +01:00
elif [ [ " ${ action } " = = "modify-bin" ] ] ; then
modify_bin " ${ tmp_dir } "
elif [ [ " ${ action } " = = "restore-bin" ] ] ; then
restore_bin " ${ tmp_dir } "
2022-03-02 12:14:03 +01:00
elif [ [ " ${ action } " = = "load-policy" ] ] ; then
load_policy " ${ tmp_dir } "
2020-12-03 19:14:37 +00:00
else
echo " Unknown action: ${ action } "
exit 1
fi
2020-11-24 15:12:10 +00:00
}
2020-12-11 01:07:11 +00:00
trap 'catch "$?" "${LOG_FILE}"' EXIT
if [ [ " ${ VERBOSE } " -eq 0 ] ] ; then
# Save the stderr to 3 so that we can output back to
# it incase of an error.
exec 3>& 2 1>" ${ LOG_FILE } " 2>& 1
fi
2020-11-24 15:12:10 +00:00
main " $@ "
2020-12-11 01:07:11 +00:00
rm -f " ${ LOG_FILE } "