* [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
* Re: [RFC PATCH] dm-verity: disable recursive forward error correction
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
1 sibling, 1 reply; 4+ messages in thread
From: Sami Tolvanen @ 2025-11-17 20:52 UTC (permalink / raw)
To: Mikulas Patocka
Cc: Alasdair Kergon, Mike Snitzer, dm-devel, Guangwu Zhang,
Ondrej Kozina, Milan Broz
Hi Mikulas,
On Fri, Nov 14, 2025 at 7:54 AM Mikulas Patocka <mpatocka@redhat.com> wrote:
>
> 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>
This looks reasonable to me. I only remember seeing recursive error
correction trigger in a real system when someone attempts to use the
wrong root hash, which is obviously not recoverable.
Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
Sami
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [RFC PATCH] dm-verity: disable recursive forward error correction
2025-11-17 20:52 ` Sami Tolvanen
@ 2025-11-18 18:03 ` Mikulas Patocka
0 siblings, 0 replies; 4+ messages in thread
From: Mikulas Patocka @ 2025-11-18 18:03 UTC (permalink / raw)
To: Sami Tolvanen
Cc: Alasdair Kergon, Mike Snitzer, dm-devel, Guangwu Zhang,
Ondrej Kozina, Milan Broz
[-- Attachment #1: Type: text/plain, Size: 1567 bytes --]
On Mon, 17 Nov 2025, Sami Tolvanen wrote:
> Hi Mikulas,
>
> On Fri, Nov 14, 2025 at 7:54 AM Mikulas Patocka <mpatocka@redhat.com> wrote:
> >
> > 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>
>
> This looks reasonable to me. I only remember seeing recursive error
> correction trigger in a real system when someone attempts to use the
> wrong root hash, which is obviously not recoverable.
>
> Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
>
> Sami
Thanks, OK.
I staged the patch for 6.19.
Mikulas
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [RFC PATCH] dm-verity: disable recursive forward error correction
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-21 1:59 ` Eric Biggers
1 sibling, 0 replies; 4+ messages in thread
From: Eric Biggers @ 2025-11-21 1:59 UTC (permalink / raw)
To: Mikulas Patocka
Cc: Sami Tolvanen, Alasdair Kergon, Mike Snitzer, dm-devel,
Guangwu Zhang, Ondrej Kozina, Milan Broz
On Fri, Nov 14, 2025 at 04:54:01PM +0100, Mikulas Patocka wrote:
> 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(-)
Reviewed-by: Eric Biggers <ebiggers@kernel.org>
- Eric
^ 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