From patchwork Wed Apr 10 19:08:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Fernandes X-Patchwork-Id: 10894537 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C63AC17E1 for ; Wed, 10 Apr 2019 19:08:54 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B055328B8E for ; Wed, 10 Apr 2019 19:08:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A421C28B93; Wed, 10 Apr 2019 19:08:54 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.3 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from mother.openwall.net (mother.openwall.net [195.42.179.200]) by mail.wl.linuxfoundation.org (Postfix) with SMTP id 8694A28B8E for ; Wed, 10 Apr 2019 19:08:53 +0000 (UTC) Received: (qmail 28640 invoked by uid 550); 10 Apr 2019 19:08:51 -0000 Mailing-List: contact kernel-hardening-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Delivered-To: mailing list kernel-hardening@lists.openwall.com Received: (qmail 28609 invoked from network); 10 Apr 2019 19:08:51 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joelfernandes.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=8MLZ+t6ETSfRle4Yyv8Mm0sNY1lMjkcgD31AFFbnzGI=; b=mAmKGVVliYohNshCebOGyJXdNnT43u/87bX4lv2U011EPP6yc131xXdOTkqgDjm7OR 2bBlnuIERechK8bCubXNkOWMRumNUdgt/9mPfTGKuHJ+7KCMx2nAqUC68Jsdy/0tPqwS jLDL2n2QsVXVNPSoaq/CxBzgKixt98UA2PBTQ= 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:mime-version :content-transfer-encoding; bh=8MLZ+t6ETSfRle4Yyv8Mm0sNY1lMjkcgD31AFFbnzGI=; b=F3sOv6n+G3dT+JpTH94sjwOyui/5xHqELEIMHTO001BWCvjJeS9RFGbSBzREIbHwsS Ch7r7vvDzHOBhTTPOQLy7XLAk87VxILQPVyHQjITOk8Hu+PW55et6gNiMhmc0DfdmpHS 5eVOryYwmNi44ZNJ6+8GJCD/kvK/xsNPog7egelSnZ0LdJGRIYLREXPdqgUyUCuNlFJd wEJhiXFUlM9RUQqvm3xwJEwJZ5Igs/1GbDoU5uhk0EJnRIXvXrgbt05QSo9UJnXFpeMM yenH9Ce5JUCYp0nKLUGXg26CsYQkLW0deBpi2PstQkbNmBLHYh8/m/KS+OUE5ndoSvVK mimg== X-Gm-Message-State: APjAAAWANbmabuaaOmBpvNWTypkuq9Q/2Ni/8VOgf/Kdiub681kdZ+S3 gs+mZLPcGSycErZSwN9yp1xfKA== X-Google-Smtp-Source: APXvYqzDqdN+0RxHkfe+U3K1sjSDbZdx15C05NwTwL+PwOR4SFz+tMlJS5PgpUFZ+icJYUk6Tsp7zQ== X-Received: by 2002:a62:1a0d:: with SMTP id a13mr45887924pfa.198.1554923318525; Wed, 10 Apr 2019 12:08:38 -0700 (PDT) From: "Joel Fernandes (Google)" To: linux-kernel@vger.kernel.org Cc: "Joel Fernandes (Google)" , paulmck@linux.vnet.ibm.com, rostedt@goodmis.org, mathieu.desnoyers@efficios.com, rcu@vger.kernel.org, kernel-hardening@lists.openwall.com, kernel-team@android.com, keescook@chromium.org, Jessica Yu Subject: [PATCH v2 1/3] module: Prepare for addition of new ro_after_init sections Date: Wed, 10 Apr 2019 15:08:21 -0400 Message-Id: <20190410190823.109172-1-joel@joelfernandes.org> X-Mailer: git-send-email 2.21.0.392.gf8f6787159e-goog MIME-Version: 1.0 X-Virus-Scanned: ClamAV using ClamSMTP For the purposes of hardening modules by adding sections to ro_after_init sections, prepare for addition of new ro_after_init entries which we do in future patches. Create a table to which new entries could be added later. This makes it less error prone and reduce code duplication. Cc: paulmck@linux.vnet.ibm.com Cc: rostedt@goodmis.org Cc: mathieu.desnoyers@efficios.com Cc: rcu@vger.kernel.org Cc: kernel-hardening@lists.openwall.com Cc: kernel-team@android.com Suggested-by: keescook@chromium.org Reviewed-by: keescook@chromium.org Acked-by: rostedt@goodmis.org Signed-off-by: Joel Fernandes (Google) --- kernel/module.c | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/kernel/module.c b/kernel/module.c index 524da609c884..1acddb93282a 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -3300,11 +3300,27 @@ static bool blacklisted(const char *module_name) } core_param(module_blacklist, module_blacklist, charp, 0400); +/* + * Mark ro_after_init section with SHF_RO_AFTER_INIT so that + * layout_sections() can put it in the right place. + * Note: ro_after_init sections also have SHF_{WRITE,ALLOC} set. + */ +static char *ro_after_init_sections[] = { + ".data..ro_after_init", + + /* + * __jump_table structures are never modified, with the exception of + * entries that refer to code in the __init section, which are + * annotated as such at module load time. + */ + "__jump_table", +}; + static struct module *layout_and_allocate(struct load_info *info, int flags) { struct module *mod; unsigned int ndx; - int err; + int err, i; err = check_modinfo(info->mod, info, flags); if (err) @@ -3319,23 +3335,12 @@ static struct module *layout_and_allocate(struct load_info *info, int flags) /* We will do a special allocation for per-cpu sections later. */ info->sechdrs[info->index.pcpu].sh_flags &= ~(unsigned long)SHF_ALLOC; - /* - * Mark ro_after_init section with SHF_RO_AFTER_INIT so that - * layout_sections() can put it in the right place. - * Note: ro_after_init sections also have SHF_{WRITE,ALLOC} set. - */ - ndx = find_sec(info, ".data..ro_after_init"); - if (ndx) - info->sechdrs[ndx].sh_flags |= SHF_RO_AFTER_INIT; - /* - * Mark the __jump_table section as ro_after_init as well: these data - * structures are never modified, with the exception of entries that - * refer to code in the __init section, which are annotated as such - * at module load time. - */ - ndx = find_sec(info, "__jump_table"); - if (ndx) - info->sechdrs[ndx].sh_flags |= SHF_RO_AFTER_INIT; + /* Set sh_flags for read-only after init sections */ + for (i = 0; ro_after_init_sections[i]; i++) { + ndx = find_sec(info, ro_after_init_sections[i]); + if (ndx) + info->sechdrs[ndx].sh_flags |= SHF_RO_AFTER_INIT; + } /* Determine total sizes, and put offsets in sh_entsize. For now this is done generically; there doesn't appear to be any