Message ID | 1497017138-86910-2-git-send-email-brad.figg@canonical.com |
---|---|
State | New |
Headers | show |
On 09/06/17 15:05, Brad Figg wrote: > From: Peter Hurley <peter@hurleysoftware.com> > > CVE-2015-8964 > > Line discipline drivers may mistakenly misuse ldisc-related fields > when initializing. For example, a failure to initialize tty->receive_room > in the N_GIGASET_M101 line discipline was recently found and fixed [1]. > Now, the N_X25 line discipline has been discovered accessing the previous > line discipline's already-freed private data [2]. > > Harden the ldisc interface against misuse by initializing revelant > tty fields before instancing the new line discipline. > > [1] > commit fd98e9419d8d622a4de91f76b306af6aa627aa9c > Author: Tilman Schmidt <tilman@imap.cc> > Date: Tue Jul 14 00:37:13 2015 +0200 > > isdn/gigaset: reset tty->receive_room when attaching ser_gigaset > > [2] Report from Sasha Levin <sasha.levin@oracle.com> > [ 634.336761] ================================================================== > [ 634.338226] BUG: KASAN: use-after-free in x25_asy_open_tty+0x13d/0x490 at addr ffff8800a743efd0 > [ 634.339558] Read of size 4 by task syzkaller_execu/8981 > [ 634.340359] ============================================================================= > [ 634.341598] BUG kmalloc-512 (Not tainted): kasan: bad access detected > ... > [ 634.405018] Call Trace: > [ 634.405277] dump_stack (lib/dump_stack.c:52) > [ 634.405775] print_trailer (mm/slub.c:655) > [ 634.406361] object_err (mm/slub.c:662) > [ 634.406824] kasan_report_error (mm/kasan/report.c:138 mm/kasan/report.c:236) > [ 634.409581] __asan_report_load4_noabort (mm/kasan/report.c:279) > [ 634.411355] x25_asy_open_tty (drivers/net/wan/x25_asy.c:559 (discriminator 1)) > [ 634.413997] tty_ldisc_open.isra.2 (drivers/tty/tty_ldisc.c:447) > [ 634.414549] tty_set_ldisc (drivers/tty/tty_ldisc.c:567) > [ 634.415057] tty_ioctl (drivers/tty/tty_io.c:2646 drivers/tty/tty_io.c:2879) > [ 634.423524] do_vfs_ioctl (fs/ioctl.c:43 fs/ioctl.c:607) > [ 634.427491] SyS_ioctl (fs/ioctl.c:622 fs/ioctl.c:613) > [ 634.427945] entry_SYSCALL_64_fastpath (arch/x86/entry/entry_64.S:188) > > Cc: Tilman Schmidt <tilman@imap.cc> > Cc: Sasha Levin <sasha.levin@oracle.com> > Signed-off-by: Peter Hurley <peter@hurleysoftware.com> > Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > (cherry picked from commit dd42bf1197144ede075a9d4793123f7689e164bc) > Signed-off-by: Brad Figg <brad.figg@canonical.com> > --- > drivers/tty/tty_ldisc.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c > index 6458e11..b6877aa 100644 > --- a/drivers/tty/tty_ldisc.c > +++ b/drivers/tty/tty_ldisc.c > @@ -415,6 +415,10 @@ EXPORT_SYMBOL_GPL(tty_ldisc_flush); > * they are not on hot paths so a little discipline won't do > * any harm. > * > + * The line discipline-related tty_struct fields are reset to > + * prevent the ldisc driver from re-using stale information for > + * the new ldisc instance. > + * > * Locking: takes termios_rwsem > */ > > @@ -423,6 +427,9 @@ static void tty_set_termios_ldisc(struct tty_struct *tty, int num) > down_write(&tty->termios_rwsem); > tty->termios.c_line = num; > up_write(&tty->termios_rwsem); > + > + tty->disc_data = NULL; > + tty->receive_room = 0; > } > > /** > Clean cherry pick. Looks OK. Thanks Brad. Acked-by: Colin Ian King <colin.king@canonical.com>
On Fri, Jun 09, 2017 at 07:05:38AM -0700, Brad Figg wrote: > From: Peter Hurley <peter@hurleysoftware.com> > > CVE-2015-8964 > > Line discipline drivers may mistakenly misuse ldisc-related fields > when initializing. For example, a failure to initialize tty->receive_room > in the N_GIGASET_M101 line discipline was recently found and fixed [1]. > Now, the N_X25 line discipline has been discovered accessing the previous > line discipline's already-freed private data [2]. > > Harden the ldisc interface against misuse by initializing revelant > tty fields before instancing the new line discipline. > > [1] > commit fd98e9419d8d622a4de91f76b306af6aa627aa9c > Author: Tilman Schmidt <tilman@imap.cc> > Date: Tue Jul 14 00:37:13 2015 +0200 > > isdn/gigaset: reset tty->receive_room when attaching ser_gigaset > > [2] Report from Sasha Levin <sasha.levin@oracle.com> > [ 634.336761] ================================================================== > [ 634.338226] BUG: KASAN: use-after-free in x25_asy_open_tty+0x13d/0x490 at addr ffff8800a743efd0 > [ 634.339558] Read of size 4 by task syzkaller_execu/8981 > [ 634.340359] ============================================================================= > [ 634.341598] BUG kmalloc-512 (Not tainted): kasan: bad access detected > ... > [ 634.405018] Call Trace: > [ 634.405277] dump_stack (lib/dump_stack.c:52) > [ 634.405775] print_trailer (mm/slub.c:655) > [ 634.406361] object_err (mm/slub.c:662) > [ 634.406824] kasan_report_error (mm/kasan/report.c:138 mm/kasan/report.c:236) > [ 634.409581] __asan_report_load4_noabort (mm/kasan/report.c:279) > [ 634.411355] x25_asy_open_tty (drivers/net/wan/x25_asy.c:559 (discriminator 1)) > [ 634.413997] tty_ldisc_open.isra.2 (drivers/tty/tty_ldisc.c:447) > [ 634.414549] tty_set_ldisc (drivers/tty/tty_ldisc.c:567) > [ 634.415057] tty_ioctl (drivers/tty/tty_io.c:2646 drivers/tty/tty_io.c:2879) > [ 634.423524] do_vfs_ioctl (fs/ioctl.c:43 fs/ioctl.c:607) > [ 634.427491] SyS_ioctl (fs/ioctl.c:622 fs/ioctl.c:613) > [ 634.427945] entry_SYSCALL_64_fastpath (arch/x86/entry/entry_64.S:188) > > Cc: Tilman Schmidt <tilman@imap.cc> > Cc: Sasha Levin <sasha.levin@oracle.com> > Signed-off-by: Peter Hurley <peter@hurleysoftware.com> > Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > (cherry picked from commit dd42bf1197144ede075a9d4793123f7689e164bc) > Signed-off-by: Brad Figg <brad.figg@canonical.com> > --- > drivers/tty/tty_ldisc.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c > index 6458e11..b6877aa 100644 > --- a/drivers/tty/tty_ldisc.c > +++ b/drivers/tty/tty_ldisc.c > @@ -415,6 +415,10 @@ EXPORT_SYMBOL_GPL(tty_ldisc_flush); > * they are not on hot paths so a little discipline won't do > * any harm. > * > + * The line discipline-related tty_struct fields are reset to > + * prevent the ldisc driver from re-using stale information for > + * the new ldisc instance. > + * > * Locking: takes termios_rwsem > */ > > @@ -423,6 +427,9 @@ static void tty_set_termios_ldisc(struct tty_struct *tty, int num) > down_write(&tty->termios_rwsem); > tty->termios.c_line = num; > up_write(&tty->termios_rwsem); > + > + tty->disc_data = NULL; > + tty->receive_room = 0; > } > > /** Simple cherry-pick. Looks to do what is claimed. Therefore: Acked-by: Andy Whitcroft <apw@canonical.com> -apw
Applied to Trusty master-next. Thanks, -Stefan
diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c index 6458e11..b6877aa 100644 --- a/drivers/tty/tty_ldisc.c +++ b/drivers/tty/tty_ldisc.c @@ -415,6 +415,10 @@ EXPORT_SYMBOL_GPL(tty_ldisc_flush); * they are not on hot paths so a little discipline won't do * any harm. * + * The line discipline-related tty_struct fields are reset to + * prevent the ldisc driver from re-using stale information for + * the new ldisc instance. + * * Locking: takes termios_rwsem */ @@ -423,6 +427,9 @@ static void tty_set_termios_ldisc(struct tty_struct *tty, int num) down_write(&tty->termios_rwsem); tty->termios.c_line = num; up_write(&tty->termios_rwsem); + + tty->disc_data = NULL; + tty->receive_room = 0; } /**