Skip to content

Commit 523649b

Browse files
authored
Merge pull request #1758 from tlaurion/improve_tpm_basic_instrospection
Improve TPM extend ops output in normal and DEBUG mode
2 parents b28c257 + 77d4be1 commit 523649b

File tree

9 files changed

+78
-38
lines changed

9 files changed

+78
-38
lines changed

boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config
1717
#export CONFIG_HAVE_GPG_KEY_BACKUP=y
1818

1919
#Enable DEBUG output
20-
export CONFIG_DEBUG_OUTPUT=y
21-
export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y
20+
#export CONFIG_DEBUG_OUTPUT=y
21+
#export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y
2222
#Enable TPM2 pcap output under /tmp
23-
export CONFIG_TPM2_CAPTURE_PCAP=y
23+
#export CONFIG_TPM2_CAPTURE_PCAP=y
2424

2525
#On-demand hardware support (modules.cpio)
2626
CONFIG_LINUX_USB=y

initrd/bin/cbfs-init

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,19 @@ cbfsfiles=`cbfs -t 50 -l 2>/dev/null | grep "^heads/initrd/"`
1515
for cbfsname in `echo $cbfsfiles`; do
1616
filename=${cbfsname:12}
1717
if [ ! -z "$filename" ]; then
18-
echo "Loading $filename from CBFS"
1918
mkdir -p `dirname $filename` \
2019
|| die "$filename: mkdir failed"
21-
cbfs -t 50 -r $cbfsname > "$filename" \
20+
echo "Extracting CBFS file $cbfsname into $filename"
21+
cbfs -t 50 $CBFS_ARG -r $cbfsname > "$filename" \
2222
|| die "$filename: cbfs file read failed"
2323
if [ "$CONFIG_TPM" = "y" ]; then
24-
TMPFILE=/tmp/cbfs.$$
25-
echo "$filename" > $TMPFILE
26-
cat $filename >> $TMPFILE
27-
DEBUG "Extending TPM PCR $CONFIG_PCR with $filename"
28-
tpmr extend -ix "$CONFIG_PCR" -if $TMPFILE \
24+
TRACE_FUNC
25+
echo "TPM: Extending PCR[$CONFIG_PCR] with $filename"
26+
# Measure both the filename and its content. This
27+
# ensures that renaming files or pivoting file content
28+
# will still affect the resulting PCR measurement.
29+
tpmr extend -ix "$CONFIG_PCR" -ic "$filename"
30+
tpmr extend -ix "$CONFIG_PCR" -if "$filename" \
2931
|| die "$filename: tpm extend failed"
3032
fi
3133
fi

initrd/bin/flash.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ flash_rom() {
4848
dd if=/tmp/pchstrp9.bin bs=1 count=4 seek=292 of=/tmp/${CONFIG_BOARD}.rom conv=notrunc >/dev/null 2>&1
4949
fi
5050

51-
warn "Do not power off computer. Updating firmware, this will take a few minutes..."
51+
warn "Do not power off computer. Updating firmware, this will take a few minutes"
5252
flashrom $CONFIG_FLASHROM_OPTIONS -w /tmp/${CONFIG_BOARD}.rom 2>&1 \
53-
|| die "$ROM: Flash failed"
53+
|| recovery "$ROM: Flash failed"
5454
fi
5555
}
5656

initrd/bin/kexec-insert-key

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ if ! kexec-unseal-key "$INITRD_DIR/secret.key"; then
6565
fi
6666

6767
# Override PCR 4 so that user can't read the key
68-
DEBUG "Extending TPM PCR 4 to prevent further secret unsealing"
68+
TRACE_FUNC
69+
echo "TPM: Extending PCR[4] to prevent any future secret unsealing"
6970
tpmr extend -ix 4 -ic generic ||
7071
die 'Unable to scramble PCR'
7172

initrd/bin/kexec-select-boot

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -384,9 +384,10 @@ while true; do
384384
if [ "$CONFIG_TPM" = "y" ]; then
385385
if [ ! -r "$TMP_KEY_DEVICES" ]; then
386386
# Extend PCR4 as soon as possible
387-
DEBUG "Extending TPM PCR 4 to prevent further secret unsealing"
387+
TRACE_FUNC
388+
DEBUG "TPM: Extending PCR[4] to prevent further secret unsealing"
388389
tpmr extend -ix 4 -ic generic ||
389-
die "Failed to extend PCR 4"
390+
die "Failed to extend TPM PCR[4]"
390391
fi
391392
fi
392393

initrd/bin/qubes-measure-luks

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ sha256sum /tmp/lukshdr-* >/tmp/luksDump.txt || die "Unable to hash LUKS headers"
1919
DEBUG "Removing /tmp/lukshdr-*"
2020
rm /tmp/lukshdr-*
2121

22-
DEBUG "Extending TPM PCR 6 with hash of LUKS headers from /tmp/luksDump.txt"
22+
TRACE_FUNC
23+
echo "TPM: Extending PCR[6] with hash of LUKS headers from /tmp/luksDump.txt"
2324
tpmr extend -ix 6 -if /tmp/luksDump.txt ||
2425
die "Unable to extend PCR"

