Received: by 2002:a05:6a10:1a4d:0:0:0:0 with SMTP id nk13csp1727081pxb; Wed, 9 Feb 2022 03:14:34 -0800 (PST) X-Google-Smtp-Source: ABdhPJwTHpoGq97PC6CFrCFsgGADem9zw09vPteKs0+cuzTHeObWR7xSrmK9JKH8M/EIkMU8kBpB X-Received: by 2002:a17:90a:2e87:: with SMTP id r7mr1951236pjd.61.1644405274669; Wed, 09 Feb 2022 03:14:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1644405274; cv=none; d=google.com; s=arc-20160816; b=MVNBuK5d1q8RubguG9KgzgCIOOTMGbwkHmMrNegLvIjwdTcgX4lpUxryl79PM1Jhvv QX2Wvu3lwlbzqjHK9kUyO8oDhinHut0X/ja0KuvYHvkdzIlB7RKYlVn/i3c6foQYAIX0 n3rpgxlf+Twu4l+SZGnn1XrhV8SF95jrsk5xBRhjjqnNCTvtLE2Sjo62y2sA1aDKF4Yt FRymDbkiqScCtDAJSK5/TU0o96gqc5TXVFn7YmHHKStBKFgj3n61j1bu+wI9sqM3SIiC z2k44u38G8jxu+6+e7faR3Fww51kMal5CRsxyFSnWRTHWmWBVcpd4hq48CZxXuYKVAmo 6tow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:subject:from:cc:to :content-language:user-agent:mime-version:date:message-id; bh=Hgok7wFl8cMvF0H6fMGEIz1KCBKSYIxn1EjoBQqiFB8=; b=gfBv0XH+Nmn4FJtiMt2Ge93qvsO2MJwBd4sSMwnnrp3fTjfuNBHCsG/A2x2yQjrwKY d3g07huASjlHDx6laAtFjKuCqGLVWlCdIRucoBJJdO46lOuS8WbIbhvgr3F0dNPj1PD7 9ogTXrElcBXfhhXbe2vNo0JGJe5KPXx/KdHFxmKUu7RBQQFbVlTRu314m4L2MkBlnm1j pM/9BzvhE09NvimB/oyUMATf6J54c3CyWWlDxfQw22yD7nk+dP0U1BJbkvijUYEeA45w bNIUQ2CKXXvt2uBpUQZikuxoSUCz5Pq/HBcFmVMxL3Ij0g0wJieGek/NwkoY9Cre4748 rRmA== ARC-Authentication-Results: i=1; mx.google.com; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id s7si14351446plq.462.2022.02.09.03.14.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Feb 2022 03:14:34 -0800 (PST) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id E57DDE067869; Wed, 9 Feb 2022 01:43:35 -0800 (PST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352076AbiBHIx2 (ORCPT + 99 others); Tue, 8 Feb 2022 03:53:28 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46478 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231657AbiBHIxY (ORCPT ); Tue, 8 Feb 2022 03:53:24 -0500 Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 70ED3C03FEC0; Tue, 8 Feb 2022 00:53:23 -0800 (PST) Received: from dggpemm500024.china.huawei.com (unknown [172.30.72.54]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4JtGwh4xFCzbkKJ; Tue, 8 Feb 2022 16:52:20 +0800 (CST) Received: from [10.67.110.173] (10.67.110.173) by dggpemm500024.china.huawei.com (7.185.36.203) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 8 Feb 2022 16:53:20 +0800 Message-ID: Date: Tue, 8 Feb 2022 16:53:20 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.4.0 Content-Language: en-US To: Mimi Zohar CC: Roberto Sassu , "linux-integrity@vger.kernel.org" , "linux-kernel@vger.kernel.org" , , wangweiyang , "xiujianfeng@huawei.com" From: "Guozihua (Scott)" Subject: Problem with commit ccf11dbaa07b ("evm: Fix memleak in init_desc") Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [10.67.110.173] X-ClientProxiedBy: dggems706-chm.china.huawei.com (10.3.19.183) To dggpemm500024.china.huawei.com (7.185.36.203) X-CFilter-Loop: Reflected X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE 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 Hi Mimi, I found an issue with commit ccf11dbaa07b ("evm: Fix memleak in init_desc"). This commit tries to free variable "tmp_tfm" if something went wrong after the "alloc" label in function init_desc, which would potentially cause a user-after-free issue The codes are as follows: 1 static struct shash_desc *init_desc(char type, uint8_t hash_algo) 2 { 3 long rc; 4 const char *algo; 5 struct crypto_shash **tfm, *tmp_tfm = NULL; 6 struct shash_desc *desc; 7 8 if (type == EVM_XATTR_HMAC) { 9 if (!(evm_initialized & EVM_INIT_HMAC)) { 10 pr_err_once("HMAC key is not set\n"); 11 return ERR_PTR(-ENOKEY); 12 } 13 tfm = &hmac_tfm; 14 algo = evm_hmac; 15 } else { 16 if (hash_algo >= HASH_ALGO__LAST) 17 return ERR_PTR(-EINVAL); 18 19 tfm = &evm_tfm[hash_algo]; 20 algo = hash_algo_name[hash_algo]; 21 } 22 23 if (*tfm) 24 goto alloc; 25 mutex_lock(&mutex); 26 if (*tfm) 27 goto unlock; 28 29 tmp_tfm = crypto_alloc_shash(algo, 0, CRYPTO_NOLOAD); 30 if (IS_ERR(tmp_tfm)) { 31 pr_err("Can not allocate %s (reason: %ld)\n", algo, 32 PTR_ERR(tmp_tfm)); 33 mutex_unlock(&mutex); 34 return ERR_CAST(tmp_tfm); 35 } 36 if (type == EVM_XATTR_HMAC) { 37 rc = crypto_shash_setkey(tmp_tfm, evmkey, evmkey_len); 38 if (rc) { 39 crypto_free_shash(tmp_tfm); 40 â‹…mutex_unlock(&mutex); 41 return ERR_PTR(rc); 42 } 43 } 44 *tfm = tmp_tfm; 45 unlock: 46 mutex_unlock(&mutex); 47 alloc: 48 desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(*tfm), 49 GFP_KERNEL); 50 if (!desc) { 51 crypto_free_shash(tmp_tfm); 52 return ERR_PTR(-ENOMEM); 53 } 54 55 desc->tfm = *tfm; 56 57 rc = crypto_shash_init(desc); 58 if (rc) { 59 crypto_free_shash(tmp_tfm); 60 kfree(desc); 61 return ERR_PTR(rc); 62 } 63 return desc; 64 } As we can see, variable *tfm points to one of the two global variable hmac_tfm or evm_tfm[hash_algo]. tmp_tfm is used as an intermediate variable for initializing these global variables. Freeing tmp_tfm after line 44 would invalidate these global variables and potentially cause a user-after-free issue. I think this commit should be reverted. Reference: commit 843385694721 ("evm: Fix a small race in init_desc()") -- Best GUO Zihua