• Deven Bowers's avatar
    block,lsm: add LSM blob and new LSM hooks for block devices · b55d26bd
    Deven Bowers authored
    This patch introduces a new LSM blob to the block_device structure,
    enabling the security subsystem to store security-sensitive data related
    to block devices. Currently, for a device mapper's mapped device containing
    a dm-verity target, critical security information such as the roothash and
    its signing state are not readily accessible. Specifically, while the
    dm-verity volume creation process passes the dm-verity roothash and its
    signature from userspace to the kernel, the roothash is stored privately
    within the dm-verity target, and its signature is discarded
    post-verification. This makes it extremely hard for the security subsystem
    to utilize these data.
    
    With the addition of the LSM blob to the block_device structure, the
    security subsystem can now retain and manage important security metadata
    such as the roothash and the signing state of a dm-verity by storing them
    inside the blob. Access decisions can then be based on these stored data.
    
    The implementation follows the same approach used for security blobs in
    other structures like struct file, struct inode, and struct superblock.
    The initialization of the security blob occurs after the creation of the
    struct block_device, performed by the security subsystem. Similarly, the
    security blob is freed by the security subsystem before the struct
    block_device is deallocated or freed.
    
    This patch also introduces a new hook security_bdev_setintegrity() to save
    block device's integrity data to the new LSM blob. For example, for
    dm-verity, it can use this hook to expose its roothash and signing state
    to LSMs, then LSMs can save these data into the LSM blob.
    
    Please note that the new hook should be invoked every time the security
    information is updated to keep these data current. For example, in
    dm-verity, if the mapping table is reloaded and configured to use a
    different dm-verity target with a new roothash and signing information,
    the previously stored data in the LSM blob will become obsolete. It is
    crucial to re-invoke the hook to refresh these data and ensure they are up
    to date. This necessity arises from the design of device-mapper, where a
    device-mapper device is first created, and then targets are subsequently
    loaded into it. These targets can be modified multiple times during the
    device's lifetime. Therefore, while the LSM blob is allocated during the
    creation of the block device, its actual contents are not initialized at
    this stage and can change substantially over time. This includes
    alterations from data that the LSM 'trusts' to those it does not, making
    it essential to handle these changes correctly. Failure to address this
    dynamic aspect could potentially allow for bypassing LSM checks.
    Signed-off-by: default avatarDeven Bowers <deven.desai@linux.microsoft.com>
    Signed-off-by: default avatarFan Wu <wufan@linux.microsoft.com>
    [PM: merge fuzz, subject line tweaks]
    Signed-off-by: default avatarPaul Moore <paul@paul-moore.com>
    b55d26bd
bdev.c 33.5 KB