Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp1165257pxa; Thu, 20 Aug 2020 04:30:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy3TWJiJr9HNJxH0QEuRjfD/uT1JZ1zU6A/qZiGkyu2+LLNqscic90yzo7GllMKGLCfDWpJ X-Received: by 2002:a05:6402:2285:: with SMTP id cw5mr2349182edb.242.1597923004053; Thu, 20 Aug 2020 04:30:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1597923004; cv=none; d=google.com; s=arc-20160816; b=Ogxzj+332TDfimrJkCxSytoKYvC1rNgpTQC6BBwjFR7Ho2U7jmkjpLcl3qG0MOqVqn rybtaGB7hnhfSs8mf5xAhl4An6fbRNITcCZQn2FwzlQQUKxgMaGIUyZKG4ifPaVqxOPG ESuKQmv0qmrvcdd5U+P2GmDVLfcef7ko92KRNFlJPgUW9XM4XdAA8kYsIGpOLspff/wT itqsWwWZPllhyiTZBpMO5n6gMCrQH5VHgd64bT7odNQN93+wH3JWc6C9Ki7RVHs2Xmkm EukuLPJbqUaIgx5WDtB8QFHhwaKKhYQ59E6O5Yx+aHOuWH+IIrOOQdFN7cWodr+JdtHX h1og== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=CUgvOFXGaxCORwKLnM4rjn8/D62BC7EF9VNhnBGdab8=; b=t0AYiAxNRtEbNHel7AWMqJYvbzC7bzbxyNFuc7IcI2Nm0bcZ0O9ACBJOM+zlH2b31q 4uA/TJjPTVD64a7juT8cECBqvKYt+LjeL4N3qKuvUR16vBSiHfVHXGpJ/snT3Zecpc/x xNRDC5jP9Xdv+PnYV4qEiVw/aF1o4CXALiMEYqzsXvI0quKxDqcmVg2dUcLDjzf5stvC ymRKbPzPwd3EeDxtD5dt+ZBMRCXvtd0LuROKXjdN/KA4A98CgjIlGQcKyhL2OSHGz6hA izGo3P/mtV+QnC8VTIZ+awLhZrxVKXVUEj+y5QmavRKmswpyYIBT1FvX/7NqglG9AXDU vv5Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=I6jDBOvT; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bx26si1129940edb.588.2020.08.20.04.29.40; Thu, 20 Aug 2020 04:30:04 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=I6jDBOvT; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730137AbgHTL0E (ORCPT + 99 others); Thu, 20 Aug 2020 07:26:04 -0400 Received: from mail.kernel.org ([198.145.29.99]:35104 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730661AbgHTKGZ (ORCPT ); Thu, 20 Aug 2020 06:06:25 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 4DE462075E; Thu, 20 Aug 2020 10:06:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1597917984; bh=igrc9LS6KgOqAWwGySkc8AsRthglM0xdy+TPaKJVD3k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=I6jDBOvTtIZDVrHXhQ+Tk3gzRW64dr9JE4gPUNv8JTN4+7HNsfZssiWAOafcNu1G9 IeYTZqL8J4A6u84FX5ot+f724dO8tifC8t4g1l9FjDlK5SW5qLc+2XedtuqpddhwC1 Xf7WNel8LX97CqPYtD8UsAq0E9ZAZnD57T2ria04= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, =?UTF-8?q?=E5=BC=A0=E4=BA=91=E6=B5=B7?= , Yang Yingliang , Kyungtae Kim , linux-fbdev@vger.kernel.org, Linus Torvalds , Solar Designer , "Srivatsa S. Bhat" , Anthony Liguori , Bartlomiej Zolnierkiewicz , Jiri Slaby Subject: [PATCH 4.14 013/228] vgacon: Fix for missing check in scrollback handling Date: Thu, 20 Aug 2020 11:19:48 +0200 Message-Id: <20200820091608.192283912@linuxfoundation.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200820091607.532711107@linuxfoundation.org> References: <20200820091607.532711107@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Yunhai Zhang commit ebfdfeeae8c01fcb2b3b74ffaf03876e20835d2d upstream. vgacon_scrollback_update() always leaves enbough room in the scrollback buffer for the next call, but if the console size changed that room might not actually be enough, and so we need to re-check. The check should be in the loop since vgacon_scrollback_cur->tail is updated in the loop and count may be more than 1 when triggered by CSI M, as Jiri's PoC: #include #include #include #include #include #include #include int main(int argc, char** argv) { int fd = open("/dev/tty1", O_RDWR); unsigned short size[3] = {25, 200, 0}; ioctl(fd, 0x5609, size); // VT_RESIZE write(fd, "\e[1;1H", 6); for (int i = 0; i < 30; i++) write(fd, "\e[10M", 5); } It leads to various crashes as vgacon_scrollback_update writes out of the buffer: BUG: unable to handle page fault for address: ffffc900001752a0 #PF: supervisor write access in kernel mode #PF: error_code(0x0002) - not-present page RIP: 0010:mutex_unlock+0x13/0x30 ... Call Trace: n_tty_write+0x1a0/0x4d0 tty_write+0x1a0/0x2e0 Or to KASAN reports: BUG: KASAN: slab-out-of-bounds in vgacon_scroll+0x57a/0x8ed This fixes CVE-2020-14331. Reported-by: 张云海 Reported-by: Yang Yingliang Reported-by: Kyungtae Kim Fixes: 15bdab959c9b ([PATCH] vgacon: Add support for soft scrollback) Cc: stable@vger.kernel.org Cc: linux-fbdev@vger.kernel.org Cc: Linus Torvalds Cc: Solar Designer Cc: "Srivatsa S. Bhat" Cc: Anthony Liguori Cc: Yang Yingliang Cc: Bartlomiej Zolnierkiewicz Cc: Jiri Slaby Signed-off-by: Yunhai Zhang Link: https://lore.kernel.org/r/9fb43895-ca91-9b07-ebfd-808cf854ca95@nsfocus.com Signed-off-by: Greg Kroah-Hartman --- drivers/video/console/vgacon.c | 4 ++++ 1 file changed, 4 insertions(+) --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -246,6 +246,10 @@ static void vgacon_scrollback_update(str p = (void *) (c->vc_origin + t * c->vc_size_row); while (count--) { + if ((vgacon_scrollback_cur->tail + c->vc_size_row) > + vgacon_scrollback_cur->size) + vgacon_scrollback_cur->tail = 0; + scr_memcpyw(vgacon_scrollback_cur->data + vgacon_scrollback_cur->tail, p, c->vc_size_row);