Сбой getaddrinfo() в домашнем initrd. Как мне отладить загрузочный процесс?

Я пытаюсь защитить загрузочный процесс моей рабочей станции с помощью написанной им версии чего-то вроде Anti-Evil-Maid, но я не могу запустить демон TPM. Похоже, проблема в том, что TCSD завершается ошибкой, как только вызывающий клиент запускает вызов.getaddrinfo(). Это означает, что программа запускается, но завершается сразу же после ее использования.

До сих пор я пытался определить предварительные условия TCSD с помощью strace и скопировал соответствующие файлы и библиотеки в initrd, но на данный момент я не вышел за рамки указанного пункта. К сожалению, я не могу скопировать логи из процесса init в этот пост, потому что все файлы исчезли, как только корень изменился, но я могу сказать вам, что я пробовал до сих пор. Я предполагаю, что проблема связана с glibc или с загрузочным процессом в целом, но я не знаю, как я мог бы отладить его дальше.

Давайте начнем с файлов, которые я скопировал в initramfs. Хук-скрипт выглядит следующим образом:

#!/bin/sh
# trousers TPM software

PREREQ=""

prereqs()
{
   echo "$PREREQ"
}

case $1 in
prereqs)
   prereqs
   exit 0
   ;;
esac

. /usr/share/initramfs-tools/hook-functions


# Here it begins

copy_exec /home/dev/build/aem/tpm_pcr_extend /bin
copy_exec /usr/bin/shasum /bin
copy_exec /usr/sbin/adduser /sbin
copy_exec /usr/bin/strace /bin
copy_exec /usr/bin/getent /bin

copy_exec /usr/sbin/tcsd /sbin
copy_exec /usr/bin/tpm_unsealdata /bin
copy_exec /usr/bin/tpm_sealdata /bin
copy_exec /usr/sbin/tpm_nvinfo /sbin
copy_exec /usr/sbin/tpm_nvread /sbin
copy_exec /usr/sbin/tpm_resetdalock /sbin
copy_exec /usr/sbin/tpm_selftest /sbin
copy_exec /usr/sbin/tpm_version /sbin
# copy_exec /etc/tcsd.conf /etc

copy_exec /usr/src/initrd/etc/passwd /etc
copy_exec /usr/src/initrd/etc/shadow /etc
copy_exec /usr/src/initrd/etc/group /etc
copy_exec /usr/src/initrd/etc/hosts /etc
copy_exec /usr/src/initrd/etc/hostname /etc
copy_exec /etc/host.conf /etc
copy_exec /etc/hosts /etc
copy_exec /etc/nsswitch.conf /etc
copy_exec /etc/services /etc

copy_modules_dir kernel/drivers/char/tpm

