First published: Thu Sep 02 2010(Updated: )
Description of problem: This doesn't look correct, the io_submit systemcall calls do_io_submit() directly: SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr, struct iocb __user * __user *, iocbpp) { return do_io_submit(ctx_id, nr, iocbpp, 0); } do_io_submit only checks if nr < 0, but doesnt check if the access_ok multiplication will overflow. long do_io_submit(aio_context_t ctx_id, long nr, struct iocb __user *__user *iocbpp, bool compat) { ... if (unlikely(!access_ok(VERIFY_READ, iocbpp, (nr*sizeof(*iocbpp))))) return -EFAULT; ... Then it uses this loop with __get_user_nocheck(), which doesn't look safe. ... for (i=0; i<nr; i++) { struct iocb __user *user_iocb; struct iocb tmp; if (unlikely(__get_user(user_iocb, iocbpp + i))) { ret = -EFAULT; break; } ... Acknowledgements: Red Hat would like to thank Tavis Ormandy for reporting this issue.
Credit: secalert@redhat.com secalert@redhat.com
Affected Software | Affected Version | How to fix |
---|---|---|
debian/linux-2.6 | ||
Linux Linux kernel | <2.6.36 | |
Linux Linux kernel | =2.6.36 | |
Linux Linux kernel | =2.6.36-rc1 | |
Linux Linux kernel | =2.6.36-rc2 | |
Linux Linux kernel | =2.6.36-rc3 | |
openSUSE openSUSE | =11.2 | |
openSUSE openSUSE | =11.3 | |
SUSE Linux Enterprise Desktop | =10-sp3 | |
Suse Linux Enterprise Real Time Extension | =11-sp1 | |
SUSE Linux Enterprise Server | =9 | |
SUSE Linux Enterprise Server | =10-sp3 | |
SUSE Linux Enterprise Software Development Kit | =10-sp3 | |
Debian Debian Linux | =5.0 | |
Canonical Ubuntu Linux | =6.06 | |
Canonical Ubuntu Linux | =8.04 | |
Canonical Ubuntu Linux | =9.04 | |
Canonical Ubuntu Linux | =9.10 | |
Canonical Ubuntu Linux | =10.04 | |
Canonical Ubuntu Linux | =10.10 |
Sign up to SecAlerts for real-time vulnerability data matched to your software, aggregated from hundreds of sources.