Назад | Перейти на главную страницу

Ошибка регрессионного теста SELinux

Я клонировал регрессионные тесты selinux-testsuite из: https://github.com/SELinuxProject/selinux-testsuite

Я запускаю тесты на виртуальной машине CentOS Linux версии 7.6.1810 (Core). Что я не считаю актуальным.

SELinux применяет целевую политику перед установкой временных тестовых политик, используя:

make -C policy load

Сестатус говорит

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

Я считаю, что точно выполнил инструкции по запуску набора тестов. Однако когда я запускаю его, я вижу единственную ошибку:

[snipped OK messages]

bounds/test ................. ok     
nnp_nosuid/test ............. ok     
mmap/test ................... 1/47 # Failed test 27 in mmap/test at line 143
#  mmap/test line 143 is:     ok($result);
mmap/test ................... Failed 1/47 subtests 
unix_socket/test ............ ok   
inet_socket/test ............ ok     

[more snipped OK messages]

Test Summary Report
-------------------
mmap/test                 (Wstat: 0 Tests: 47 Failed: 1)
  Failed test:  27
Files=51, Tests=520, 35 wallclock secs ( 0.11 usr  0.04 sys +  0.77 cusr  0.94 csys =  1.86 CPU)
Result: FAIL
Failed 1/51 test programs. 1/520 subtests failed.

Я выделил проблемный тест из тестовой группы mmap, чтобы:

#!/bin/bash

basedir=$(pwd)/tests/mmap

if [ ! -d $basedir ]; then
    printf "Error: missing basedir: $basedir\n"
    exit 1
fi

# Clean up from prior runs.
rm -f $basedir/temp_file

# Create temporary file.
dd if=/dev/zero of=$basedir/temp_file count=8 2>&1 > /dev/null
printf "\ncreate: OK\n"
chcon -t test_mmap_file_t $basedir/temp_file
printf "\nchcon: OK\n"

if [ ! -f $basedir/mmap_file_shared ]; then
    printf "Error - missing executable: $basedir/mmap_file_shared\n"
    exit 1
fi

if [ ! -f $basedir/temp_file ]; then
    printf "Error - missing temp file: $basedir/temp_file\n"
    exit 1
fi

/bin/runcon -t test_no_map_t -- $basedir/mmap_file_shared $basedir/temp_file

Что генерирует сообщение AVC в /var/log/audit/audit.log:

type=AVC msg=audit(1556563573.950:2466): avc:  denied  { search } for  pid=16708 comm="mmap_file_share" name="vagrant" dev="dm-0" ino=81922 scontext=unconfined_u:unconfined_r:test_no_map_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:user_home_dir_t:s0 tclass=dir permissive=0

Я не совсем уверен, предназначен ли этот AVC (как отрицательный тест) набором тестов. Но хотелось бы понять этот провал.

Чтобы замкнуть цикл, ответ дал Ондрей Мосначек из списка рассылки selinux:

Quoth Ondrej:

В RHEL и CentOS 7.6 для логического значения SELinux domain_can_mmap_files по умолчанию установлено значение «on». [1], что в основном означает, что разрешения карты не проверяются, что логически приводит к сбою теста, который проверяет, что разрешение карты отклонено, когда оно не разрешено политикой тестирования. При запуске набора тестов в CentOS / RHEL 7.6 вам необходимо отключить логическое значение domain_can_mmap_files во время выполнения теста.

Чтобы решить эту проблему, я сделал:

# Get the original value of the bool
export OLD_MMAP_BOOL=$(getsebool domain_can_mmap_files | awk '{ print $3 }')
# Disable it
sudo setsebool domain_can_mmap_files off
# Run the test suite
make -C tests test
# Restore the previous state
sudo OLD_MMAP_BOOL=$OLD_MMAP_BOOL setsebool domain_can_mmap_files $OLD_MMAP_BOOL