dm-verity: restart or panic on an I/O error
Maxim Suhanov reported that dm-verity doesn't crash if an I/O error happens. In theory, this could be used to subvert security, because an attacker can create sectors that return error with the Write Uncorrectable command. Some programs may misbehave if they have to deal with EIO. This commit fixes dm-verity, so that if "panic_on_corruption" or "restart_on_corruption" was specified and an I/O error happens, the machine will panic or restart. This commit also changes kernel_restart to emergency_restart - kernel_restart calls reboot notifiers and these reboot notifiers may wait for the bio that failed. emergency_restart doesn't call the notifiers. Reported-by: Maxim Suhanov <dfirblog@gmail.com> Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Cc: stable@vger.kernel.org
This commit is contained in:
parent
0a92e5cdee
commit
e6a3531dd5
@ -272,8 +272,10 @@ out:
|
|||||||
if (v->mode == DM_VERITY_MODE_LOGGING)
|
if (v->mode == DM_VERITY_MODE_LOGGING)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (v->mode == DM_VERITY_MODE_RESTART)
|
if (v->mode == DM_VERITY_MODE_RESTART) {
|
||||||
kernel_restart("dm-verity device corrupted");
|
pr_emerg("dm-verity device corrupted\n");
|
||||||
|
emergency_restart();
|
||||||
|
}
|
||||||
|
|
||||||
if (v->mode == DM_VERITY_MODE_PANIC)
|
if (v->mode == DM_VERITY_MODE_PANIC)
|
||||||
panic("dm-verity device corrupted");
|
panic("dm-verity device corrupted");
|
||||||
@ -596,6 +598,23 @@ static void verity_finish_io(struct dm_verity_io *io, blk_status_t status)
|
|||||||
if (!static_branch_unlikely(&use_bh_wq_enabled) || !io->in_bh)
|
if (!static_branch_unlikely(&use_bh_wq_enabled) || !io->in_bh)
|
||||||
verity_fec_finish_io(io);
|
verity_fec_finish_io(io);
|
||||||
|
|
||||||
|
if (unlikely(status != BLK_STS_OK) &&
|
||||||
|
unlikely(!(bio->bi_opf & REQ_RAHEAD)) &&
|
||||||
|
!verity_is_system_shutting_down()) {
|
||||||
|
if (v->mode == DM_VERITY_MODE_RESTART ||
|
||||||
|
v->mode == DM_VERITY_MODE_PANIC)
|
||||||
|
DMERR_LIMIT("%s has error: %s", v->data_dev->name,
|
||||||
|
blk_status_to_str(status));
|
||||||
|
|
||||||
|
if (v->mode == DM_VERITY_MODE_RESTART) {
|
||||||
|
pr_emerg("dm-verity device corrupted\n");
|
||||||
|
emergency_restart();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (v->mode == DM_VERITY_MODE_PANIC)
|
||||||
|
panic("dm-verity device corrupted");
|
||||||
|
}
|
||||||
|
|
||||||
bio_endio(bio);
|
bio_endio(bio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user