Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp2475484imm; Mon, 28 May 2018 08:48:03 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpQVq4eelxK6mCqps8VfoafZbC/e/yS9SjxkKEs1WsOaZJ5twYLvcEwlZVOO+vnURRha3NQ X-Received: by 2002:a63:a902:: with SMTP id u2-v6mr10956195pge.169.1527522483040; Mon, 28 May 2018 08:48:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527522483; cv=none; d=google.com; s=arc-20160816; b=hW2qgzv/79l/YwLaBHMNGQUEnQ9+NdJ6EHG8UJ9URLCVM8TDenPhGj0D7I4RkJZNcg Rr3A+dgAcj/Hy/k00wi+21MKzOdLA+BL2qgZaWCfwmG8kqoYE2ifH06/qqBMLC22+WKF 5T8hjiRRN9X/soX6xAWD/huoT4byOoGoG3Da9WV362aVAuhWpxYnJSOQLXnDHc71Iv91 /hvTAiLTfhudVG/SVyhKe5NQ3MVafSl8AKigQ6Rrqy68KCXxW02sZq4iAH8TU0ntmCZt lQHEDDuJdtsNBFhrYqkAkJRyMQbcUQ0ei4YstNWigyRk2+v2sUPdLNbX0P5Fr3O4FLDl sl+Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=BR8siK87udhb2FrEx+89ihqwfy3V3xXg7NBn2rYFu7s=; b=JKZrmILx0I2pJxfAGbpWvf2PTfV+N0ib1iiwC8+ANUROwL5imKC9tZugCflV5jAhNs k7yNIorxRcEig7K4EeJ9KxWPaiJXUKkrVeq8o8ln7EPDkeMwjdzhS3py5BjKujx1db7e OLH/ZJ5VaFwJNe39AzAtGw2jw05gqIBA+lG8D93Z/iEJ60M4x80oO0aueDQC2kGOO7Bq 2rNEYez/0Vr40B5y71VBpDuTxHWLbsDYWBycJQZqjRKAMivbiVSl8fMbGdISHpjsW1KG SDM40AX/ZutVFE+16RnR/TqKKIF5surdKLto8aWsAlZkLKfgoSIvFas75sCEpwOdVIPK +7TQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=sRnr6hag; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t3-v6si28854587pfh.101.2018.05.28.08.47.48; Mon, 28 May 2018 08:48:02 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=sRnr6hag; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S969233AbeE1PqJ (ORCPT + 99 others); Mon, 28 May 2018 11:46:09 -0400 Received: from mail.kernel.org ([198.145.29.99]:36972 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S968571AbeE1KQu (ORCPT ); Mon, 28 May 2018 06:16:50 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) (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 DDC6A2086D; Mon, 28 May 2018 10:16:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1527502609; bh=dFFDHl7jOJIrv3fdYehfWi8NaOTQMwTyOGoPWugY/5g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sRnr6hagk7ojr+56MSHqIDN8kSb2c7+sPZWiEPgr4CLmWDgPbxhZY/qvj6WwQzK3+ GVtfpjHCRusCNBffbbGyQ6eC6V3TOFY5lY+Xt16KPxb8NthNjEZpDKqJR+oYykp2XZ teWd1Rpw3JBYTqPzLcpDAeYTYrjgKue/ugv64xKE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Alexey Dobriyan , Pavel Emelyanov , Andrei Vagin , Andrew Morton , Linus Torvalds , Sasha Levin Subject: [PATCH 4.4 063/268] proc: fix /proc/*/map_files lookup Date: Mon, 28 May 2018 12:00:37 +0200 Message-Id: <20180528100209.066625799@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180528100202.045206534@linuxfoundation.org> References: <20180528100202.045206534@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.4-stable review patch. If anyone has any objections, please let me know. ------------------ From: Alexey Dobriyan [ Upstream commit ac7f1061c2c11bb8936b1b6a94cdb48de732f7a4 ] Current code does: if (sscanf(dentry->d_name.name, "%lx-%lx", start, end) != 2) However sscanf() is broken garbage. It silently accepts whitespace between format specifiers (did you know that?). It silently accepts valid strings which result in integer overflow. Do not use sscanf() for any even remotely reliable parsing code. OK # readlink '/proc/1/map_files/55a23af39000-55a23b05b000' /lib/systemd/systemd broken # readlink '/proc/1/map_files/ 55a23af39000-55a23b05b000' /lib/systemd/systemd broken # readlink '/proc/1/map_files/55a23af39000-55a23b05b000 ' /lib/systemd/systemd very broken # readlink '/proc/1/map_files/1000000000000000055a23af39000-55a23b05b000' /lib/systemd/systemd Andrei said: : This patch breaks criu. It was a bug in criu. And this bug is on a minor : path, which works when memfd_create() isn't available. It is a reason why : I ask to not backport this patch to stable kernels. : : In CRIU this bug can be triggered, only if this patch will be backported : to a kernel which version is lower than v3.16. Link: http://lkml.kernel.org/r/20171120212706.GA14325@avx2 Signed-off-by: Alexey Dobriyan Cc: Pavel Emelyanov Cc: Andrei Vagin Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- fs/proc/base.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -94,6 +94,8 @@ #include "internal.h" #include "fd.h" +#include "../../lib/kstrtox.h" + /* NOTE: * Implementing inode permission operations in /proc is almost * certainly an error. Permission checks need to happen during @@ -1836,8 +1838,33 @@ end_instantiate: static int dname_to_vma_addr(struct dentry *dentry, unsigned long *start, unsigned long *end) { - if (sscanf(dentry->d_name.name, "%lx-%lx", start, end) != 2) + const char *str = dentry->d_name.name; + unsigned long long sval, eval; + unsigned int len; + + len = _parse_integer(str, 16, &sval); + if (len & KSTRTOX_OVERFLOW) + return -EINVAL; + if (sval != (unsigned long)sval) return -EINVAL; + str += len; + + if (*str != '-') + return -EINVAL; + str++; + + len = _parse_integer(str, 16, &eval); + if (len & KSTRTOX_OVERFLOW) + return -EINVAL; + if (eval != (unsigned long)eval) + return -EINVAL; + str += len; + + if (*str != '\0') + return -EINVAL; + + *start = sval; + *end = eval; return 0; }