copy_exec /usr/lib/libopencryptoki.so.0 /lib
copy_exec /usr/lib/opencryptoki/stdll/* /lib/opencryptoki

copy_exec /usr/lib/x86_64-linux-gnu/libcrypto.a /lib
copy_exec /usr/lib/x86_64-linux-gnu/libcrypto.so /lib
copy_exec /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 /lib

copy_exec /usr/lib/x86_64-linux-gnu/libtspi.so /lib

copy_exec /usr/lib/x86_64-linux-gnu/libtpm_unseal.so /lib

copy_exec /lib/x86_64-linux-gnu/libdl-2.19.so /lib
copy_exec /lib/x86_64-linux-gnu/libdl.so.2 /lib

copy_exec /lib/x86_64-linux-gnu/libc.so.6 /lib
copy_exec /usr/lib/libdns.so.100 /lib
copy_exec /usr/lib/libbind9.so.90 /lib
copy_exec /lib/x86_64-linux-gnu/libresolv.so.2 /lib
copy_exec /usr/lib/x86_64-linux-gnu/libnss3.so /lib
copy_exec /usr/lib/x86_64-linux-gnu/libnss_compat.so /lib
copy_exec /usr/lib/x86_64-linux-gnu/libnss_dns.so /lib
copy_exec /usr/lib/x86_64-linux-gnu/libnss_files.so /lib
copy_exec /usr/lib/x86_64-linux-gnu/libnss_hesiod.so /lib
copy_exec /usr/lib/x86_64-linux-gnu/libnss_nis.so /lib
copy_exec /usr/lib/x86_64-linux-gnu/libnss_nisplus.so /lib
copy_exec /usr/lib/x86_64-linux-gnu/libnssutil3.so /lib

copy_exec /usr/lib/x86_64-linux-gnu/libssl.so /lib/
copy_exec /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 /lib/
copy_exec /usr/lib/x86_64-linux-gnu/libssl3.so /lib/
copy_exec /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/lib4758cca.so /lib/
copy_exec /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/libaep.so /lib/
copy_exec /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/libatalla.so /lib/
copy_exec /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/libcapi.so /lib/
copy_exec /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/libchil.so /lib/
copy_exec /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/libcswift.so /lib/
copy_exec /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/libgmp.so /lib/
copy_exec /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/libgost.so /lib/
copy_exec /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/libnuron.so /lib/
copy_exec /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/libpadlock.so /lib/
copy_exec /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/libsureware.so /lib/
copy_exec /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/libubsec.so /lib/

Далее есть сокращенная версия скрипта, которую я хотел бы запустить:

/ и т.д. /initramfs-инструменты / скрипты / местный топ / брюки

#!/bin/sh
PREREQ="lvm2"
prereqs()
{
     echo "$PREREQ"
}

case $1 in
prereqs)
     prereqs
     exit 0
     ;;
esac

. /scripts/functions

# Begin real processing below this line

UNSEALED_SECRET="/tmp/aem/unsealed_secret"
SEALED_SECRET="/mnt/sealed_secret"
TCSD_EXE="/sbin/tcsd"
TCSD_PATH="/var/lib/tpm"
BOOT_PARTITION="/dev/mapper/linux-boot"
TPM_UNSEAL="/bin/tpm_unsealdata"

# Necessary to get the lvm files in /dev/mapper/
udevadm trigger
udevadm settle
vgchange -a y

# test, whether the relevant stuff is there
if [ ! -x $TCSD_EXE ]; then
    echo "TCSD executable not found"
fi

if [ ! -e $BOOT_PARTITION ]; then
    echo "Boot Partition not found"
fi

if [ ! -x $TPM_UNSEAL ]; then
    echo "TPM Unseal not found"
fi

mkdir -p /tmp/aem
touch $UNSEALED_SECRET
if [ ! -e $UNSEALED_SECRET ]; then
    echo "Unsealed Secret File could not be written"
fi

# mount boot volume into /mnt
mkdir /mnt
mount $BOOT_PARTITION /mnt
if [ ! -e $SEALED_SECRET ]; then
    echo "Sealed Secret File not found"
fi


echo "Starting TCSD"

# /etc/passwd is overwritten by mkinitramfs, but TCSD needs the user tss
echo "tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin" >> /etc/passwd

# basic network configuration. I'm not sure, if it's allright
echo "domain localhost" > /etc/resolv.conf
echo "127.0.0.1 localhost" > /etc/hosts
echo "multi on" > /etc/host.conf
echo "order hosts" >> /etc/hosts.conf

# make sure, the libs are in the searchpath
PATS=$PATH:/lib
PATH=$PATH:/usr/lib
PATH=$PATH:/usr/lib/x86_64-linux-gnu
PATH=$PATH:/usr/lib/opencryptoki
PATH=$PATH:/lib/x86_64-linux-gnu
PATH=$PATH:/lib64

# fixes an old bug in dynamically linked binaries, but is probably useless nowadays
export LD_LIBRARY_PATH="/lib64:/usr/lib:/usr/lib/x86_64-linux-gnu:/usr/lib/opencryptoki:/lib/x86_64-linux-gnu"

# import TPM modules
modprobe tpm
modprobe tpm_tis interrupt=0 force=1
modprobe tpm_i2c_stm_st33

# set up loopback network
ip link set dev lo up
ip route add 127.0.0.1 dev lo

# create /var/lib/tpm which TCSD wants
mkdir -p $TCSD_PATH
chmod 700 $TCSD_PATH
chown tss:tss $TCSD_PATH

# start tcsd with the default settings. 
tcsd || panic "TCSD failed"

# try to decrypt a sealed file:
echo "Unsealing Secret"
echo "Starting Unseal"
mkdir -p /tmp/aem
chmod ugo=rwx /tmp/aem

# Here it fails:

tpm_unsealdata -i $SEALED_SECRET -o $UNSEALED_SECRET

echo ""
echo "-----------"
echo "File: $UNSEALED_SECRET"
cat $UNSEALED_SECRET
echo "-----------"
echo ""


echo "starting shell"
sh

echo "Cleaning up"
killall tcsd
rm -f /tmp/aem
umount /mnt

Так. Вот и все. Когда tpm_unsealdata пытается подключиться к TCSD, TCSD выполняет вызов getaddrinfo (), завершается ошибкой и завершается. То же самое верно для всех других инструментов из пакета брюк /tpm-tools.

Честно говоря, я не слишком много знаю об этой ранней стадии загрузочного процесса, поэтому я, вероятно, ничего не вижу, но не могу отлаживать это дальше. Некоторая помощь будет принята с благодарностью.

0 ответов

Другие вопросы по тегам