Hi Bjorn, On Fri, May 1, 2020 at 4:07 PM Rajat Jain <rajatja@xxxxxxxxxx> wrote: > > Hi, > > Currently, the PCI subsystem marks the PCI devices as "untrusted", if > the firmware asks it to: > > 617654aae50e ("PCI / ACPI: Identify untrusted PCI devices") > 9cb30a71acd4 ("PCI: OF: Support "external-facing" property") > > An "untrusted" device indicates a (likely external facing) device that > may be malicious, and can trigger DMA attacks on the system. It may > also try to exploit any vulnerabilities exposed by the driver, that > may allow it to read/write unintended addresses in the host (e.g. if > DMA buffers for the device, share memory pages with other driver data > structures or code etc). > > High Level proposal > =============== > Currently, the "untrusted" device property is used as a hint to enable > IOMMU restrictions (on Intel), disable ATS (on ARM) etc. We'd like to > go a step further, and allow the administrator to build a list of > whitelisted drivers for these "untrusted" devices. This whitelist of > drivers are the ones that he trusts enough to have little or no > vulnerabilities. (He may have built this list of whitelisted drivers > by a combination of code analysis of drivers, or by extensive testing > using PCIe fuzzing etc). We propose that the administrator be allowed > to specify this list of whitelisted drivers to the kernel, and the PCI > subsystem to impose this behavior: > > 1) The "untrusted" devices can bind to only "whitelisted drivers". > 2) The other devices (i.e. dev->untrusted=0) can bind to any driver. > > Of course this behavior is to be imposed only if such a whitelist is > provided by the administrator. I was wondering if you got a chance to look at this proposal? WDYT? Thanks & Best Regards, Rajat > > Details > ====== > > 1) A kernel argument ("pci.impose_driver_whitelisting") to enable > imposing of whitelisting by PCI subsystem. > > 2) Add a flag ("whitelisted") in struct pci_driver to indicate whether > the driver is whitelisted. > > 3) Use the driver's "whitelisted" flag and the device's "untrusted" > flag, to make a decision about whether to bind or not in > pci_bus_match() or similar. > > 4) A mechanism to allow the administrator to specify the whitelist of > drivers. I think this needs more thought as there are multiple > options. > > a) Expose individual driver's "whitelisted" flag to userspace so a > boot script can whitelist that driver. There are questions that still > need answered though e.g. what to do about the devices that may have > already been enumerated and rejected by then? What to do with the > already bound devices, if the user changes a driver to remove it from > the whitelist. etc. > > b) Provide a way to specify the whitelist via the kernel command > line. Accept a ("pci.whitelist") kernel parameter which is a comma > separated list of driver names (just like "module_blacklist"), and > then use it to initialize each driver's "whitelisted" flag as the > drivers are registered. Essentially this would mean that the whitelist > of devices cannot be changed after boot. > > To me (b) looks a better option but I think a future requirement would > be the ability to remove the drivers from the whitelist after boot > (adding drivers to whitelist at runtime may not be that critical IMO) > > WDYT? > > Thanks, > > Rajat