Linux getaddrinfo()在initrd中失败。如何调试引导进程?

Linux getaddrinfo()在initrd中失败。如何调试引导进程?,linux,boot,libc,initrd,Linux,Boot,Libc,Initrd,我试图用一个像Anti-Evil Maid这样的自编版本来保护工作站的引导进程,但我无法让TPM守护进程运行。问题似乎是,只要连接的客户端触发.getaddrinfo()调用,TCSD就会失败。这意味着,程序启动,但在使用时立即退出 到目前为止,我试图通过strace确定TCSDs的先决条件,并将相关的文件和lib复制到initrd中,但到目前为止,我还没有超出这一点。不幸的是,我无法将init进程中的日志复制到这篇文章中,因为一旦根目录发生更改,所有文件都将消失,但我可以告诉您,我迄今为止所做

我试图用一个像Anti-Evil Maid这样的自编版本来保护工作站的引导进程,但我无法让TPM守护进程运行。问题似乎是,只要连接的客户端触发.getaddrinfo()调用,TCSD就会失败。这意味着,程序启动,但在使用时立即退出

到目前为止,我试图通过strace确定TCSDs的先决条件,并将相关的文件和lib复制到initrd中,但到目前为止,我还没有超出这一点。不幸的是,我无法将init进程中的日志复制到这篇文章中,因为一旦根目录发生更改,所有文件都将消失,但我可以告诉您,我迄今为止所做的尝试。我假设问题通常与glibc或bootprocess有关,但我不知道如何进一步调试它

让我们从我复制到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/
接下来,有一个简短的脚本版本,我想运行:

/etc/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_Unseldata尝试连接到TCSD时,TCSD进行getaddrinfo()调用,失败并退出。裤子/tpm工具包中的所有其他工具也是如此

老实说,我对引导过程的早期阶段不太了解,所以我可能看不到什么,但无法进一步调试。我们将非常感谢您的帮助