* [PATCH] iommufd: Protect against overflow of ALIGN() during iova allocation
@ 2024-08-27 16:46 Jason Gunthorpe
2024-08-27 17:46 ` Nicolin Chen
2024-09-05 19:03 ` Jason Gunthorpe
0 siblings, 2 replies; 3+ messages in thread
From: Jason Gunthorpe @ 2024-08-27 16:46 UTC (permalink / raw)
To: iommu, Joerg Roedel
Cc: Kevin Tian, Lixiao Yang, Matthew Rosato, Nicolin Chen, patches,
syzbot+16073ebbc4c64b819b47, Yi Liu
Userspace can supply an iova and uptr such that the target iova alignment
becomes really big and ALIGN() overflows which corrupts the selected area
range during allocation. CONFIG_IOMMUFD_TEST can detect this:
WARNING: CPU: 1 PID: 5092 at drivers/iommu/iommufd/io_pagetable.c:268 iopt_alloc_area_pages drivers/iommu/iommufd/io_pagetable.c:268 [inline]
WARNING: CPU: 1 PID: 5092 at drivers/iommu/iommufd/io_pagetable.c:268 iopt_map_pages+0xf95/0x1050 drivers/iommu/iommufd/io_pagetable.c:352
Modules linked in:
CPU: 1 PID: 5092 Comm: syz-executor294 Not tainted 6.10.0-rc5-syzkaller-00294-g3ffea9a7a6f7 #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 06/07/2024
RIP: 0010:iopt_alloc_area_pages drivers/iommu/iommufd/io_pagetable.c:268 [inline]
RIP: 0010:iopt_map_pages+0xf95/0x1050 drivers/iommu/iommufd/io_pagetable.c:352
Code: fc e9 a4 f3 ff ff e8 1a 8b 4c fc 41 be e4 ff ff ff e9 8a f3 ff ff e8 0a 8b 4c fc 90 0f 0b 90 e9 37 f5 ff ff e8 fc 8a 4c fc 90 <0f> 0b 90 e9 68 f3 ff ff 48 c7 c1 ec 82 ad 8f 80 e1 07 80 c1 03 38
RSP: 0018:ffffc90003ebf9e0 EFLAGS: 00010293
RAX: ffffffff85499fa4 RBX: 00000000ffffffef RCX: ffff888079b49e00
RDX: 0000000000000000 RSI: 00000000ffffffef RDI: 0000000000000000
RBP: ffffc90003ebfc50 R08: ffffffff85499b30 R09: ffffffff85499942
R10: 0000000000000002 R11: ffff888079b49e00 R12: ffff8880228e0010
R13: 0000000000000000 R14: 1ffff920007d7f68 R15: ffffc90003ebfd00
FS: 000055557d760380(0000) GS:ffff8880b9500000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00000000005fdeb8 CR3: 000000007404a000 CR4: 00000000003506f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
<TASK>
iommufd_ioas_copy+0x610/0x7b0 drivers/iommu/iommufd/ioas.c:274
iommufd_fops_ioctl+0x4d9/0x5a0 drivers/iommu/iommufd/main.c:421
vfs_ioctl fs/ioctl.c:51 [inline]
__do_sys_ioctl fs/ioctl.c:907 [inline]
__se_sys_ioctl+0xfc/0x170 fs/ioctl.c:893
do_syscall_x64 arch/x86/entry/common.c:52 [inline]
do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83
entry_SYSCALL_64_after_hwframe+0x77/0x7f
Cap the automatic alignment to the huge page size, which is probably a
better idea overall. Huge automatic alignments can fragment and chew up
the available IOVA space without any reason.
Cc: stable@vger.kernel.org
Fixes: 51fe6141f0f6 ("iommufd: Data structure to provide IOVA to PFN mapping")
Reported-by: syzbot+16073ebbc4c64b819b47@syzkaller.appspotmail.com
Closes: https://lore.kernel.org/r/000000000000388410061a74f014@google.com
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/iommu/iommufd/io_pagetable.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/iommu/iommufd/io_pagetable.c b/drivers/iommu/iommufd/io_pagetable.c
index bbbc8a044bcf7f..4bf7ccd39d465c 100644
--- a/drivers/iommu/iommufd/io_pagetable.c
+++ b/drivers/iommu/iommufd/io_pagetable.c
@@ -112,6 +112,7 @@ static int iopt_alloc_iova(struct io_pagetable *iopt, unsigned long *iova,
unsigned long page_offset = uptr % PAGE_SIZE;
struct interval_tree_double_span_iter used_span;
struct interval_tree_span_iter allowed_span;
+ unsigned long max_alignment = PAGE_SIZE;
unsigned long iova_alignment;
lockdep_assert_held(&iopt->iova_rwsem);
@@ -131,6 +132,13 @@ static int iopt_alloc_iova(struct io_pagetable *iopt, unsigned long *iova,
roundup_pow_of_two(length),
1UL << __ffs64(uptr));
+#ifdef CONFIG_TRANSPARENT_HUGEPAGE
+ max_alignment = HPAGE_SIZE;
+#endif
+ /* Protect against ALIGN() overflow */
+ if (iova_alignment >= max_alignment)
+ iova_alignment = max_alignment;
+
if (iova_alignment < iopt->iova_alignment)
return -EINVAL;
base-commit: 76889bbaabf5cab981a74ed69cb3816921edc5d4
--
2.46.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] iommufd: Protect against overflow of ALIGN() during iova allocation
2024-08-27 16:46 [PATCH] iommufd: Protect against overflow of ALIGN() during iova allocation Jason Gunthorpe
@ 2024-08-27 17:46 ` Nicolin Chen
2024-09-05 19:03 ` Jason Gunthorpe
1 sibling, 0 replies; 3+ messages in thread
From: Nicolin Chen @ 2024-08-27 17:46 UTC (permalink / raw)
To: Jason Gunthorpe
Cc: iommu, Joerg Roedel, Kevin Tian, Lixiao Yang, Matthew Rosato,
patches, syzbot+16073ebbc4c64b819b47, Yi Liu
On Tue, Aug 27, 2024 at 01:46:45PM -0300, Jason Gunthorpe wrote:
> Userspace can supply an iova and uptr such that the target iova alignment
> becomes really big and ALIGN() overflows which corrupts the selected area
> range during allocation. CONFIG_IOMMUFD_TEST can detect this:
>
> WARNING: CPU: 1 PID: 5092 at drivers/iommu/iommufd/io_pagetable.c:268 iopt_alloc_area_pages drivers/iommu/iommufd/io_pagetable.c:268 [inline]
> WARNING: CPU: 1 PID: 5092 at drivers/iommu/iommufd/io_pagetable.c:268 iopt_map_pages+0xf95/0x1050 drivers/iommu/iommufd/io_pagetable.c:352
> Modules linked in:
> CPU: 1 PID: 5092 Comm: syz-executor294 Not tainted 6.10.0-rc5-syzkaller-00294-g3ffea9a7a6f7 #0
> Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 06/07/2024
> RIP: 0010:iopt_alloc_area_pages drivers/iommu/iommufd/io_pagetable.c:268 [inline]
> RIP: 0010:iopt_map_pages+0xf95/0x1050 drivers/iommu/iommufd/io_pagetable.c:352
> Code: fc e9 a4 f3 ff ff e8 1a 8b 4c fc 41 be e4 ff ff ff e9 8a f3 ff ff e8 0a 8b 4c fc 90 0f 0b 90 e9 37 f5 ff ff e8 fc 8a 4c fc 90 <0f> 0b 90 e9 68 f3 ff ff 48 c7 c1 ec 82 ad 8f 80 e1 07 80 c1 03 38
> RSP: 0018:ffffc90003ebf9e0 EFLAGS: 00010293
> RAX: ffffffff85499fa4 RBX: 00000000ffffffef RCX: ffff888079b49e00
> RDX: 0000000000000000 RSI: 00000000ffffffef RDI: 0000000000000000
> RBP: ffffc90003ebfc50 R08: ffffffff85499b30 R09: ffffffff85499942
> R10: 0000000000000002 R11: ffff888079b49e00 R12: ffff8880228e0010
> R13: 0000000000000000 R14: 1ffff920007d7f68 R15: ffffc90003ebfd00
> FS: 000055557d760380(0000) GS:ffff8880b9500000(0000) knlGS:0000000000000000
> CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 00000000005fdeb8 CR3: 000000007404a000 CR4: 00000000003506f0
> DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
> Call Trace:
> <TASK>
> iommufd_ioas_copy+0x610/0x7b0 drivers/iommu/iommufd/ioas.c:274
> iommufd_fops_ioctl+0x4d9/0x5a0 drivers/iommu/iommufd/main.c:421
> vfs_ioctl fs/ioctl.c:51 [inline]
> __do_sys_ioctl fs/ioctl.c:907 [inline]
> __se_sys_ioctl+0xfc/0x170 fs/ioctl.c:893
> do_syscall_x64 arch/x86/entry/common.c:52 [inline]
> do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83
> entry_SYSCALL_64_after_hwframe+0x77/0x7f
>
> Cap the automatic alignment to the huge page size, which is probably a
> better idea overall. Huge automatic alignments can fragment and chew up
> the available IOVA space without any reason.
>
> Cc: stable@vger.kernel.org
> Fixes: 51fe6141f0f6 ("iommufd: Data structure to provide IOVA to PFN mapping")
> Reported-by: syzbot+16073ebbc4c64b819b47@syzkaller.appspotmail.com
> Closes: https://lore.kernel.org/r/000000000000388410061a74f014@google.com
> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] iommufd: Protect against overflow of ALIGN() during iova allocation
2024-08-27 16:46 [PATCH] iommufd: Protect against overflow of ALIGN() during iova allocation Jason Gunthorpe
2024-08-27 17:46 ` Nicolin Chen
@ 2024-09-05 19:03 ` Jason Gunthorpe
1 sibling, 0 replies; 3+ messages in thread
From: Jason Gunthorpe @ 2024-09-05 19:03 UTC (permalink / raw)
To: iommu, Joerg Roedel
Cc: Kevin Tian, Lixiao Yang, Matthew Rosato, Nicolin Chen, patches,
syzbot+16073ebbc4c64b819b47, Yi Liu
On Tue, Aug 27, 2024 at 01:46:45PM -0300, Jason Gunthorpe wrote:
> Userspace can supply an iova and uptr such that the target iova alignment
> becomes really big and ALIGN() overflows which corrupts the selected area
> range during allocation. CONFIG_IOMMUFD_TEST can detect this:
>
> WARNING: CPU: 1 PID: 5092 at drivers/iommu/iommufd/io_pagetable.c:268 iopt_alloc_area_pages drivers/iommu/iommufd/io_pagetable.c:268 [inline]
> WARNING: CPU: 1 PID: 5092 at drivers/iommu/iommufd/io_pagetable.c:268 iopt_map_pages+0xf95/0x1050 drivers/iommu/iommufd/io_pagetable.c:352
> Modules linked in:
> CPU: 1 PID: 5092 Comm: syz-executor294 Not tainted 6.10.0-rc5-syzkaller-00294-g3ffea9a7a6f7 #0
> Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 06/07/2024
> RIP: 0010:iopt_alloc_area_pages drivers/iommu/iommufd/io_pagetable.c:268 [inline]
> RIP: 0010:iopt_map_pages+0xf95/0x1050 drivers/iommu/iommufd/io_pagetable.c:352
> Code: fc e9 a4 f3 ff ff e8 1a 8b 4c fc 41 be e4 ff ff ff e9 8a f3 ff ff e8 0a 8b 4c fc 90 0f 0b 90 e9 37 f5 ff ff e8 fc 8a 4c fc 90 <0f> 0b 90 e9 68 f3 ff ff 48 c7 c1 ec 82 ad 8f 80 e1 07 80 c1 03 38
> RSP: 0018:ffffc90003ebf9e0 EFLAGS: 00010293
> RAX: ffffffff85499fa4 RBX: 00000000ffffffef RCX: ffff888079b49e00
> RDX: 0000000000000000 RSI: 00000000ffffffef RDI: 0000000000000000
> RBP: ffffc90003ebfc50 R08: ffffffff85499b30 R09: ffffffff85499942
> R10: 0000000000000002 R11: ffff888079b49e00 R12: ffff8880228e0010
> R13: 0000000000000000 R14: 1ffff920007d7f68 R15: ffffc90003ebfd00
> FS: 000055557d760380(0000) GS:ffff8880b9500000(0000) knlGS:0000000000000000
> CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 00000000005fdeb8 CR3: 000000007404a000 CR4: 00000000003506f0
> DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
> Call Trace:
> <TASK>
> iommufd_ioas_copy+0x610/0x7b0 drivers/iommu/iommufd/ioas.c:274
> iommufd_fops_ioctl+0x4d9/0x5a0 drivers/iommu/iommufd/main.c:421
> vfs_ioctl fs/ioctl.c:51 [inline]
> __do_sys_ioctl fs/ioctl.c:907 [inline]
> __se_sys_ioctl+0xfc/0x170 fs/ioctl.c:893
> do_syscall_x64 arch/x86/entry/common.c:52 [inline]
> do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83
> entry_SYSCALL_64_after_hwframe+0x77/0x7f
>
> Cap the automatic alignment to the huge page size, which is probably a
> better idea overall. Huge automatic alignments can fragment and chew up
> the available IOVA space without any reason.
>
> Cc: stable@vger.kernel.org
> Fixes: 51fe6141f0f6 ("iommufd: Data structure to provide IOVA to PFN mapping")
> Reported-by: syzbot+16073ebbc4c64b819b47@syzkaller.appspotmail.com
> Closes: https://lore.kernel.org/r/000000000000388410061a74f014@google.com
> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
> ---
> drivers/iommu/iommufd/io_pagetable.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
Applied to for-next
Thanks,
Jason
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2024-09-05 19:03 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-27 16:46 [PATCH] iommufd: Protect against overflow of ALIGN() during iova allocation Jason Gunthorpe
2024-08-27 17:46 ` Nicolin Chen
2024-09-05 19:03 ` Jason Gunthorpe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox