ACK: [SRU Groovy,Focal/linux-oem-5.6] vt: Disable KD_FONT_OP_COPY
Kleber Souza
kleber.souza at canonical.com
Fri Dec 4 14:09:14 UTC 2020
On 03.12.20 22:23, Thadeu Lima de Souza Cascardo wrote:
> From: Daniel Vetter <daniel.vetter at ffwll.ch>
>
> It's buggy:
>
> On Fri, Nov 06, 2020 at 10:30:08PM +0800, Minh Yuan wrote:
>> We recently discovered a slab-out-of-bounds read in fbcon in the latest
>> kernel ( v5.10-rc2 for now ). The root cause of this vulnerability is that
>> "fbcon_do_set_font" did not handle "vc->vc_font.data" and
>> "vc->vc_font.height" correctly, and the patch
>> <https://lkml.org/lkml/2020/9/27/223> for VT_RESIZEX can't handle this
>> issue.
>>
>> Specifically, we use KD_FONT_OP_SET to set a small font.data for tty6, and
>> use KD_FONT_OP_SET again to set a large font.height for tty1. After that,
>> we use KD_FONT_OP_COPY to assign tty6's vc_font.data to tty1's vc_font.data
>> in "fbcon_do_set_font", while tty1 retains the original larger
>> height. Obviously, this will cause an out-of-bounds read, because we can
>> access a smaller vc_font.data with a larger vc_font.height.
>
> Further there was only one user ever.
> - Android's loadfont, busybox and console-tools only ever use OP_GET
> and OP_SET
> - fbset documentation only mentions the kernel cmdline font: option,
> not anything else.
> - systemd used OP_COPY before release 232 published in Nov 2016
>
> Now unfortunately the crucial report seems to have gone down with
> gmane, and the commit message doesn't say much. But the pull request
> hints at OP_COPY being broken
>
> https://github.com/systemd/systemd/pull/3651
>
> So in other words, this never worked, and the only project which
> foolishly every tried to use it, realized that rather quickly too.
>
> Instead of trying to fix security issues here on dead code by adding
> missing checks, fix the entire thing by removing the functionality.
>
> Note that systemd code using the OP_COPY function ignored the return
> value, so it doesn't matter what we're doing here really - just in
> case a lone server somewhere happens to be extremely unlucky and
> running an affected old version of systemd. The relevant code from
> font_copy_to_all_vcs() in systemd was:
>
> /* copy font from active VT, where the font was uploaded to */
> cfo.op = KD_FONT_OP_COPY;
> cfo.height = vcs.v_active-1; /* tty1 == index 0 */
> (void) ioctl(vcfd, KDFONTOP, &cfo);
>
> Note this just disables the ioctl, garbage collecting the now unused
> callbacks is left for -next.
>
> v2: Tetsuo found the old mail, which allowed me to find it on another
> archive. Add the link too.
>
> Acked-by: Peilin Ye <yepeilin.cs at gmail.com>
> Reported-by: Minh Yuan <yuanmingbuaa at gmail.com>
> References: https://lists.freedesktop.org/archives/systemd-devel/2016-June/036935.html
> References: https://github.com/systemd/systemd/pull/3651
> Cc: Greg KH <greg at kroah.com>
> Cc: Peilin Ye <yepeilin.cs at gmail.com>
> Cc: Tetsuo Handa <penguin-kernel at i-love.sakura.ne.jp>
> Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
> Link: https://lore.kernel.org/r/20201108153806.3140315-1-daniel.vetter@ffwll.ch
> Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
> (cherry picked from commit 3c4e0dff2095c579b142d5a0693257f1c58b4804)
> CVE-2020-28974
> Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo at canonical.com>
Acked-by: Kleber Sacilotto de Souza <kleber.souza at canonical.com>
> ---
> drivers/tty/vt/vt.c | 24 ++----------------------
> 1 file changed, 2 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
> index bb0623d60cc0..74e3945e7146 100644
> --- a/drivers/tty/vt/vt.c
> +++ b/drivers/tty/vt/vt.c
> @@ -4643,27 +4643,6 @@ static int con_font_default(struct vc_data *vc, struct console_font_op *op)
> return rc;
> }
>
> -static int con_font_copy(struct vc_data *vc, struct console_font_op *op)
> -{
> - int con = op->height;
> - int rc;
> -
> -
> - console_lock();
> - if (vc->vc_mode != KD_TEXT)
> - rc = -EINVAL;
> - else if (!vc->vc_sw->con_font_copy)
> - rc = -ENOSYS;
> - else if (con < 0 || !vc_cons_allocated(con))
> - rc = -ENOTTY;
> - else if (con == vc->vc_num) /* nothing to do */
> - rc = 0;
> - else
> - rc = vc->vc_sw->con_font_copy(vc, con);
> - console_unlock();
> - return rc;
> -}
> -
> int con_font_op(struct vc_data *vc, struct console_font_op *op)
> {
> switch (op->op) {
> @@ -4674,7 +4653,8 @@ int con_font_op(struct vc_data *vc, struct console_font_op *op)
> case KD_FONT_OP_SET_DEFAULT:
> return con_font_default(vc, op);
> case KD_FONT_OP_COPY:
> - return con_font_copy(vc, op);
> + /* was buggy and never really used */
> + return -EINVAL;
> }
> return -ENOSYS;
> }
>
More information about the kernel-team
mailing list