Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751969AbdF1OEY (ORCPT ); Wed, 28 Jun 2017 10:04:24 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:40968 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751533AbdF1OES (ORCPT ); Wed, 28 Jun 2017 10:04:18 -0400 Subject: Re: [PATCH 0/3] Enable namespaced file capabilities To: Amir Goldstein , "Serge E. Hallyn" References: <1498157989-11814-1-git-send-email-stefanb@linux.vnet.ibm.com> <20170628054138.GA15939@mail.hallyn.com> Cc: "Eric W. Biederman" , Linux Containers , lkp@01.org, xiaolong.ye@intel.com, linux-kernel , Mimi Zohar , Tycho Andersen , James Bottomley , christian.brauner@mailbox.org, Vivek Goyal , LSM List , Casey Schaufler From: Stefan Berger Date: Wed, 28 Jun 2017 10:04:11 -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: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-TM-AS-GCONF: 00 x-cbid: 17062814-0008-0000-0000-0000024FADED X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00007290; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000214; SDB=6.00879929; UDB=6.00438606; IPR=6.00660084; BA=6.00005445; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00015991; XFM=3.00000015; UTC=2017-06-28 14:04:16 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17062814-0009-0000-0000-000035D502B3 Message-Id: X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-06-28_09:,, 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-1706280227 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4239 Lines: 105 On 06/28/2017 03:18 AM, Amir Goldstein wrote: > On Wed, Jun 28, 2017 at 8:41 AM, Serge E. Hallyn wrote: >> On Fri, Jun 23, 2017 at 10:01:46AM +0300, Amir Goldstein wrote: >>> On Thu, Jun 22, 2017 at 9:59 PM, 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. >>>> 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. >>>> >>> Am I the only one who thinks that suffix is perhaps not the best grammar >>> to use for this namespace? >>> xattrs are clearly namespaced by prefix, so it seems right to me to keep >>> it that way - define a new special xattr namespace "ns" and only if that >>> prefix exists, the @uid suffix will be parsed. >>> This could be either ns.security.capability@uid=1000 or >>> ns@uid=1000.security.capability. The latter seems more correct to me, >>> because then we will be able to namespace any xattr without having to >>> protect from "unprivileged xattr injection", i.e.: >>> setfattr -n "user.whatever.foo@uid=0" >>> >>> Amir. >> Hi Amir, >> >> I was liking the prefix at first, but I'm actually not sure it's worth >> it. THe main advantage would be so that checking for namespace or other >> tags could be done always at the same offset simplifying the parser. >> But since we will want to only handle namespacing for some tags, and >> potentially differently for each task, it won't actually be simpler, I >> don't think. >> >> On the other hand we do want to make sure that the syntax we use is >> generally usable, so I think simply specifying that >1 tags can each >> be separate by '@' should suffice. So for now we'd only have > Serge, > > I am not sure I am parsing what you are saying correctly (pun intended). > Can you give some examples of xattr names with several @. > >> security.capability@uid=100000 >> >> soon we'd hopefully have >> >> security.ima@uid=100000 >> > IIUC, the xattr names above should be parsed as: > > security.(([ima|capability])@(uid=100000) > >> and eventually trusted.blarb@foo=bar >> > But the trusted xattr name should be parsed as: > > (trusted.blarb)@(uid=100000) > > Otherwise it won't be able to pass the xattr_is_trusted() test > which looks only at the trusted prefix. To be precise, it looks at 'trusted.', including the dot. > > So we can write it like this, if it makes sense for the parser: > trusted@uid=100000.blarb For the parser I think it would be easier to parse what Serge is proposing, and it would pass the existing xattr_is_trusted() call. > > But I don't think that trusted.foo should have a different > userns behavior than trusted.bar down the road. > > Admittedly, I am not so much of a security developer myself, > so I prefer to let Casey be the spokesman for the '.ns' prefix. > Casey's proposal seems right to me: > > security.ns@uid=1000@@.capability > > We can also stick to a more conventional syntax of a perfect > new namespace 'security.ns', which encapsulates the unprivileged > xattr name completely. This should suffice perfectly for the current > capability V3 needs and is flexible enough to be extended later: > > security.ns.user.1000.security.capability > OR: > security.ns@uid=1000@@.security.capability > > And going forward, just as easy: > > security.ns.user.1000.[trusted|system|user].foo > > Amir. >