On Fri, 2024-03-01 at 08:39 -0600, Seth Forshee (DigitalOcean) wrote: > On Fri, Mar 01, 2024 at 10:19:13AM +0100, Roberto Sassu wrote: > > On Wed, 2024-02-21 at 15:24 -0600, Seth Forshee (DigitalOcean) wrote: > > > Support the new fscaps security hooks by converting the vfs_caps to raw > > > xattr data and then handling them the same as other xattrs. > > > > Hi Seth > > > > I started looking at this patch set. > > > > The first question I have is if you are also going to update libcap > > (and also tar, I guess), since both deal with the raw xattr. > > There are no changes needed for userspace; it will still deal with raw > xattrs. As I mentioned in the cover letter, capabilities tests from > libcap2, libcap-ng, ltp, and xfstests all pass against this sereies. > That's with no modifications to userspace. Yes, figured it out after applying the patch set. Then yes, IMA/EVM tests should work too. > > From IMA/EVM perspective (Mimi will add on that), I guess it is > > important that files with a signature/HMAC continue to be accessible > > after applying this patch set. > > > > Looking at the code, it seems the case (if I understood correctly, > > vfs_getxattr_alloc() is still allowed). > > So this is something that would change based on Christian's request to > stop using the xattr handlers entirely for fscaps as was done for acls. > I see how this would impact EVM, but we should be able to deal with it. > > I am a little curious now about this code in evm_calc_hmac_or_hash(): > > size = vfs_getxattr_alloc(&nop_mnt_idmap, dentry, xattr->name, > &xattr_value, xattr_size, GFP_NOFS); > if (size == -ENOMEM) { > error = -ENOMEM; > goto out; > } > if (size < 0) > continue; > > user_space_size = vfs_getxattr(&nop_mnt_idmap, dentry, > xattr->name, NULL, 0); > if (user_space_size != size) > pr_debug("file %s: xattr %s size mismatch (kernel: %d, user: %d)\n", > dentry->d_name.name, xattr->name, size, > user_space_size); > > Because with the current fscaps code you actually could end up getting > different sizes from these two interfaces, as vfs_getxattr_alloc() reads > the xattr directly from disk but vfs_getxattr() goes through > cap_inode_getsecurity(), which may do conversion between v2 and v3 > formats which are different sizes. Yes, that was another source of confusion. It happened that security.selinux in the disk was without '\0', and the one from vfs_getxattr() had it (of course the HMAC wouldn't match). So, basically, you set something in user space and you get something different. Example: # setfattr -n security.selinux -v "unconfined_u:object_r:admin_home_t:s0" test-file SELinux active: # getfattr -m - -d -e hex test-file security.selinux=0x756e636f6e66696e65645f753a6f626a6563745f723a61646d696e5f686f6d655f743a733000 Smack active: # getfattr -m - -d -e hex test-file security.selinux=0x756e636f6e66696e65645f753a6f626a6563745f723a61646d696e5f686f6d655f743a7330 evmctl (will) allow to provide a hex xattr value for fscaps. That should be the one to be used (and vfs_getxattr_alloc() does that). However, I guess if the conversion happens, evmctl cannot correctly verify anymore the file, unless the same string is specified for verification (otherwise it reads the xattr through vfs_getxattr(), which would be different). Roberto