On 10/01/17 02:09, Brijesh Singh wrote: > > > On 9/29/17 4:58 PM, Laszlo Ersek wrote: > ... >> The expansion ROMs (containing UEFI drivers) of emulated PCI devices, >> and the same of assigned physical PCI devices, constitute another >> channel through which code enters the guest from the outside (i.e., from >> the Cloud Provider). The ROM BARs from which the guest firmware reads >> the UEFI binaries are not guest RAM, they are MMIO. (For execution, the >> drivers are copied into encrypted guest RAM.) >> >> If the guest has Secure Boot enabled, then the oproms are verified[*] >> (and not launched if verification fails), but this is slightly different >> from what I understand under audit-by-GO. It means the GO wouldn't get a >> measurement of the oproms for one-by-one clearing, when about to >> green-light a guest startup. Instead the GO would ensure that Secure >> Boot be enabled with the right certificates (and/or executable hashes) >> enrolled off the bat, and then implicitly trust all oprom drivers >> accepted by those certs / hashes. It's another layer of indirection. >> >> This is likely nothing new qualitatively, but "the devil is in the >> details", so I thought it was worth raising. >> >> [*] For edk2 / OvmfPkg specifics, I'll mention >> >> gEfiSecurityPkgTokenSpaceGuid.PcdOptionRomImageVerificationPolicy >> >> The SecurityPkg default is 0x04 ("Deny execution when there is security >> violation"). However, OVMF sets it to 0x00 ("Always trust the image"). >> Please see the following commit for the reasons: >> >> https://github.com/tianocore/edk2/commit/1fea9ddb4e3fd >> >> Brijesh, for SEV guests, we likely want to flip this PCD to 0x04, in the >> AmdSevInitialize() function, in "OvmfPkg/PlatformPei/AmdSev.c". For that >> we'll also have to change the PCD from fixed-at-build to dynamic, but >> that in turn will require a change to "SecurityPkg.dec" itself >> (currently it only allows fixed-at-build or patchable, not dynamic). Do >> you want me to file a BZ in the TianoCore tracker for this, and assign >> it to you? If you don't have time for writing the patch, I'm glad to do >> it too, but then the review could be slower; both other OvmfPkg >> co-maintainers are busy with other things.) > > Very good point Laszlo. Please submit the BZ and assign it me - thank > you. we will take a look at implementing the required support. I've filed: https://bugzilla.tianocore.org/show_bug.cgi?id=728 Another thought: once we delegate part of the protection that SEV provides to the Secure Boot implementation in the guest, the pflash chip that stores the UEFI variables (i.e., certificates for SB as well) becomes a target of attacks not just from within the guest, but also from the host. This is a big problem because the pflash chip is MMIO, nor RAM. So it is not encrypted, and the Cloud Provider can tamper with it at will -- even if the variable store file that backs the pflash chip (with the certificates pre-enrolled) comes from the Guest Owner initially, and/or passes the GO's measurement check. Put differently, even if we set PcdOptionRomImageVerificationPolicy to 0x04, it doesn't help if the CP can poke any UEFI executable hash or self-signed certificate into the varstore, which in turn will "verify" the CP's malicious oprom driver. The varstore pflash chip has never been considered to be under attack from the *host* side; all the guest-SMM work was focused on protecting pflash (and guest firmware in general) from the *guest* OS (and 3rd party *guest* UEFI apps). Theoretically, I see three ways to mitigate this: (1) Eliminate pflash from OVMF altogether. This would be a huge project, affecting OVMF, QEMU and libvirt. It would also throw the current in-guest protections provided by SB out the window. (2) Keep pflash as-is, but do not off-load any SEV protections to guest-side Secure Boot. This means that the guest firmware must be comprehensively restricted to load binaries only from media that the GO measured and the CP cannot tamper with. No option ROMs, no PXE boot, no plaintext ISOs, no plaintext hard disk images. (And booting from encrypted ISOs / hard disk images would require a LUKS driver for OVMF.) (3) Implement SEV encryption for pflash. A pflash chip can be in one of two modes: (a) it reads and executes as ROM, or (b) it behaves like a programmable (r/w) device with MMIO registers. Switching between both modes is explicit (see "OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlash.c"); perhaps some SEV controls could be hooked in there. Thanks Laszlo -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list