initrd/bin/tpmr

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ else
2929
. /etc/config
3030
fi
3131

32-
TRACE_FUNC
3332

3433
# Busybox xxd lacks -r, and we get hex dumps from TPM1 commands. This converts
3534
# a hex dump to binary data using sed and printf
3635
hex2bin() {
36+
TRACE_FUNC
3737
sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf
3838
}
3939

@@ -43,6 +43,7 @@ hex2bin() {
4343
# as a file still chokes if the password begins with 'hex:', oddly tpm2-tools
4444
# accepts 'hex:' in the file content.)
4545
tpm2_password_hex() {
46+
TRACE_FUNC
4647
echo "hex:$(echo -n "$1" | xxd -p | tr -d ' \n')"
4748
}
4849

@@ -61,7 +62,7 @@ tpm2_pcrread() {
6162

6263
if [ -z "$APPEND" ]; then
6364
# Don't append - truncate file now so real command always
64-
# appends
65+
# overwrites
6566
true >"$file"
6667
fi
6768

@@ -79,7 +80,7 @@ tpm1_pcrread() {
7980

8081
if [ -z "$APPEND" ]; then
8182
# Don't append - truncate file now so real command always
82-
# appends
83+
# overwrites
8384
true >"$file"
8485
fi
8586

@@ -100,11 +101,12 @@ is_hash() {
100101

101102
# extend_pcr_state - extend a PCR state value with more hashes or raw data (which is hashed)
102103
# usage:
103-
# extend_pcr_state <alg> <initial_state> <files/hashes...>
104+
# extend_pcr_state <alg> <state> <files/hashes...>
104105
# alg - either 'sha1' or 'sha256' to specify algorithm
105-
# initial_state - a hash value setting the initial state
106+
# state - a hash value setting the initial state
106107
# files/hashes... - any number of files or hashes, state is extended once for each item
107108
extend_pcr_state() {
109+
TRACE_FUNC
108110
local alg="$1"
109111
local state="$2"
110112
local next extend
@@ -233,14 +235,20 @@ tpm2_extend() {
233235
while true; do
234236
case "$1" in
235237
-ix)
238+
# store index and shift so -ic and -if can be processed
236239
index="$2"
237240
shift 2
238241
;;
239242
-ic)
243+
string=$(echo -n "$2")
240244
hash="$(echo -n "$2" | sha256sum | cut -d' ' -f1)"
245+
TRACE_FUNC
246+
DEBUG "TPM: Will extend PCR[$index] with hash of string $string"
241247
shift 2
242248
;;
243249
-if)
250+
TRACE_FUNC
251+
DEBUG "TPM: Will extend PCR[$index] with hash of file content $2"
244252
hash="$(sha256sum "$2" | cut -d' ' -f1)"
245253
shift 2
246254
;;
@@ -250,7 +258,10 @@ tpm2_extend() {
250258
esac
251259
done
252260
tpm2 pcrextend "$index:sha256=$hash"
253-
DO_WITH_DEBUG tpm2 pcrread "sha256:$index"
261+
tpm2 pcrread "sha256:$index"
262+
263+
TRACE_FUNC
264+
DEBUG "TPM: Extended PCR[$index] with hash $hash"
254265
}
255266

256267
tpm2_counter_read() {
@@ -348,9 +359,9 @@ tpm2_startsession() {
348359
die "tpm2_flushcontext: unable to flush saved session"
349360
tpm2 readpublic -Q -c "$PRIMARY_HANDLE" -t "$PRIMARY_HANDLE_FILE"
350361
#TODO: do the right thing to not have to suppress "WARN: check public portion the tpmkey manually" see https://github.com/linuxboot/heads/pull/1630#issuecomment-2075120429
351-
tpm2 startauthsession -Q -c "$PRIMARY_HANDLE_FILE" --hmac-session -S "$ENC_SESSION_FILE" 2>&1 > /dev/null
362+
tpm2 startauthsession -Q -c "$PRIMARY_HANDLE_FILE" --hmac-session -S "$ENC_SESSION_FILE" > /dev/null 2>&1
352363
#TODO: do the right thing to not have to suppress "WARN: check public portion the tpmkey manually" see https://github.com/linuxboot/heads/pull/1630#issuecomment-2075120429
353-
tpm2 startauthsession -Q -c "$PRIMARY_HANDLE_FILE" --hmac-session -S "$DEC_SESSION_FILE" 2>&1 > /dev/null
364+
tpm2 startauthsession -Q -c "$PRIMARY_HANDLE_FILE" --hmac-session -S "$DEC_SESSION_FILE" > /dev/null 2>&1
354365
tpm2 sessionconfig -Q --disable-encrypt "$DEC_SESSION_FILE"
355366
}
356367

@@ -381,6 +392,7 @@ cleanup_shred() {
381392
# tpm2_destroy: Destroy a sealed file in the TPM. The mechanism differs by
382393
# TPM version - TPM2 evicts the file object, so it no longer exists.
383394
tpm2_destroy() {
395+
TRACE_FUNC
384396
index="$1" # Index of the sealed file
385397
size="$2" # Size of zeroes to overwrite for TPM1 (unused in TPM2)
386398

@@ -396,6 +408,7 @@ tpm2_destroy() {
396408
# TPM version - TPM1 overwrites the file with zeroes, since this can be done
397409
# without authorization. (Deletion requires authorization.)
398410
tpm1_destroy() {
411+
TRACE_FUNC
399412
index="$1" # Index of the sealed file
400413
size="$2" # Size of zeroes to overwrite for TPM1
401414

@@ -761,6 +774,21 @@ if [ "$CONFIG_TPM2_TOOLS" != "y" ]; then
761774
shift
762775
tpm1_destroy "$@"
763776
;;
777+
extend)
778+
#check if we extend with a hash or a file
779+
if [ "$4" = "-if" ]; then
780+
DEBUG "TPM: Will extend PCR[$3] hash content of file $5"
781+
hash="$(sha1sum "$5" | cut -d' ' -f1)"
782+
elif [ "$4" = "-ic" ]; then
783+
string=$(echo -n "$5")
784+
DEBUG "TPM: Will extend PCR[$3] with hash of filename $string"
785+
hash="$(echo -n "$5" | sha1sum | cut -d' ' -f1)"
786+
fi
787+
788+
TRACE_FUNC
789+
DEBUG "TPM: Extending PCR[$3] with hash $hash"
790+
DO_WITH_DEBUG exec tpm "$@"
791+
;;
764792
seal)
765793
shift
766794
tpm1_seal "$@"
@@ -799,6 +827,8 @@ calcfuturepcr)
799827
replay_pcr "sha256" "$@"
800828
;;
801829
extend)
830+
TRACE_FUNC
831+
DEBUG "TPM: Extending PCR[$2] with $4"
802832
tpm2_extend "$@"
803833
;;
804834
counter_read)

initrd/etc/ash_functions

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,8 @@ recovery() {
241241
DEBUG "Board $CONFIG_BOARD - version $(fw_version)"
242242

243243
if [ "$CONFIG_TPM" = "y" ]; then
244-
DEBUG "Extending TPM PCR 4 for recovery shell access"
244+
TRACE_FUNC
245+
echo "TPM: Extending PCR[4] to prevent any further secret unsealing"
245246
tpmr extend -ix 4 -ic recovery
246247
fi
247248

initrd/sbin/insmod

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ fi
2828
# Unify lsmod output to use - instead of _ for comparison
2929
module_name=$(basename "$MODULE" | sed 's/_/-/g' | sed 's/\.ko$//')
3030
if lsmod | sed 's/_/-/g' | grep -q "^$module_name\\b"; then
31-
DEBUG "$MODULE: already loaded"
31+
DEBUG "$MODULE: already loaded, skipping"
3232
exit 0
3333
fi
3434

@@ -39,18 +39,22 @@ if [ ! -r /sys/class/tpm/tpm0/pcrs -o ! -x /bin/tpm ]; then
3939
fi
4040

4141
if [ -z "$tpm_missing" ]; then
42-
DEBUG "Extending TPM PCR $MODULE_PCR with $MODULE prior of usage"
43-
tpmr extend -ix "$MODULE_PCR" -if "$MODULE" \
44-
|| die "$MODULE: tpm extend failed"
45-
fi
46-
47-
if [ ! -z "$*" -a -z "$tpm_missing" ]; then
48-
DEBUG "Extending TPM PCR $MODULE_PCR with $*"
49-
TMPFILE=/tmp/insmod.$$
50-
echo "$@" > $TMPFILE
51-
DEBUG "Extending TPM PCR $MODULE_PCR with $MODULE prior of usage"
52-
tpmr extend -ix "$MODULE_PCR" -if $TMPFILE \
53-
|| die "$MODULE: tpm extend on arguments failed"
42+
echo "TPM: Extending PCR[$MODULE_PCR] with $MODULE and parameters '$*' before loading"
43+
# Extend with the module parameters (even if they are empty) and the
44+
# module. Changing the parameters or the module content will result in a
45+
# different PCR measurement.
46+
if [ -n "$*" ]; then
47+
TRACE_FUNC
48+
DEBUG "Extending with module parameters and the module's content"
49+
tpmr extend -ix "$MODULE_PCR" -ic "$*"
50+
tpmr extend -ix "$MODULE_PCR" -if "$MODULE" \
51+
|| die "$MODULE: tpm extend failed"
52+
else
53+
TRACE_FUNC
54+
DEBUG "No module parameters, extending only with the module's content"
55+
tpmr extend -ix "$MODULE_PCR" -if "$MODULE" \
56+
|| die "$MODULE: tpm extend failed"
57+
fi
5458
fi
5559

5660
# Since we have replaced the real insmod, we must invoke

0 commit comments

Comments
 (0)