lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <4278ae8b-eb87-06ac-43af-41a1c741f9a9@amd.com>
Date:   Mon, 11 Apr 2022 13:58:00 -0500
From:   Tom Lendacky <thomas.lendacky@....com>
To:     Jacky Li <jackyli@...gle.com>,
        Brijesh Singh <brijesh.singh@....com>,
        John Allen <john.allen@....com>
Cc:     Herbert Xu <herbert@...dor.apana.org.au>,
        "David S. Miller" <davem@...emloft.net>,
        Marc Orr <marcorr@...gle.com>, Alper Gun <alpergun@...gle.com>,
        Peter Gonda <pgonda@...gle.com>, linux-crypto@...r.kernel.org,
        linux-kernel@...r.kernel.org
Subject: Re: [PATCH] crypto: ccp - Fix the INIT_EX data file open failure

On 4/11/22 13:00, Jacky Li wrote:
> There are 2 common cases when INIT_EX data file might not be
> opened successfully and fail the sev initialization:
> 
> 1. In user namespaces, normal user tasks (e.g. VMM) can change their
>     current->fs->root to point to arbitrary directories. While
>     init_ex_path is provided as a module param related to root file
>     system. Solution: use the root directory of init_task to avoid
>     accessing the wrong file.
> 
> 2. Normal user tasks (e.g. VMM) don't have the privilege to access
>     the INIT_EX data file. Solution: open the file as root and
>     restore permissions immediately.
> 
> Signed-off-by: Jacky Li <jackyli@...gle.com>

Should this have a Fixes: tag?

Thanks,
Tom

> ---
>   drivers/crypto/ccp/sev-dev.c | 30 ++++++++++++++++++++++++++++--
>   1 file changed, 28 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/crypto/ccp/sev-dev.c b/drivers/crypto/ccp/sev-dev.c
> index 6ab93dfd478a..3aefb177715e 100644
> --- a/drivers/crypto/ccp/sev-dev.c
> +++ b/drivers/crypto/ccp/sev-dev.c
> @@ -23,6 +23,7 @@
>   #include <linux/gfp.h>
>   #include <linux/cpufeature.h>
>   #include <linux/fs.h>
> +#include <linux/fs_struct.h>
>   
>   #include <asm/smp.h>
>   
> @@ -170,6 +171,31 @@ static void *sev_fw_alloc(unsigned long len)
>   	return page_address(page);
>   }
>   
> +static struct file *open_file_as_root(const char *filename, int flags, umode_t mode)
> +{
> +	struct file *fp;
> +	struct path root;
> +	struct cred *cred;
> +	const struct cred *old_cred;
> +
> +	task_lock(&init_task);
> +	get_fs_root(init_task.fs, &root);
> +	task_unlock(&init_task);
> +
> +	cred = prepare_creds();
> +	if (!cred)
> +		return ERR_PTR(-ENOMEM);
> +	cred->fsuid = GLOBAL_ROOT_UID;
> +	old_cred = override_creds(cred);
> +
> +	fp = file_open_root(&root, filename, flags, mode);
> +	path_put(&root);
> +
> +	revert_creds(old_cred);
> +
> +	return fp;
> +}
> +
>   static int sev_read_init_ex_file(void)
>   {
>   	struct sev_device *sev = psp_master->sev_data;
> @@ -181,7 +207,7 @@ static int sev_read_init_ex_file(void)
>   	if (!sev_init_ex_buffer)
>   		return -EOPNOTSUPP;
>   
> -	fp = filp_open(init_ex_path, O_RDONLY, 0);
> +	fp = open_file_as_root(init_ex_path, O_RDONLY, 0);
>   	if (IS_ERR(fp)) {
>   		int ret = PTR_ERR(fp);
>   
> @@ -217,7 +243,7 @@ static void sev_write_init_ex_file(void)
>   	if (!sev_init_ex_buffer)
>   		return;
>   
> -	fp = filp_open(init_ex_path, O_CREAT | O_WRONLY, 0600);
> +	fp = open_file_as_root(init_ex_path, O_CREAT | O_WRONLY, 0600);
>   	if (IS_ERR(fp)) {
>   		dev_err(sev->dev,
>   			"SEV: could not open file for write, error %ld\n",

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