Skip to content

[bug]: Using a temporary key seems to break automatic TPM2 unlocking #335

Description

@SharkPlush

I'm not sure if I did something very wrong or this is a bug.

I ran:

sudo sdbootutil enroll --method=tpm2 --no-measure-pcr

Then I ran this code:

issue6() {
    set -e
    # Problem: Aeon should have 'tpm2-measure-pcr=yes' set in /etc/crypttab if using normal encryption mode
    # Solution: add tpm2-measure-pcr=yes if tpm2-device=auto is set
    if grep '^aeon_root' /etc/crypttab | grep -qF 'tpm2-device=auto'; then
	    # Default Mode detected, now search for missing config
	    if ! grep '^aeon_root' /etc/crypttab | grep -qF 'tpm2-measure-pcr=yes'; then
                echo 'issue6 detected  - tpm2-measure-pcr=yes not set - correcting'
                # We find the root device.
                rootdev=/dev/$(dmsetup deps -o devname /dev/mapper/aeon_root | cut -d '(' -f2 | cut -d ')' -f1)
                # We make a temporary key because when using PCR 15 for the first time a lUKS key is needed.
                keyfile=$(mktemp /tmp/aeon-check.XXXXXXXXXX)
                # I would use the same method tik uses to create a keyfile but sdbootutil doesn't like it
                head -c 1024 /dev/urandom | base64 > "$keyfile"
                chmod 400 ${keyfile}
                cryptsetup luksAddKey --token-only --batch-mode --new-key-slot=31 ${rootdev} ${keyfile}
                sed -i '/^aeon_root/ s/$/,tpm2-measure-pcr=yes/' /etc/crypttab
                sdbootutil update-predictions PW=$(< "$keyfile") --measure-pcr
                sdbootutil mkinitrd
                # Wipe the temporary LUKS key
                systemd-cryptenroll --wipe-slot=31 ${rootdev}
                rm ${keyfile}
                echo 'issue6 corrected'
	    fi
    fi
}

The output of this code was:

+ echo 'issue6 detected  - tpm2-measure-pcr=yes not set - correcting'
issue6 detected  - tpm2-measure-pcr=yes not set - correcting
++ dmsetup deps -o devname /dev/mapper/aeon_root
++ cut -d '(' -f2
++ cut -d ')' -f1
+ rootdev=/dev/nvme0n1p2
++ mktemp /tmp/aeon-check.XXXXXXXXXX
+ keyfile=/tmp/aeon-check.83ZautLLna
+ head -c 1024 /dev/urandom
+ base64
+ chmod 400 /tmp/aeon-check.83ZautLLna
+ cryptsetup luksAddKey --token-only --batch-mode --new-key-slot=31 /dev/nvme0n1p2 /tmp/aeon-check.83ZautLLna
+ sed -i '/^aeon_root/ s/$/,tpm2-measure-pcr=yes/' /etc/crypttab
+ sdbootutil update-predictions PW=4OdVxb9yp9YnSQMZ+qwdv1NUHqen2WCiOppL2U+2y6N0pZx7iOb6QLk8XVLN93gV1r3sbjEqN9Ij rbdfz0rwu8QnaGTvjAxM9XpKCBVmW6pp6vdi0XxeofDUBjpbaRdAx3ai1UJ7GsCLr18UjonE92T3 49vqDN6wF5QDXOjEv3l0Ko6rSL9NyE3rnubvWup04FjTgGj+CKD1bvqNJpkfqVGxs24G5L/B9ZsU R+XuUCfMgk2uZ6Z+8FAvegv0qzr9JjzNIy/h1EN3wuK30+Db6y5SeaWeiQMdSvNxO+SO+bj7aKWS ONZOgB52Itfi945Q2nHgX+2Du5/MvL9cXzb46v/5chh5UQUlwiHMnPjwmskvR1hN+3sYa+Hi4Hnx vwIfpeos2cKjsCrVQ5NyR6AXGYeRQ5F7B79Yn1OCEy2EefGhKDDOwyOlpgEoVfOpa23IbS9cOu9/ Ca8MzpSzcua1q5AGsL5oLIXfhztlXGka2UBh2IqIh3vGA+1EUetw9mx90WHYMuyEdzJ1BpJQH4Kw NlfXgZUCp03hvo+5FPgbExWIohauelKnBU0r2EHMtzwoKSsBBxqpDVtDdsjItmj6yF3nyK/cV0n+ IYx3C13SizrIlH+gRr2Ewa6Nl3NHCrAKxsBtgGmi8fvyhWGiOIIQoZTIKWHOrx2qZXRKf0+iwPWg fLRi6IKTlF2+566k7msUzLtBbOvizcQ9b1dOJoix29IpaTyS3sfbfDdC8fPDMJzr3SatxTWy9NSA 2uqd0oif2ViK2IQoJfjPMvyPWHHVm5LfMH3RdaZRN93ZSNtCm2R7mxQvmTdVn0lTh0SR3e3QVGkY VEhjuE4iK87oa6N1eRfBIVeXdhV4ROv96Jr6U5XWY91+1hYUvPcFMa2kFyehx73m/nECAy3wnVSI kjyQ3LuznWHIIGBS5jITDUzxSeeTjxnKJG1VDDzQCLLg2DAc4C3J99MAb8oj8UXPG2TUzuABblto EgNzXnItOl7MmD/XZSqrNW/xoqwxSG4hNw61smhYMfmnvHeziCvqaJcWGAMcMXYSiBkOhDr2i3zK J7a1UtaGN3fSLHq/QCGUdvJYltteXfKRFsiZMOWQXka7jJcPdDFoPZaCwK7h15A514OG/eGYkqz9 w7tQID/Zpw7HPNjSuwEaT0+aGmt5MEVJbqmgNk8PcqaN0wHyOrWacUnzyfBBPM7UsuoB3YHOVTrJ l8ita4uCQAomxD8RvAkJpcO6onG/BkN7WLTUftUtXUafBqmzYcudbV16oS9dP6SOIgeCLJgtpjTh rZGBD3DwCwrXgQ483FHaHZCIpRY2M6qYQVaAtrfyj0Qel7uytC5FWy2z3HYs3uqQWiyBIFdEMw== --measure-pcr
Garbage after device path end, ignoring.
Garbage after device path end, ignoring.
Garbage after device path end, ignoring.
Garbage after device path end, ignoring.
NVIndex policy created
+ sdbootutil mkinitrd
dracut-install: ERROR: installing 'grub2-editenv'
dracut[E]: FAILED: /usr/lib/dracut/dracut-install -D /var/tmp/dracut.dkmhQZh/initramfs -a date btrfs awk grub2-editenv
Garbage after device path end, ignoring.
Garbage after device path end, ignoring.
Garbage after device path end, ignoring.
Garbage after device path end, ignoring.
NVIndex policy created
+ systemd-cryptenroll --wipe-slot=31 /dev/nvme0n1p2
Wiped slot 31.
+ rm /tmp/aeon-check.83ZautLLna
+ echo 'issue6 corrected'
issue6 corrected
+ exec

Everything seems fine so I reboot and I get an error on boot "The validation of PCR 15 failed".

I add "measure-pcr-validator.ignore=yes" into my kernel cmdline, boot, enter the password.

From this point on no matter what I did (update predictions, clear TPM2, re-enroll), I'd always get that error on boot.

I managed to get rid of it by running:

sudo transactional-update dup --continue --non-interactive pkg in --force --recommends patterns-glibc-hwcaps-x86_64_v3

But my system doesn't auto unlock anymore, doesn't matter how much I try re-enrolling.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions