Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp1954636imm; Thu, 27 Sep 2018 05:18:14 -0700 (PDT) X-Google-Smtp-Source: ACcGV63EmAJgc//A1bdbQdnhk4dosOVPU0lUzFoGYDa2oaKjHdcuKNqHZHyNs9cD/uPt7bseDwpC X-Received: by 2002:a63:844:: with SMTP id 65-v6mr10155535pgi.144.1538050694353; Thu, 27 Sep 2018 05:18:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538050694; cv=none; d=google.com; s=arc-20160816; b=Ww+z1/VyzcU5ylxFZ6ZRs4BLneTGaKzwoGM/MdbqjClbWbVe5NM5cNe16h78yEf5+O +6WX1dFu69mRkVlTsNuQxKTWd1W4cmzj64kH+tLv1Mzhr19QpGPwbU/DZptT57QjMiZu rBz1muNEpwiHv+reMo7nw/VJhD1HgFu0QhPpH5twWiNdkzruxWsNcE1eEb/Ju1HfDdLL Rn3kF3DdI1gg5tb3GB6NprEYdG4yS2870iNZhfdWiXAqQcgpql/v/VMxGymRN9zPZ0rr ZzTiODEX8Jo/4MKMhn3pP39nCJOhozt5j4PFyLY+3IJg91sfBxxT4qJ9FdOfkz6PICNl 6EUg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:content-transfer-encoding :mime-version:references:in-reply-to:date:cc:to:from:subject; bh=DX+YKVoUY6Z8xsUxm61hfvWJI1rXzrYXUT+ngxODqWg=; b=q8gE8XJ5cF3kknPE7XsmW0GKbCJQ+pACMzQNUO/Mmpjk+Cs03RpRULY2qbgOlDarXe 44ZhzY+HNUh8RyMWFBTQNhEwDLgLEkvFBX41m8vDD9KUlpCUCW6O056GOWnKXO1nKoTk lgC9wKbPhrFIWV1VU3N89Djr/DTsYAq0RugOygIVYcyqeCdgpzvmiAEzPbRulRYjBL04 Fz1qvfLp/xRf9SxP6TYF4YMYARffyF5e95Fg4VWGlBiy9AYazw+YITtel0CugoyLNEFK utFegn0DcnWP1xNHbLKgl6cF1Q9EZhN7cbMisKh7jBGi37JlW5W2UlGZ+BpAL7WX9BrJ zcBw== ARC-Authentication-Results: i=1; mx.google.com; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z17-v6si1915685pgc.653.2018.09.27.05.17.58; Thu, 27 Sep 2018 05:18:14 -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; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727467AbeI0SfK (ORCPT + 99 others); Thu, 27 Sep 2018 14:35:10 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:39866 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727393AbeI0SfK (ORCPT ); Thu, 27 Sep 2018 14:35:10 -0400 Received: from pps.filterd (m0098393.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w8RCGPnd012308 for ; Thu, 27 Sep 2018 08:17:08 -0400 Received: from e06smtp07.uk.ibm.com (e06smtp07.uk.ibm.com [195.75.94.103]) by mx0a-001b2d01.pphosted.com with ESMTP id 2mrwh14xm1-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Thu, 27 Sep 2018 08:17:08 -0400 Received: from localhost by e06smtp07.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 27 Sep 2018 13:17:05 +0100 Received: from b06cxnps3074.portsmouth.uk.ibm.com (9.149.109.194) by e06smtp07.uk.ibm.com (192.168.101.137) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Thu, 27 Sep 2018 13:17:01 +0100 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w8RCH0nW60358864 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 27 Sep 2018 12:17:00 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B7B5311C04C; Thu, 27 Sep 2018 15:16:40 +0100 (BST) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CD3D111C050; Thu, 27 Sep 2018 15:16:39 +0100 (BST) Received: from localhost.localdomain (unknown [9.80.85.160]) by d06av25.portsmouth.uk.ibm.com (Postfix) with ESMTP; Thu, 27 Sep 2018 15:16:39 +0100 (BST) Subject: Re: [PATCH v4 3/6] ima: refactor ima_init_policy() From: Mimi Zohar To: Nayna Jain , linux-integrity@vger.kernel.org Cc: linux-security-module@vger.kernel.org, linux-efi@vger.kernel.org, linux-kernel@vger.kernel.org, dhowells@redhat.com, jforbes@redhat.com Date: Thu, 27 Sep 2018 08:16:48 -0400 In-Reply-To: <20180926122210.14642-4-nayna@linux.vnet.ibm.com> References: <20180926122210.14642-1-nayna@linux.vnet.ibm.com> <20180926122210.14642-4-nayna@linux.vnet.ibm.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.20.5 (3.20.5-1.fc24) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 x-cbid: 18092712-0028-0000-0000-000002FF523C X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18092712-0029-0000-0000-000023B970EB Message-Id: <1538050608.3459.83.camel@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-09-27_06:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1807170000 definitions=main-1809270122 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 2018-09-26 at 17:52 +0530, Nayna Jain wrote: > This patch removes the code duplication in ima_init_policy() by defining > a new function named add_rules(). Thanks!  The patch looks good, but let's expand on this just a bit. Rules can be added to the initial IMA policy, the custom policy or both, based on a mask (IMA_DEFAULT_POLICY, IMA_CUSTOM_POLICY). Mimi > > Signed-off-by: Nayna Jain > --- > security/integrity/ima/ima_policy.c | 98 +++++++++++++++++++++---------------- > 1 file changed, 57 insertions(+), 41 deletions(-) > > diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c > index 8c9499867c91..d5b327320d3a 100644 > --- a/security/integrity/ima/ima_policy.c > +++ b/security/integrity/ima/ima_policy.c > @@ -58,6 +58,8 @@ enum lsm_rule_types { LSM_OBJ_USER, LSM_OBJ_ROLE, LSM_OBJ_TYPE, > > enum policy_types { ORIGINAL_TCB = 1, DEFAULT_TCB }; > > +enum policy_rule_list { IMA_DEFAULT_POLICY = 1, IMA_CUSTOM_POLICY }; > + > struct ima_rule_entry { > struct list_head list; > int action; > @@ -473,6 +475,33 @@ static int ima_appraise_flag(enum ima_hooks func) > return 0; > } > > +static void add_rules(struct ima_rule_entry *entries, int count, > + enum policy_rule_list file) > +{ > + int i = 0; > + > + for (i = 0; i < count; i++) { > + struct ima_rule_entry *entry; > + > + if (file & IMA_DEFAULT_POLICY) > + list_add_tail(&entries[i].list, &ima_default_rules); > + > + if (file & IMA_CUSTOM_POLICY) { > + entry = kmemdup(&entries[i], sizeof(*entry), > + GFP_KERNEL); > + if (!entry) > + continue; > + > + INIT_LIST_HEAD(&entry->list); > + list_add_tail(&entry->list, &ima_policy_rules); > + } > + if (entries[i].action == APPRAISE) > + temp_ima_appraise |= ima_appraise_flag(entries[i].func); > + if (entries[i].func == POLICY_CHECK) > + temp_ima_appraise |= IMA_APPRAISE_POLICY; > + } > +} > + > /** > * ima_init_policy - initialize the default measure rules. > * > @@ -481,28 +510,23 @@ static int ima_appraise_flag(enum ima_hooks func) > */ > void __init ima_init_policy(void) > { > - int i, measure_entries, appraise_entries, secure_boot_entries; > - > - /* if !ima_policy set entries = 0 so we load NO default rules */ > - measure_entries = ima_policy ? ARRAY_SIZE(dont_measure_rules) : 0; > - appraise_entries = ima_use_appraise_tcb ? > - ARRAY_SIZE(default_appraise_rules) : 0; > - secure_boot_entries = ima_use_secure_boot ? > - ARRAY_SIZE(secure_boot_rules) : 0; > + int build_appraise_entries; > > - for (i = 0; i < measure_entries; i++) > - list_add_tail(&dont_measure_rules[i].list, &ima_default_rules); > + /* if !ima_policy, we load NO default rules */ > + if (ima_policy) > + add_rules(dont_measure_rules, ARRAY_SIZE(dont_measure_rules), > + IMA_DEFAULT_POLICY); > > switch (ima_policy) { > case ORIGINAL_TCB: > - for (i = 0; i < ARRAY_SIZE(original_measurement_rules); i++) > - list_add_tail(&original_measurement_rules[i].list, > - &ima_default_rules); > + add_rules(original_measurement_rules, > + ARRAY_SIZE(original_measurement_rules), > + IMA_DEFAULT_POLICY); > break; > case DEFAULT_TCB: > - for (i = 0; i < ARRAY_SIZE(default_measurement_rules); i++) > - list_add_tail(&default_measurement_rules[i].list, > - &ima_default_rules); > + add_rules(default_measurement_rules, > + ARRAY_SIZE(default_measurement_rules), > + IMA_DEFAULT_POLICY); > default: > break; > } > @@ -511,38 +535,30 @@ void __init ima_init_policy(void) > * Insert the builtin "secure_boot" policy rules requiring file > * signatures, prior to any other appraise rules. > */ > - for (i = 0; i < secure_boot_entries; i++) { > - list_add_tail(&secure_boot_rules[i].list, &ima_default_rules); > - temp_ima_appraise |= > - ima_appraise_flag(secure_boot_rules[i].func); > - } > + if (ima_use_secure_boot) > + add_rules(secure_boot_rules, ARRAY_SIZE(secure_boot_rules), > + IMA_DEFAULT_POLICY); > > /* > * Insert the build time appraise rules requiring file signatures > * for both the initial and custom policies, prior to other appraise > - * rules. > + * rules. As the secure boot rules includes all of the build time > + * rules, include either one or the other set of rules, but not both. > */ > - for (i = 0; i < ARRAY_SIZE(build_appraise_rules); i++) { > - struct ima_rule_entry *entry; > - > - if (!secure_boot_entries) > - list_add_tail(&build_appraise_rules[i].list, > - &ima_default_rules); > - > - entry = kmemdup(&build_appraise_rules[i], sizeof(*entry), > - GFP_KERNEL); > - if (entry) > - list_add_tail(&entry->list, &ima_policy_rules); > - build_ima_appraise |= > - ima_appraise_flag(build_appraise_rules[i].func); > + build_appraise_entries = ARRAY_SIZE(build_appraise_rules); > + if (build_appraise_entries) { > + if (ima_use_secure_boot) > + add_rules(build_appraise_rules, build_appraise_entries, > + IMA_CUSTOM_POLICY); > + else > + add_rules(build_appraise_rules, build_appraise_entries, > + IMA_DEFAULT_POLICY | IMA_CUSTOM_POLICY); > } > > - for (i = 0; i < appraise_entries; i++) { > - list_add_tail(&default_appraise_rules[i].list, > - &ima_default_rules); > - if (default_appraise_rules[i].func == POLICY_CHECK) > - temp_ima_appraise |= IMA_APPRAISE_POLICY; > - } > + if (ima_use_appraise_tcb) > + add_rules(default_appraise_rules, > + ARRAY_SIZE(default_appraise_rules), > + IMA_DEFAULT_POLICY); > > ima_rules = &ima_default_rules; > ima_update_policy_flag();