[PATCH v2] bcachefs: memset bounce buffer portion to 0 after key_sort_fix_overlapping

Piotr Zalewski posted 1 patch 2 months, 1 week ago
fs/bcachefs/btree_io.c | 4 ++++
1 file changed, 4 insertions(+)
[PATCH v2] bcachefs: memset bounce buffer portion to 0 after key_sort_fix_overlapping
Posted by Piotr Zalewski 2 months, 1 week ago
Zero-initialize part of allocated bounce buffer which wasn't touched by
subsequent bch2_key_sort_fix_overlapping to mitigate later uinit-value
use KMSAN bug[1].

After applying the patch reproducer still triggers stack overflow[2] but
it seems unrelated to the uninit-value use warning. After further
investigation it was found that stack overflow occurs because KMSAN adds
too many function calls[3]. Backtrace of where the stack magic number gets
smashed was added as a reply to syzkaller thread[3].

It was confirmed that task's stack magic number gets smashed after the code
path where KSMAN detects uninit-value use is executed, so it can be assumed
that it doesn't contribute in any way to uninit-value use detection.

[1] https://syzkaller.appspot.com/bug?extid=6f655a60d3244d0c6718
[2] https://lore.kernel.org/lkml/66e57e46.050a0220.115905.0002.GAE@google.com
[3] https://lore.kernel.org/all/rVaWgPULej8K7HqMPNIu8kVNyXNjjCiTB-QBtItLFBmk0alH6fV2tk4joVPk97Evnuv4ZRDd8HB5uDCkiFG6u81xKdzDj-KrtIMJSlF6Kt8=@proton.me

Reported-by: syzbot+6f655a60d3244d0c6718@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=6f655a60d3244d0c6718
Fixes: ec4edd7b9d20 ("bcachefs: Prep work for variable size btree node buffers")
Suggested-by: Kent Overstreet <kent.overstreet@linux.dev>
Signed-off-by: Piotr Zalewski <pZ010001011111@proton.me>
---

Notes:
    changes in v2:
        - instead of adding __GFP_ZERO flag to bounce buffer alloc,
          zero initialize only the part untouched by subsequent
          bch2_key_sort_fix_overlapping to make the solution more
		  performant

    link to v1: https://lore.kernel.org/linux-bcachefs/20240916224746.692973-1-pZ010001011111@proton.me/

---
 fs/bcachefs/btree_io.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/fs/bcachefs/btree_io.c b/fs/bcachefs/btree_io.c
index cb48a9477514..2a0420605bd7 100644
--- a/fs/bcachefs/btree_io.c
+++ b/fs/bcachefs/btree_io.c
@@ -1195,6 +1195,10 @@ int bch2_btree_node_read_done(struct bch_fs *c, struct bch_dev *ca,
 	set_btree_bset(b, b->set, &b->data->keys);
 
 	b->nr = bch2_key_sort_fix_overlapping(c, &sorted->keys, iter);
+	memset((uint8_t *)(sorted + 1) + b->nr.live_u64s * sizeof(u64), 0,
+			btree_buf_bytes(b) -
+			sizeof(struct btree_node) -
+			b->nr.live_u64s * sizeof(u64));
 
 	u64s = le16_to_cpu(sorted->keys.u64s);
 	*sorted = *b->data;
-- 
2.46.0
Re: [PATCH v2] bcachefs: memset bounce buffer portion to 0 after key_sort_fix_overlapping
Posted by Kent Overstreet 2 months ago
On Sun, Sep 22, 2024 at 03:18:01PM GMT, Piotr Zalewski wrote:
> Zero-initialize part of allocated bounce buffer which wasn't touched by
> subsequent bch2_key_sort_fix_overlapping to mitigate later uinit-value
> use KMSAN bug[1].
> 
> After applying the patch reproducer still triggers stack overflow[2] but
> it seems unrelated to the uninit-value use warning. After further
> investigation it was found that stack overflow occurs because KMSAN adds
> too many function calls[3]. Backtrace of where the stack magic number gets
> smashed was added as a reply to syzkaller thread[3].
> 
> It was confirmed that task's stack magic number gets smashed after the code
> path where KSMAN detects uninit-value use is executed, so it can be assumed
> that it doesn't contribute in any way to uninit-value use detection.
> 
> [1] https://syzkaller.appspot.com/bug?extid=6f655a60d3244d0c6718
> [2] https://lore.kernel.org/lkml/66e57e46.050a0220.115905.0002.GAE@google.com
> [3] https://lore.kernel.org/all/rVaWgPULej8K7HqMPNIu8kVNyXNjjCiTB-QBtItLFBmk0alH6fV2tk4joVPk97Evnuv4ZRDd8HB5uDCkiFG6u81xKdzDj-KrtIMJSlF6Kt8=@proton.me
> 
> Reported-by: syzbot+6f655a60d3244d0c6718@syzkaller.appspotmail.com
> Closes: https://syzkaller.appspot.com/bug?extid=6f655a60d3244d0c6718
> Fixes: ec4edd7b9d20 ("bcachefs: Prep work for variable size btree node buffers")
> Suggested-by: Kent Overstreet <kent.overstreet@linux.dev>
> Signed-off-by: Piotr Zalewski <pZ010001011111@proton.me>

Thanks! Applied.