Use case: --------- Usually when people do full disk encryption, it's not really full disk, instead they still have a /boot in clear. So an evil maid attack can still be done, in two passes: 1) Clone the hdd, Infect the initramfs or the kernel. 2) Wait for the user to enter its password, recover the password, luksOpen the hdd image. I wanted a real full-disk encryption so I've put grub in flash and I have the following: The HDD has a LUKS rootfs(containing /boot) on an lvm partition, so no partition is in clear. So when the computer boots it executes coreboot, then grub as a payload. Grub then opens the LUKS partition and loads the kernel and initramfs from there. To prevent hardware level tempering(like reflashing), I used nail polish with a lot of gilder, that acts like a seal. Then a high resolution picture of it is taken, to be able to tell the difference. The problem: ------------ But then comes the docking port issue: Some LPC pins are exported there, such as the CLKRUN and LDRQ#. LDRQ# is "Encoded DMA/Bus Master Request": "Only needed by peripherals that need DMA or bus mastering. Requires an individual signal per peripheral. Peripherals may not share an LDRQ# signal." So now DMA access is possible trough the dock connector. So I want to be able to turn that off. If I got it right, the X60 has 2 superio, one is in the dock, and the other one is in the laptop, so we have: ________________ _________________ | | | | | Dock connector:| |Dock: NSC pc87982|<--LPC--->D_LPC_DREQ0 | |_________________| |_______^________| | | | | ___________________|____ | v | | SuperIO: DLDRQ# | | NSC pc87382 LDRQ# | |___________________^____| | | | | ___________________|___ | v | | Southbridge: LDRQ0 | | ICH7 | |_______________________| The code: --------- Now if I look at the existing code, there is some superio drivers, like pc87382 in src/superio/nsc, the code is very small. The only interesting part is the pnp_info pnp_dev_info struct. Now if I look inside src/mainboard/lenovo/x60 there is some more complete dock driver: Inside dock.c I see some dock_connect and dock_disconnect functions. Such functions are called during the initialisation (romstage.c) and from the X60 SMI handler (smihandler.c). Questions: ---------- 1) Would the following be sufficent to prevent DMA access from the outside: > int dock_connect(void) > { > int timeout = 1000; > + int val; > + > + if (get_option(&val, "dock") != CB_SUCCESS) > + val = 1; > + if (val == 0) > + return 0; > [...] > } > > void dock_disconnect(void) { > + if (dock_present()) > + return; > [...] > } 2) Would an nvram option be ok for that? Should a Kconfig option be added too? > config DOCK_AUTODETECT > bool "Autodetect" > help > The dock is autodetected. If unsure select this option. > > config DOCK_DISABLED > bool "Disabled" > help > The dock is always disabled. > > config DOCK_NVRAM_ENABLE > bool "Nvram" > help > The dock autodetection is tried only if it is also enabled > trough nvram.
Copyright © 2014 Francis Rowe <info@gluglug.org.uk>
This document is released under the Creative Commons Attribution-ShareAlike 4.0 International Public License and all future versions.
A copy of the license can be found at ../license.txt.
This document is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See ../license.txt for more information.