Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp2311369yba; Fri, 19 Apr 2019 17:02:44 -0700 (PDT) X-Google-Smtp-Source: APXvYqy5UZOnvAbg0+dZZgJM3d6FCzbqYK1jX7ZE9OLVYaqSSlvSWGttkt11Bv5JDfu7oqEdDbLy X-Received: by 2002:a63:f707:: with SMTP id x7mr6462589pgh.343.1555718564572; Fri, 19 Apr 2019 17:02:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1555718564; cv=none; d=google.com; s=arc-20160816; b=SR4OSHLAwXONmwW+RxwAuFoxMA5yqdwoNU7wRFARs+OerxWSx6vgTbJAswsmrzFmba vxThYxiIrFkBcvYe6cZvQ8f+0IC50HLplDSDljV6AsB0zLf0mcL/aELFEDdGOigvPmo0 2KI+3nX1jD5k8+oWmvOiuvo4BnL4zrVjmklcsPTJtubqf8lgTsnq3McS9LOJ4qJQJhZc BGcLyDOT0yRwTCRHKG8QLoEsTrOy9rn/koI+f+chiPjNeEWAvItpBwoTfilai8xgGlCU p1KCP5zSDwl4PVV+Mh/BQj/+RYoVobuSwSUqDpCAPDTw3MtqV+Z7Xakfjr+F8LxTIJSF Mg4g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=f4IpH+OdorCiIV78MiqY9yn/kZrpDm8mxQw2q8X3OwU=; b=lORP1TbkAyxgpC/3+ePXMxyvhfM8MnpPA05HppjRvySDRm2ozm5CtqZRqtlriEo815 7sopdSEND+qfvIY94cLG5LpWhl0ohnU+Hp6gEhUOxo6Lfr1dlLALAIldg5S6sZUxTJCR zTMNhArV7euJCh5KOTjalisDgXzqbK/Y5JNuBQLz8OmC4gnAn7T5/D+7pKXlBAvpr3I/ mLjW9PXyQooSbbjEiUSzZb5NExHAiCRmG9YAIuTTtHKH3MmqwkTpdr9EA58CENgw/yId u98zov42/y0fdsq2Cqp3ZygQoVwqt1ovGDCjiBCBYecPIIH1v9NFOT+8eXDtA0eaCPRw MwxQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=iqWDczWr; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g4si6668506plb.168.2019.04.19.17.02.25; Fri, 19 Apr 2019 17:02:44 -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=@gmail.com header.s=20161025 header.b=iqWDczWr; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727493AbfDTABI (ORCPT + 99 others); Fri, 19 Apr 2019 20:01:08 -0400 Received: from mail-pl1-f196.google.com ([209.85.214.196]:36719 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726357AbfDTABG (ORCPT ); Fri, 19 Apr 2019 20:01:06 -0400 Received: by mail-pl1-f196.google.com with SMTP id ck15so3220962plb.3; Fri, 19 Apr 2019 17:01:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=f4IpH+OdorCiIV78MiqY9yn/kZrpDm8mxQw2q8X3OwU=; b=iqWDczWr6v9A7mTL5Zs8v9D/ZrMB5CR2b+TGFVTf75HWr7pVl8f1H9m8FQozFYyx9T P4AVNSJ3KuLxLHAKiJha1xGb1b0JbgmwK2in87wVdfu34QyCR8VJn6EmROJvwqF7n0N0 XsvZazwWEh5rHmzuftE/c134UbXQGo8i8uztLEiMUHJ1WGizoHqHae63iyTlwzG5pk/g qniSOsSF97/hCHYSmbhB6kAWm8rTtQqoekHMh1zJ+GWn/eWj8u6JMqtgioPFuvcpLmwN JID/QxxGqXw3EXQMZK3naIiRQy1hv2V8u5N3135Kl56Lk9YZz09Z237AAg5OXRgTI2fM 3otw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=f4IpH+OdorCiIV78MiqY9yn/kZrpDm8mxQw2q8X3OwU=; b=Cjof8UPxH3b5kfoT9B8LkxHs/IK9AZWJMAyUdr98zcKstBXdDdtcYQ09+29SgFyHkk 15sgOiuojuZlGdKcM+3O2NbiIDsZbnEZ20t7Y9fApP5vCmeQ+QWMsOzoIc5cBY5EMCGU 6KdWL7CGGaHygOq0weJK54Pc4O4iSoemIEcfkKr37Vp0Lucz5M5HBcnn2YXvbQZluew1 xgO3z/mNNSgWPglD5ViEpk2VqID/0+vvw4aTK8l6Rm0CIdnaVh8UPylByzNGzhiXHi+K yUtuuY2c8SIE1aovnwAXaE2A+6GmBztTae/igPffe3/kMP/4i17tidd3IS0n/LGpiMK+ 75AA== X-Gm-Message-State: APjAAAVdNir8BrvuYbcCnzzh0UVmpDkifPh7C1/XRK4vMxhXWNoJRcsX DGnfFexB2vqiGDuzCKMYn1nK9OXq+S4= X-Received: by 2002:a17:902:2927:: with SMTP id g36mr6368660plb.6.1555718465534; Fri, 19 Apr 2019 17:01:05 -0700 (PDT) Received: from prsriva-linux.corp.microsoft.com ([2001:4898:80e8:2:5828:72bc:96ef:ce7c]) by smtp.gmail.com with ESMTPSA id f5sm6699142pgo.75.2019.04.19.17.01.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Apr 2019 17:01:04 -0700 (PDT) From: Prakhar Srivastava X-Google-Original-From: Prakhar Srivastava To: linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org Cc: zohar@linux.vnet.ibm.com, Prakhar Srivastava , Prakhar Srivastava Subject: [PATCHv2] since cmdline args can be same for multiple kexec, log entry hash will collide. Prepend the kernel file name to the cmdline args to distinguish between cmdline args passed to subsequent kexec calls Date: Fri, 19 Apr 2019 17:00:57 -0700 Message-Id: <20190420000057.5222-3-prsriva02@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190420000057.5222-1-prsriva02@gmail.com> References: <20190420000057.5222-1-prsriva02@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Prakhar Srivastava Signed-off-by: Prakhar Srivastava --- since cmdline args can be same for multiple kexec, log entry hash will collide. Prepend the kernel file name to the cmdline args to distinguish between cmdline args passed to subsequent kexec calls kernel/kexec_core.c | 57 +++++++++++++++++++++++++++++++++++++++++ kernel/kexec_file.c | 14 ++++++++-- kernel/kexec_internal.h | 3 +++ 3 files changed, 72 insertions(+), 2 deletions(-) diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c index ae1a3ba24df5..97b77c780311 100644 --- a/kernel/kexec_core.c +++ b/kernel/kexec_core.c @@ -1151,3 +1151,60 @@ void __weak arch_kexec_protect_crashkres(void) void __weak arch_kexec_unprotect_crashkres(void) {} + +/** + * kexec_cmdline_prepend_img_name - prepare the buffer with cmdline + * that needs to be measured + * @outbuf - out buffer that contains the formated string + * @kernel_fd - the file identifier for the kerenel image + * @cmdline_ptr - ptr to the cmdline buffer + * @cmdline_len - len of the buffer. + * + * This generates a buffer in the format Kerenelfilename::cmdline + * + * On success return 0. + * On failure return -EINVAL. + */ +int kexec_cmdline_prepend_img_name(char **outbuf, int kernel_fd, + const char *cmdline_ptr, + unsigned long cmdline_len) +{ + int ret = -EINVAL; + struct fd f = {}; + int size = 0; + char *buf = NULL; + char delimiter[] = "::"; + + if (!outbuf || !cmdline_ptr) + goto out; + + f = fdget(kernel_fd); + if (!f.file) + goto out; + + size = (f.file->f_path.dentry->d_name.len + cmdline_len - 1+ + ARRAY_SIZE(delimiter)) - 1; + + buf = kzalloc(size, GFP_KERNEL); + if (!buf) + goto out; + + memcpy(buf, f.file->f_path.dentry->d_name.name, + f.file->f_path.dentry->d_name.len); + memcpy(buf + f.file->f_path.dentry->d_name.len, + delimiter, ARRAY_SIZE(delimiter) - 1); + memcpy(buf + f.file->f_path.dentry->d_name.len + + ARRAY_SIZE(delimiter) - 1, + cmdline_ptr, cmdline_len - 1); + + *outbuf = buf; + ret = size; + + pr_debug("kexec cmdline buff: %s\n", buf); + +out: + if (f.file) + fdput(f); + + return ret; +} diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index 2a5234eb4b28..a487491d55b9 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c @@ -126,6 +126,8 @@ kimage_file_prepare_segments(struct kimage *image, int kernel_fd, int initrd_fd, int ret = 0; void *ldata; loff_t size; + char *buff_to_measure = NULL; + int buff_to_measure_size = 0; ret = kernel_read_file_from_fd(kernel_fd, &image->kernel_buf, &size, INT_MAX, READING_KEXEC_IMAGE); @@ -183,8 +185,13 @@ kimage_file_prepare_segments(struct kimage *image, int kernel_fd, int initrd_fd, goto out; } - ima_buffer_check(image->cmdline_buf, cmdline_len - 1, - "kexec_cmdline"); + /* IMA measures the cmdline args passed to the next kernel*/ + buff_to_measure_size = kexec_cmdline_prepend_img_name(&buff_to_measure, + kernel_fd, image->cmdline_buf, image->cmdline_buf_len); + + ima_buffer_check(buff_to_measure, buff_to_measure_size, + "kexec_cmdline"); + } /* Call arch image load handlers */ @@ -200,6 +207,9 @@ kimage_file_prepare_segments(struct kimage *image, int kernel_fd, int initrd_fd, /* In case of error, free up all allocated memory in this function */ if (ret) kimage_file_post_load_cleanup(image); + + kfree(buff_to_measure); + return ret; } diff --git a/kernel/kexec_internal.h b/kernel/kexec_internal.h index 799a8a452187..4d34a8ef4637 100644 --- a/kernel/kexec_internal.h +++ b/kernel/kexec_internal.h @@ -11,6 +11,9 @@ int kimage_load_segment(struct kimage *image, struct kexec_segment *segment); void kimage_terminate(struct kimage *image); int kimage_is_destination_range(struct kimage *image, unsigned long start, unsigned long end); +int kexec_cmdline_prepend_img_name(char **outbuf, int kernel_fd, + const char *cmdline_ptr, + unsigned long cmdline_len); extern struct mutex kexec_mutex; -- 2.17.1