From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1C51AC433B4 for ; Wed, 5 May 2021 06:25:37 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 9598C613C0 for ; Wed, 5 May 2021 06:25:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9598C613C0 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id C34116B006C; Wed, 5 May 2021 02:25:35 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id BE4F96B006E; Wed, 5 May 2021 02:25:35 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A5DB26B0070; Wed, 5 May 2021 02:25:35 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0027.hostedemail.com [216.40.44.27]) by kanga.kvack.org (Postfix) with ESMTP id 8777A6B006C for ; Wed, 5 May 2021 02:25:35 -0400 (EDT) Received: from smtpin33.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 35D0E3643 for ; Wed, 5 May 2021 06:25:35 +0000 (UTC) X-FDA: 78106191030.33.7676881 Received: from mail-pg1-f178.google.com (mail-pg1-f178.google.com [209.85.215.178]) by imf01.hostedemail.com (Postfix) with ESMTP id 9F7815001536 for ; Wed, 5 May 2021 06:25:22 +0000 (UTC) Received: by mail-pg1-f178.google.com with SMTP id y32so1059140pga.11 for ; Tue, 04 May 2021 23:25:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=R97okrrT1ZR3nAmwWW6z4OxB86R8rXbhMKoQVYu9dd4=; b=ns8vvV1Qo1QZc0J0GCqe2q2V5F0oFWwYAmbWDMmx7uVV7+gwRXWIDYJREfCKTuxZs2 wIqUtWMg6NwDe/gc16gCZL7CPHrQcl845Wr7bS9w0L9Igv5JLk8cXPN/m8SY78GMkIXt /G/Zy48px0xpleaxPam7W4wMLM3zxCYEEQd94= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=R97okrrT1ZR3nAmwWW6z4OxB86R8rXbhMKoQVYu9dd4=; b=OEKxoR4DT8J141nf8Psr/bP9uMw8iF5xhjaSqeSGhPYT6ezz/hTAY8DfSjMZz3XZIe kZrAjAmndhIgZZgjxgWQeVD0jTJTagi+P10kLWaPuvfet1leocGt9ieQWpxJJM7a+PTA 1C4AYf3Tq27Zcnxvc6ijUrmnQM9Nrvr4X67shRLMmiQeO4jwYE87jGtsqmdy+I7ia0os 3FrbZjblJTMJG3/y4opoJUmHYAwwZ4ohjLWZyqhzHZ3HOgf6g5zCKkaHBFB9TgKgDGYV 4m4dK4SgVjaadDhfKViIu1bzOGCB5naR0CjC1mBxwzPneJxNmy0gJ9/0NO+B17kuDG2d BeAw== X-Gm-Message-State: AOAM533M6bU8F/8N1wx7l5n69fj/B0okf41PgLa1IO9NaEaNTQG8mcT7 1Jedl43xH4CaOtWHHhFhs0noiQ== X-Google-Smtp-Source: ABdhPJyyFwabQwvnS1ulWRW160zd3aj383RgdjKZyVc1Alzp4aC2H+g6nFGuTTkCJgHz/TUp24HBww== X-Received: by 2002:a63:8f15:: with SMTP id n21mr26183891pgd.366.1620195933437; Tue, 04 May 2021 23:25:33 -0700 (PDT) Received: from www.outflux.net (smtp.outflux.net. [198.145.64.163]) by smtp.gmail.com with ESMTPSA id d18sm5588407pgo.66.2021.05.04.23.25.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 May 2021 23:25:32 -0700 (PDT) Date: Tue, 4 May 2021 23:25:31 -0700 From: Kees Cook To: Rick Edgecombe Cc: dave.hansen@intel.com, luto@kernel.org, peterz@infradead.org, linux-mm@kvack.org, x86@kernel.org, akpm@linux-foundation.org, linux-hardening@vger.kernel.org, kernel-hardening@lists.openwall.com, ira.weiny@intel.com, rppt@kernel.org, dan.j.williams@intel.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH RFC 0/9] PKS write protected page tables Message-ID: <202105042253.ECBBF6B6@keescook> References: <20210505003032.489164-1-rick.p.edgecombe@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20210505003032.489164-1-rick.p.edgecombe@intel.com> Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=ns8vvV1Q; dmarc=pass (policy=none) header.from=chromium.org; spf=pass (imf01.hostedemail.com: domain of keescook@chromium.org designates 209.85.215.178 as permitted sender) smtp.mailfrom=keescook@chromium.org X-Stat-Signature: axjaxwsi3fh5qpno9oeonb5bn5q517bn X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: 9F7815001536 Received-SPF: none (chromium.org>: No applicable sender policy available) receiver=imf01; identity=mailfrom; envelope-from=""; helo=mail-pg1-f178.google.com; client-ip=209.85.215.178 X-HE-DKIM-Result: pass/pass X-HE-Tag: 1620195922-803617 Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Tue, May 04, 2021 at 05:30:23PM -0700, Rick Edgecombe wrote: > This is a POC for write protecting page tables with PKS (Protection Key= s for=20 > Supervisor) [1]. The basic idea is to make the page tables read only, e= xcept=20 > temporarily on a per-cpu basis when they need to be modified. I=E2=80=99= m looking for=20 > opinions on whether people like the general direction of this in terms = of=20 > value and implementation. Yay! > Why would people want this? > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D > Page tables are the basis for many types of protections and as such, ar= e a=20 > juicy target for attackers. Mapping them read-only will make them harde= r to=20 > use in attacks. >=20 > This protects against an attacker that has acquired the ability to writ= e to=20 > the page tables. It's not foolproof because an attacker who can execute= =20 > arbitrary code can either disable PKS directly, or simply call the same= =20 > functions that the kernel uses for legitimate page table writes. I think it absolutely has value. The exploit techniques I'm aware of that target the page table are usually attempting to upgrade an arbitrary write into execution (e.g. write to kernel text after setting kernel text writable in the page table) or similar "data only" attacks (make sensitive page writable). It looks like PKS-protected page tables would be much like the RO-protected text pages in the sense that there is already code in the kernel to do things to make it writable, change text, and set it read-only again (alternatives, ftrace, etc). That said, making the PKS manipulation code be inline to page-writing code would make it less available for ROP/JOP, if an attack DID want to go that route. > Why use PKS for this? > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > PKS is an upcoming CPU feature that allows supervisor virtual memory=20 > permissions to be changed without flushing the TLB, like PKU does for u= ser=20 > memory. Protecting page tables would normally be really expensive becau= se you=20 > would have to do it with paging itself. PKS helps by providing a way to= toggle=20 > the writability of the page tables with just a per-cpu MSR. The per-cpu-ness is really important for both performance and for avoidin= g temporal attacks where an arbitrary write in one CPU is timed against a page table write in another CPU. > Performance impacts > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > Setting direct map permissions on whatever random page gets allocated f= or a=20 > page table would result in a lot of kernel range shootdowns and direct = map=20 > large page shattering. So the way the PKS page table memory is created = is=20 > similar to this module page clustering series[2], where a cache of page= s is=20 > replenished from 2MB pages such that the direct map permissions and ass= ociated=20 > breakage is localized on the direct map. In the PKS page tables case, a= PKS=20 > key is pre-applied to the direct map for pages in the cache. >=20 > There would be some costs of memory overhead in order to protect the di= rect=20 > map page tables. There would also be some extra kernel range shootdowns= to=20 > replenish the cache on occasion, from setting the PKS key on the direct= map of=20 > the new pages. I don=E2=80=99t have any actual performance data yet. What CPU models are expected to have PKS? > This is based on V6 [1] of the core PKS infrastructure patches. PKS=20 > infrastructure follow-on=E2=80=99s are planned to enable keys to be set= to the same=20 > permissions globally. Since this usage needs a key to be set globally=20 > read-only by default, a small temporary solution is hacked up in patch = 8. Long=20 > term, PKS protected page tables would use a better and more generic sol= ution=20 > to achieve this. >=20 > [1] https://lore.kernel.org/lkml/20210401225833.566238-1-ira.weiny@inte= l.com/ Ah, neat! > [2] https://lore.kernel.org/lkml/20210405203711.1095940-1-rick.p.edgeco= mbe@intel.com/ Ooh. What does this do for performance? It sounds like less TLB pressure, IIUC? --=20 Kees Cook