Hi

On Wed, Dec 16, 2020 at 11:45 PM Michael Weiser <mich...@weiser.dinsnail.net>
wrote:

> Hello Marc-Andre,
>
> thanks for getting back to me so quickly.
>
> On Wed, Dec 16, 2020 at 07:44:40PM +0400, Marc-André Lureau wrote:
>
> > > IIRC I needed to activate swtpm in TIS and version 1.2 mode by trial
> and
> > > error because that was the only combo that worked for Bitlocker. The
> > Afaik, TPM 2.0 + CRB should be working. Which exact version of Windows is
> > it? Did you make any upgrade?
>
> No, the only change is in the qemu version used. I tried to add --tpm2
> to the swtpm call and switch from tpm-tis to tpm-crb. Both send 5.1.0
> into the Bitlocker recovery screen as well. Even if Bitlocker were to
>

Oh I meant when you setup the VM for the first time. You can't migrate from
vTPM 1.2 to 2.0 indeed.


> work with those, it's likely that the TPM can't just be switched over
> but would need migration to retain its state so that Bitlocker would
> continue to work. Also, I would like to keep the impact on the
> productive VM in question to a minimum because it's quite a fickle
> thing. And it *is* working with TIS and 1.2 on qemu 5.1.0 right now.
>
> I see the problem with Windows 10 1909 (productive VM) and 20H2
> (reproducer VM).
>
> > > The following exact same commands have the machine booting when using
> > > qemu 5.1.0 and end up in the Bitlocker recovery screen when using 5.2.0
> > > or git HEAD:
> > >
> > > /usr/bin/swtpm socket
> > > --ctrl type=unixio,path=11-win10-bitlocker-swtpm.sock,mode=0600
> > > --tpmstate dir=bf566263-35e3-4dba-af8c-8ca85dba6a85/tpm1.2,mode=0600
> > >
> > > qemu-system-x86_64 -machine pc-q35-5.1 -m 4096
> > > -uuid bf566263-35e3-4dba-af8c-8ca85dba6a85 -no-user-config
> > > -blockdev
> > >
> '{"driver":"file","filename":"win10-bitlocker.qcow2","node-name":"libvirt-2-storage","auto-read-only":true,"discard":"unmap"}'
> > > -blockdev
> > >
> '{"node-name":"libvirt-2-format","read-only":false,"driver":"qcow2","file":"libvirt-2-storage","backing":null}'
> > > -device
> ide-hd,bus=ide.0,drive=libvirt-2-format,id=sata0-0-0,bootindex=1
> > > -tpmdev emulator,id=tpm-tpm0,chardev=chrtpm
> > > -chardev socket,id=chrtpm,path=11-win10-bitlocker-swtpm.sock
> > > -device tpm-tis,tpmdev=tpm-tpm0,id=tpm0
> The above command is missing a -vga qxl which seems to be required to
> make Bitlocker reliably not go to recovery. It seems, it sometimes
> accepts the video subsystem change to std until some other change
>

Yes, measured boot may be done at different stage, with different
depth/policies I suppose.

happens. Yay. Here's an even shorter reproducer command that now seems
> to reliably work for 5.1.0 but not for 5.2.0:
>
> qemu-system-x86_64 -machine pc-q35-5.1 -m 4096
> -uuid bf566263-35e3-4dba-af8c-8ca85dba6a85 -drive
> file=win10-bitlocker.qcow2
> -tpmdev emulator,id=tpm-tpm0,chardev=chrtpm
> -chardev socket,id=chrtpm,path=11-win10-bitlocker-swtpm.sock
> -device tpm-tis,tpmdev=tpm-tpm0,id=tpm0 -vga qxl
>
> > You have made great work in reporting the issue, would you be kind enough
> > to do a git bisect ? That would be of great help!
>
> I had tried already (and just now retried) but ran into problems
> getting qemu to build after the third or fourth step. I gave up on git
> bisect skip after the fifth or sixth try. It seems the switch to meson
> left some amount of intermediate commits not building. Would that a fair
> assessment or am I doing something wrong?
>

It would be quite unfortunate, we did a lot of effort to avoid intermediate
breakage (from clean tree). But it's highly possible.

>
> cd qemu
> git bisect start v5.2.0 v5.1.0
> ./configure --target-list=x86_64-softmmu
> make # (paralel build is broken as well)
> build/qemu-system-x86_64 -machine pc-q35-5.1 -m 4096 ...
> git bisect bad
> git submodule update
>

you shouldn't have to do the submodule update, it's part of the qemu build
system.

git clean -id
> ./configure --target-list=x86_64-softmmu
> make
> build/qemu-system-x86_64 -machine pc-q35-5.1 -m 4096 ...
>
> ... and so on ...
>

Looks good to me


> (I tried an explicit out-of-source build first but that broke down some
> steps into the bisect as well.)
>
>
If the change is only related to build-sys, git bisect skip is your friend.
please hold-on :)

> (not much happened in hw/tpm tree between 5.1 and 5.2 that can easily
> > explain this regression)
>
> I have no idea how Bitlocker works but I have a feeling the TPM might
> not be the (only) culprit here. The qxl vs. std hardware change
> heuristic above seems to suggest that some amount of hardware change is
> acceptable to Bitlocker when relying on just the TPM for boot. For more
> extensive changes it seems to want additional authentication using
> recovery keys entered by the user even with a working TPM before
> reinstating the TPM-only boot (e.g. the uuid changing).
>
> That's what prompted my initial question if there's a way to determine
> guest-visible virtual hardware changes to see what is triggering
> Bitlocker into recovery.
>
> Could it be as easy as booting a recovery linux distro and comparing the
> outputs of dmidecode or somesuch?
>

I am afraid it's not so easy.  We should probably consider new tests to
ensure version machines get the same PCR measurement from bios/uefi. That's
what OS usually rely on, but they may probe more hardware related details
themself too.


> For giggles I did enter the recovery key of the testing VM when
> prompted. It did boot up and showed Bitlocker enabled. After rebooting
> it prompted for the recovery key again. I entered it again, it booted
> again and I turned off Bitlocker (decrypted the disk). After re-enabling
> Bitlocker (re-encrypting the disk) and rebooting again it now does not
> prompt for the recovery key again.
>
> This certainly seems to suggest that the TPM as such is working. TPM
> management in Windows 10 said as much.
>
> As said, I'd like to avoid this with the production VM and try to figure
> out what's going on here to avoid it in the future.
>

I think our best chance is to bisect qemu. If you can't do it, I should be
able to give it a try.


-- 
Marc-André Lureau

Reply via email to