Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp3507540pxb; Mon, 4 Apr 2022 19:12:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzIyAxy0SkWEhLxaPBbzFzOuH90weKx/IrBI7esTYOOlwVSRAmZGy8ce5/MDOnNClJLtbPD X-Received: by 2002:a05:6a00:2408:b0:4f7:a8cb:9b63 with SMTP id z8-20020a056a00240800b004f7a8cb9b63mr1165462pfh.33.1649124764255; Mon, 04 Apr 2022 19:12:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649124764; cv=none; d=google.com; s=arc-20160816; b=roXy5kYftGqxF8lxjMumzBXI8BGclEFgnoeH6ekITAEzYp3H3Q4QZZLUlvd6PDa9GN ONC5L+5QYPbsqUY7QouPEkh7YLJjYMkJwq/Qdpl53XwdolMvGanQD9zOhhKvHYU7IgDs F5PsqhtZI7w8Bgc3FQP49KqWfzdPSRSXY1WNLyTuQWtW/JZU+vWvKdQXLtYz3n0SNXdn PfU0bmnmFHcNEx3KlvjcXF1eNnSXFu0VzqqiSiQjlU/q9DlJzt44zHLMKx5luB1p4Yiw FywpWP1vx81o4aZBwvWIah5Ptz/Bg5rf9oTA4P/8wljT7dTvRKCphU+7mua3UoG0XvvC Eb4A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:from:subject :mime-version:message-id:date:dkim-signature; bh=7OKq+V4z+/z7bE/KfbCOq7/YDmk7SsCN1GtNgHHkIig=; b=tMY8GtLOZ9OirtrwU23j71CFI9GYnjDbxQHrozfmEJUuuojm+ads6sFKeUOgQz0f8j L41GmlN1CRXxzG4WBWMsMEw+qgeSD0NL8/ANTwQiLXG+/2uZYvYC/0BL6GYlW5DNmOBZ mSUW0kiG42ZcPxhCJB0lo38lyb3/anDN6zjwFglj/rO9z9WulmkrG+nYZ/yfoiIPP2uz HoKbwDri2clgC+R7YRCB6aYUEvCxmcz3YSVOCWQKUL16VAQrhBz3rEEG6VRYOG4E8vrb RCE/O/RlAF6Kg1ZBAW+P2DkesJBnJxrgIwakxfrRU/HFhGMdc6O76C/x0aiLZ/yifJwb WOSQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=AtyjSLuY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id lp5-20020a17090b4a8500b001bf040acc3dsi705589pjb.170.2022.04.04.19.12.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Apr 2022 19:12:44 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=AtyjSLuY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id B89FD267F95; Mon, 4 Apr 2022 17:35:57 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1357295AbiDDFsx (ORCPT + 99 others); Mon, 4 Apr 2022 01:48:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58856 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242595AbiDDFsu (ORCPT ); Mon, 4 Apr 2022 01:48:50 -0400 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8EE49326D3 for ; Sun, 3 Apr 2022 22:46:55 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id i16-20020a170902cf1000b001540b6a09e3so2966466plg.0 for ; Sun, 03 Apr 2022 22:46:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:message-id:mime-version:subject:from:to:cc :content-transfer-encoding; bh=7OKq+V4z+/z7bE/KfbCOq7/YDmk7SsCN1GtNgHHkIig=; b=AtyjSLuY+l6HPOeH/KuqQffpRiID3JGX0i/TDY0yvoxMAh9n2YwfYGd9O+mOSnlRhk wyw8XpPe5n77k93t2vlcShIfIRTk6NfQ/f26eDb+3fmcewm90TZ5wsj8MgM7D+r6OB/F RhdRW4G1C0rNDW+P/X+mYSmJzTShZF/pB+RG89EpnKdDJMCKOkcJPT8P8RM8JOQO7lal FwGk9ljHm6NCwphOHqNhXUC+4FHRTQIN7r1S0p6XEJDiQGV0md6FRDq+GvdLUiZnWu54 4CNWEQ6SXJ1wNRvmuvGMEKxGt6Hwzi84hpiFjjFQ7RCcd7sc1DJZeuov4Yq3ipbJTPtq oYEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc :content-transfer-encoding; bh=7OKq+V4z+/z7bE/KfbCOq7/YDmk7SsCN1GtNgHHkIig=; b=tiWah8JPOXWFdbbsY5HrO+y4aaLQvvvrcjNaY8QLTb3ZTFrLa7m0A/ZIqAC4K5HwQG CYIGie9lM7slCAMXCVAJat4g/mAtJtLaYPUKdFu+BRVfjEyCRAFLfYgDy4CLkOxz/bIZ rnJIvlecDctiFIHiN+o12Zrf7PKefnodBZmHy0wcHOeueTCkI5aReiZAIvnxadh3GAF0 WHPatdJlRzxr+dThZQs9E24oRNAt7hQm2BAaw7znYsUMWGHeZW02oNKm8OFI4Fn+1hyk xvb5zqHi+0kcSWSEUlGRgK6NJBDKA3Jgt0npWh8IoUM3SoJsRU8wgs/VRWltTJ64JQQ1 VDvw== X-Gm-Message-State: AOAM531ruOljLROFkjd9TrEZmzPiC3TbQ9IUmERi49pNMLQIipL8s7W4 BnM3N+VhqpFDFg8ihuXhWTRn0ddz8Q== X-Received: from tweek-sin.c.googlers.com ([fda3:e722:ac3:cc00:4f:4b78:c0a8:2bfd]) (user=tweek job=sendgmr) by 2002:a17:90a:db48:b0:1ca:ab67:d75 with SMTP id u8-20020a17090adb4800b001caab670d75mr61873pjx.1.1649051214731; Sun, 03 Apr 2022 22:46:54 -0700 (PDT) Date: Mon, 4 Apr 2022 15:46:42 +1000 Message-Id: <20220404054642.3095732-1-tweek@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.35.1.1094.g7c7d902a7c-goog Subject: [PATCH] firmware_loader: use kernel credentials when reading firmware From: "=?UTF-8?q?Thi=C3=A9baud=20Weksteen?=" To: Luis Chamberlain Cc: Jeffrey Vander Stoep , Saravana Kannan , Alistair Delva , Adam Shih , Greg Kroah-Hartman , selinux@vger.kernel.org, linux-kernel@vger.kernel.org, "=?UTF-8?q?Thi=C3=A9baud=20Weksteen?=" Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-9.5 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE, USER_IN_DEF_DKIM_WL autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Device drivers may decide to not load firmware when probed to avoid slowing down the boot process should the firmware filesystem not be available yet. In this case, the firmware loading request may be done when a device file associated with the driver is first accessed. The credentials of the userspace process accessing the device file may be used to validate access to the firmware files requested by the driver. Ensure that the kernel assumes the responsibility of reading the firmware. This was observed on Android for a graphic driver loading their firmware when the device file (e.g. /dev/mali0) was first opened by userspace (i.e. surfaceflinger). The security context of surfaceflinger was used to validate the access to the firmware file (e.g. /vendor/firmware/mali.bin). Because previous configurations were relying on the userspace fallback mechanism, the security context of the userspace daemon (i.e. ueventd) was consistently used to read firmware files. More devices are found to use the command line argument firmware_class.path which gives the kernel the opportunity to read the firmware directly, hence surfacing this misattribution. Signed-off-by: Thi=C3=A9baud Weksteen --- drivers/base/firmware_loader/main.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_lo= ader/main.c index 94d1789a233e..416ee3cc6584 100644 --- a/drivers/base/firmware_loader/main.c +++ b/drivers/base/firmware_loader/main.c @@ -735,6 +735,8 @@ _request_firmware(const struct firmware **firmware_p, c= onst char *name, size_t offset, u32 opt_flags) { struct firmware *fw =3D NULL; + struct cred *kern_cred =3D NULL; + const struct cred *old_cred; bool nondirect =3D false; int ret; =20 @@ -751,6 +753,13 @@ _request_firmware(const struct firmware **firmware_p, = const char *name, if (ret <=3D 0) /* error or already assigned */ goto out; =20 + kern_cred =3D prepare_kernel_cred(NULL); + if (!kern_cred) { + ret =3D -ENOMEM; + goto out; + } + old_cred =3D override_creds(kern_cred); + ret =3D fw_get_filesystem_firmware(device, fw->priv, "", NULL); =20 /* Only full reads can support decompression, platform, and sysfs. */ @@ -776,6 +785,8 @@ _request_firmware(const struct firmware **firmware_p, c= onst char *name, } else ret =3D assign_fw(fw, device); =20 + revert_creds(old_cred); + out: if (ret < 0) { fw_abort_batch_reqs(fw); --=20 2.35.1.1094.g7c7d902a7c-goog