From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934656AbbKSULO (ORCPT ); Thu, 19 Nov 2015 15:11:14 -0500 Received: from mail-io0-f173.google.com ([209.85.223.173]:34354 "EHLO mail-io0-f173.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933886AbbKSULM (ORCPT ); Thu, 19 Nov 2015 15:11:12 -0500 MIME-Version: 1.0 In-Reply-To: <20151110150829.GC3156@quack.suse.cz> References: <20151104065820.GF21740@1wt.eu> <20151108020206.GA3880@thunk.org> <20151110150829.GC3156@quack.suse.cz> Date: Thu, 19 Nov 2015 12:11:11 -0800 X-Google-Sender-Auth: aDchzxR8t0PSDoj3NktIh5PuCjk Message-ID: Subject: Re: [RFC] namei: prevent sgid-hardlinks for unmapped gids From: Kees Cook To: Jan Kara Cc: "Theodore Ts'o" , Andy Lutomirski , Theodore Tso , Willy Tarreau , Dirk Steinmetz , Michael Kerrisk-manpages , Serge Hallyn , Seth Forshee , Alexander Viro , Linux FS Devel , LKML , "Eric W . Biederman" , Serge Hallyn , "security@kernel.org" Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Nov 10, 2015 at 7:08 AM, Jan Kara wrote: > On Sat 07-11-15 21:02:06, Ted Tso wrote: >> On Fri, Nov 06, 2015 at 09:05:57PM -0800, Kees Cook wrote: >> > >>>> They're certainly not used early enough -- we need to remove suid when >> > >>>> the page becomes writable via mmap (wp_page_shared), not when >> > >>>> writeback happens, or at least not only when writeback happens. >> > >>> >> > >>> Well, I'm shy about the change there. For example, we don't strip in >> > >>> on open(RDWR), just on write(). >> > >> >> > >> I take it back. Hooking wp_page_shared looks expensive. :) Maybe we do >> > >> need to hook the mmap? >> > > >> > > But file_update_time already pokes at the same (or nearby) cachelines, >> > > I think -- why would it be expensive? The whole thing could be >> > > guarded by if (unlikely(is setuid)), right? >> > >> > Yeah, true. I added file_remove_privs calls near all the >> > file_update_time calls, to no effect. Added to wp_page_shared too, >> > nothing. Hmmm. >> >> Why not put the the should_remove_suid() call in >> filemap_page_mkwrite(), or maybe do_page_mkwrite()? > > page_mkwrite() callbacks are IMHO the right place for this check (and > change). Just next to file_update_time() call. You get proper filesystem Should file_update_time() just be modified to include file_remove_privs()? They seem to regularly go together. > freezing protection etc. As Ted properly mentions filemap_page_mkwrite() is > one place you want to hook into but quite a few filesystems (most notably > ext4, xfs, btrfs) overload ->page_mkwrite() callbacks to their own > functions so each filesystem that does this needs to be updated > separately... Depending on each filesystem to do this correctly seems like a mistake. I was surprised that my attempts (via file_update_time and wp_page_shared) didn't work. Any other suggestions? -Kees -- Kees Cook Chrome OS & Brillo Security