public inbox for dm-devel@redhat.com
 help / color / mirror / Atom feed
* [RFC PATCH] dm-verity: disable recursive forward error correction
@ 2025-11-14 15:54 Mikulas Patocka
  2025-11-17 20:52 ` Sami Tolvanen
  2025-11-21  1:59 ` Eric Biggers
  0 siblings, 2 replies; 4+ messages in thread
From: Mikulas Patocka @ 2025-11-14 15:54 UTC (permalink / raw)
  To: Sami Tolvanen
  Cc: Alasdair Kergon, Mike Snitzer, dm-devel, Guangwu Zhang,
	Ondrej Kozina, Milan Broz

Hi

What do you think about this patch?

There are two problems with the recursive correction:

1. It may cause denial-of-service. In fec_read_bufs, there is a loop that 
has 253 iterations. For each iteration, we may call verity_hash_for_block 
recursively. There is a limit of 4 nested recursions - that means that 
there may be at most 253^4 (4 billion) iterations. Red Hat QE team 
actually created an image that that pushes dm-verity to this limit - and 
this image just makes the udev-worker process get stuck in the 'D' state.

2. It probably doesn't work. In fec_read_bufs we store data into the 
variable "fio->bufs", but fio bufs is shared between recursive 
invocations, if "verity_hash_for_block" invoked correction recursively, it 
would overwrite partially filled fio->bufs.

So, I'm suggesting to remove recursive correction at all. This patch
passed the cryptsetup testsuite. Does it pass your tests too?

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Reported-by: Guangwu Zhang <guazhang@redhat.com>

---
 drivers/md/dm-verity-fec.c    |    4 +---
 drivers/md/dm-verity-fec.h    |    3 ---
 drivers/md/dm-verity-target.c |    2 +-
 3 files changed, 2 insertions(+), 7 deletions(-)

Index: linux-2.6/drivers/md/dm-verity-fec.c
===================================================================
--- linux-2.6.orig/drivers/md/dm-verity-fec.c	2025-11-14 15:15:31.000000000 +0100
+++ linux-2.6/drivers/md/dm-verity-fec.c	2025-11-14 16:33:42.000000000 +0100
@@ -417,10 +417,8 @@ int verity_fec_decode(struct dm_verity *
 	if (!verity_fec_is_enabled(v))
 		return -EOPNOTSUPP;
 
-	if (fio->level >= DM_VERITY_FEC_MAX_RECURSION) {
-		DMWARN_LIMIT("%s: FEC: recursion too deep", v->data_dev->name);
+	if (fio->level)
 		return -EIO;
-	}
 
 	fio->level++;
 
Index: linux-2.6/drivers/md/dm-verity-fec.h
===================================================================
--- linux-2.6.orig/drivers/md/dm-verity-fec.h	2025-11-14 15:15:31.000000000 +0100
+++ linux-2.6/drivers/md/dm-verity-fec.h	2025-11-14 15:21:39.000000000 +0100
@@ -23,9 +23,6 @@
 #define DM_VERITY_FEC_BUF_MAX \
 	(1 << (PAGE_SHIFT - DM_VERITY_FEC_BUF_RS_BITS))
 
-/* maximum recursion level for verity_fec_decode */
-#define DM_VERITY_FEC_MAX_RECURSION	4
-
 #define DM_VERITY_OPT_FEC_DEV		"use_fec_from_device"
 #define DM_VERITY_OPT_FEC_BLOCKS	"fec_blocks"
 #define DM_VERITY_OPT_FEC_START		"fec_start"
Index: linux-2.6/drivers/md/dm-verity-target.c
===================================================================
--- linux-2.6.orig/drivers/md/dm-verity-target.c	2025-08-15 17:28:23.000000000 +0200
+++ linux-2.6/drivers/md/dm-verity-target.c	2025-11-14 15:23:23.000000000 +0100
@@ -1690,7 +1690,7 @@ static struct target_type verity_target
 	.name		= "verity",
 /* Note: the LSMs depend on the singleton and immutable features */
 	.features	= DM_TARGET_SINGLETON | DM_TARGET_IMMUTABLE,
-	.version	= {1, 12, 0},
+	.version	= {1, 13, 0},
 	.module		= THIS_MODULE,
 	.ctr		= verity_ctr,
 	.dtr		= verity_dtr,


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2025-11-21  1:59 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-14 15:54 [RFC PATCH] dm-verity: disable recursive forward error correction Mikulas Patocka
2025-11-17 20:52 ` Sami Tolvanen
2025-11-18 18:03   ` Mikulas Patocka
2025-11-21  1:59 ` Eric Biggers

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox