Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753621AbdFVVDb (ORCPT ); Thu, 22 Jun 2017 17:03:31 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:45623 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753582AbdFVVD3 (ORCPT ); Thu, 22 Jun 2017 17:03:29 -0400 Subject: Re: [PATCH 0/3] Enable namespaced file capabilities To: Casey Schaufler , ebiederm@xmission.com, containers@lists.linux-foundation.org References: <1498157989-11814-1-git-send-email-stefanb@linux.vnet.ibm.com> <70a09f1b-e82c-a25c-9325-d5d757b1b695@schaufler-ca.com> <10fb9c1b-e9af-336c-9a1b-cf95259cfaf3@linux.vnet.ibm.com> <2bf08b3e-27f4-3592-d5e2-a823401ac644@schaufler-ca.com> Cc: lkp@01.org, xiaolong.ye@intel.com, linux-kernel@vger.kernel.org, zohar@linux.vnet.ibm.com, serge@hallyn.com, tycho@docker.com, James.Bottomley@HansenPartnership.com, christian.brauner@mailbox.org, vgoyal@redhat.com, amir73il@gmail.com, linux-security-module@vger.kernel.org From: Stefan Berger Date: Thu, 22 Jun 2017 17:03:15 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: <2bf08b3e-27f4-3592-d5e2-a823401ac644@schaufler-ca.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-TM-AS-GCONF: 00 x-cbid: 17062221-0008-0000-0000-000008141DF4 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00007273; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000214; SDB=6.00878445; UDB=6.00437707; IPR=6.00658584; BA=6.00005437; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00015927; XFM=3.00000015; UTC=2017-06-22 21:03:26 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17062221-0009-0000-0000-000042BF4CD2 Message-Id: <916bbb77-1758-8c15-36f1-9d530f79abdc@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-06-22_08:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1703280000 definitions=main-1706220360 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4407 Lines: 81 On 06/22/2017 04:33 PM, Casey Schaufler wrote: > On 6/22/2017 1:12 PM, Stefan Berger wrote: >> On 06/22/2017 03:59 PM, Casey Schaufler wrote: >>> On 6/22/2017 11:59 AM, Stefan Berger wrote: >>>> This series of patches primary goal is to enable file capabilities >>>> in user namespaces without affecting the file capabilities that are >>>> effective on the host. This is to prevent that any unprivileged user >>>> on the host maps his own uid to root in a private namespace, writes >>>> the xattr, and executes the file with privilege on the host. >>>> >>>> We achieve this goal by writing extended attributes with a different >>>> name when a user namespace is used. If for example the root user >>>> in a user namespace writes the security.capability xattr, the name >>>> of the xattr that is actually written is encoded as >>>> security.capability@uid=1000 for root mapped to uid 1000 on the host. >>> You need to identify the instance of the user namespace for >>> this to work right on a system with multiple user namespaces. >>> If I have a shared filesystem mounted in two different user >>> namespaces a change by one will affect the other. >> Two different user namespaces with different uid mappings will not affect each other. > But two namespaces with the same uid mapping will, and I > don't think this meets the principle of least astonishment. > I also object to associating capabilities with UIDs. The > whole point of capabilities is to disassociate UID 0 from > privilege. What you've done is explicitly associate a UID > with the ability to have privilege. That's an architectural > regression. It has privilege within the bounding set of the capabilities that it is given. Afaik, a process cannot gain additional capabilities through file capabilities. Allowing to set a process's file capabilities allows one to _restrict_ what it can do, which is useful for shared filesystems where I can now set my ping capabilities to cap_net_raw, overriding the ones one the host which could be cap_net_admin+cap_net_raw. So I don't need to extend my bounding set with cap_net_admin or mess with xattrs on the host. > >> If root in userns1 mapped to uid 1000 (size 1000) writes security.capability, it will write security.capability@uid=1000 into the fs. >> If root in userns2 mapped to uid 2000 (size 1000) writes security.capability, it will write security.capability@uid=2000 into the fs. >> >> Neither of the two will see each other's security.capability, but each will see their own 'security.capability'. >> >> Assume now userns1 has a size of 2000, so overlapping with userns2, it will now see userns2's security.capability@uid=1000 as well as its own 'security.capability'. security.capability@uid=1000 (of userns2) in userns1 will not have an effect on effective file capabilities. >> >>> ... unless I'm missing something obvious about namespace behavior. >>> >>>> When listing the xattrs on the host, the existing security.capability >>>> as well as the security.capability@uid=1000 will be shown. Inside the >>>> namespace only 'security.capability', with the value of >>>> security.capability@uid=1000, is visible. >>>> >>>> To maintain compatibility with existing behavior, the value of >>>> security.capability of the host is shown inside the user namespace >>>> once the security.capability of the user namespace has been removed >>>> (which really removes security.capability@uid=1000). Writing to >>>> an extended attribute inside a user namespace effectively hides the >>>> extended attribute of the host. >>>> >>>> The general framework that is established with these patches can >>>> be applied to other extended attributes as well, such as security.ima >>>> or the 'trusted.' prefix . Another extended attribute that needed to >>>> be enabled here is 'security.selinux,' since otherwise this extended >>>> attribute would not be shown anymore inside a user namespace. >>>> >>>> Regards, >>>> Stefan & Serge >>>> >>>> >>>> Stefan Berger (3): >>>> xattr: Enable security.capability in user namespaces >>>> Enable capabilities of files from shared filesystem >>>> Enable security.selinux in user namespaces >>>> >>>> fs/xattr.c | 472 ++++++++++++++++++++++++++++++++++++++++++++++- >>>> security/commoncap.c | 36 +++- >>>> security/selinux/hooks.c | 9 +- >>>> 3 files changed, 501 insertions(+), 16 deletions(-) >>>> >>