12 Sep, 2024

1 commit

  • [ Upstream commit e86cac0acdb1a74f608bacefe702f2034133a047 ]

    When a process accept()s connection from a unix socket
    (either stream or seqpacket)
    it gets the socket with the label of the connecting process.

    For example, if a connecting process has a label 'foo',
    the accept()ed socket will also have 'in' and 'out' labels 'foo',
    regardless of the label of the listener process.

    This is because kernel creates unix child sockets
    in the context of the connecting process.

    I do not see any obvious way for the listener to abuse
    alien labels coming with the new socket, but,
    to be on the safe side, it's better fix new socket labels.

    Signed-off-by: Konstantin Andreev
    Signed-off-by: Casey Schaufler
    Signed-off-by: Sasha Levin

    Konstantin Andreev
     

08 Sep, 2024

1 commit

  • [ Upstream commit 2fe209d0ad2e2729f7e22b9b31a86cc3ff0db550 ]

    Currently, Smack mirrors the label of incoming tcp/ipv4 connections:
    when a label 'foo' connects to a label 'bar' with tcp/ipv4,
    'foo' always gets 'foo' in returned ipv4 packets. So,
    1) returned packets are incorrectly labeled ('foo' instead of 'bar')
    2) 'bar' can write to 'foo' without being authorized to write.

    Here is a scenario how to see this:

    * Take two machines, let's call them C and S,
    with active Smack in the default state
    (no settings, no rules, no labeled hosts, only builtin labels)

    * At S, add Smack rule 'foo bar w'
    (labels 'foo' and 'bar' are instantiated at S at this moment)

    * At S, at label 'bar', launch a program
    that listens for incoming tcp/ipv4 connections

    * From C, at label 'foo', connect to the listener at S.
    (label 'foo' is instantiated at C at this moment)
    Connection succeedes and works.

    * Send some data in both directions.
    * Collect network traffic of this connection.

    All packets in both directions are labeled with the CIPSO
    of the label 'foo'. Hence, label 'bar' writes to 'foo' without
    being authorized, and even without ever being known at C.

    If anybody cares: exactly the same happens with DCCP.

    This behavior 1st manifested in release 2.6.29.4 (see Fixes below)
    and it looks unintentional. At least, no explanation was provided.

    I changed returned packes label into the 'bar',
    to bring it into line with the Smack documentation claims.

    Signed-off-by: Konstantin Andreev
    Signed-off-by: Casey Schaufler
    Signed-off-by: Sasha Levin

    Casey Schaufler
     

04 Sep, 2024

1 commit

  • commit 76a0e79bc84f466999fa501fce5bf7a07641b8a7 upstream.

    Marek Gresko reports that the root user on an NFS client is able to
    change the security labels on files on an NFS filesystem that is
    exported with root squashing enabled.

    The end of the kerneldoc comment for __vfs_setxattr_noperm() states:

    * This function requires the caller to lock the inode's i_mutex before it
    * is executed. It also assumes that the caller will make the appropriate
    * permission checks.

    nfsd_setattr() does do permissions checking via fh_verify() and
    nfsd_permission(), but those don't do all the same permissions checks
    that are done by security_inode_setxattr() and its related LSM hooks do.

    Since nfsd_setattr() is the only consumer of security_inode_setsecctx(),
    simplest solution appears to be to replace the call to
    __vfs_setxattr_noperm() with a call to __vfs_setxattr_locked(). This
    fixes the above issue and has the added benefit of causing nfsd to
    recall conflicting delegations on a file when a client tries to change
    its security label.

    Cc: stable@kernel.org
    Reported-by: Marek Gresko
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=218809
    Signed-off-by: Scott Mayhew
    Tested-by: Stephen Smalley
    Reviewed-by: Stephen Smalley
    Reviewed-by: Chuck Lever
    Reviewed-by: Jeff Layton
    Acked-by: Casey Schaufler
    Signed-off-by: Paul Moore
    Signed-off-by: Greg Kroah-Hartman

    Scott Mayhew
     

11 Jul, 2024

1 commit

  • commit 9a95c5bfbf02a0a7f5983280fe284a0ff0836c34 upstream.

    A panic happens in ima_match_policy:

    BUG: unable to handle kernel NULL pointer dereference at 0000000000000010
    PGD 42f873067 P4D 0
    Oops: 0000 [#1] SMP NOPTI
    CPU: 5 PID: 1286325 Comm: kubeletmonit.sh
    Kdump: loaded Tainted: P
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996),
    BIOS 0.0.0 02/06/2015
    RIP: 0010:ima_match_policy+0x84/0x450
    Code: 49 89 fc 41 89 cf 31 ed 89 44 24 14 eb 1c 44 39
    7b 18 74 26 41 83 ff 05 74 20 48 8b 1b 48 3b 1d
    f2 b9 f4 00 0f 84 9c 01 00 00 85 73 10 74 ea
    44 8b 6b 14 41 f6 c5 01 75 d4 41 f6 c5 02 74 0f
    RSP: 0018:ff71570009e07a80 EFLAGS: 00010207
    RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000200
    RDX: ffffffffad8dc7c0 RSI: 0000000024924925 RDI: ff3e27850dea2000
    RBP: 0000000000000000 R08: 0000000000000000 R09: ffffffffabfce739
    R10: ff3e27810cc42400 R11: 0000000000000000 R12: ff3e2781825ef970
    R13: 00000000ff3e2785 R14: 000000000000000c R15: 0000000000000001
    FS: 00007f5195b51740(0000)
    GS:ff3e278b12d40000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000000000000010 CR3: 0000000626d24002 CR4: 0000000000361ee0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
    ima_get_action+0x22/0x30
    process_measurement+0xb0/0x830
    ? page_add_file_rmap+0x15/0x170
    ? alloc_set_pte+0x269/0x4c0
    ? prep_new_page+0x81/0x140
    ? simple_xattr_get+0x75/0xa0
    ? selinux_file_open+0x9d/0xf0
    ima_file_check+0x64/0x90
    path_openat+0x571/0x1720
    do_filp_open+0x9b/0x110
    ? page_counter_try_charge+0x57/0xc0
    ? files_cgroup_alloc_fd+0x38/0x60
    ? __alloc_fd+0xd4/0x250
    ? do_sys_open+0x1bd/0x250
    do_sys_open+0x1bd/0x250
    do_syscall_64+0x5d/0x1d0
    entry_SYSCALL_64_after_hwframe+0x65/0xca

    Commit c7423dbdbc9e ("ima: Handle -ESTALE returned by
    ima_filter_rule_match()") introduced call to ima_lsm_copy_rule within a
    RCU read-side critical section which contains kmalloc with GFP_KERNEL.
    This implies a possible sleep and violates limitations of RCU read-side
    critical sections on non-PREEMPT systems.

    Sleeping within RCU read-side critical section might cause
    synchronize_rcu() returning early and break RCU protection, allowing a
    UAF to happen.

    The root cause of this issue could be described as follows:
    | Thread A | Thread B |
    | |ima_match_policy |
    | | rcu_read_lock |
    |ima_lsm_update_rule | |
    | synchronize_rcu | |
    | | kmalloc(GFP_KERNEL)|
    | | sleep |
    ==> synchronize_rcu returns early
    | kfree(entry) | |
    | | entry = entry->next|
    ==> UAF happens and entry now becomes NULL (or could be anything).
    | | entry->action |
    ==> Accessing entry might cause panic.

    To fix this issue, we are converting all kmalloc that is called within
    RCU read-side critical section to use GFP_ATOMIC.

    Fixes: c7423dbdbc9e ("ima: Handle -ESTALE returned by ima_filter_rule_match()")
    Cc: stable@vger.kernel.org
    Signed-off-by: GUO Zihua
    Acked-by: John Johansen
    Reviewed-by: Mimi Zohar
    Reviewed-by: Casey Schaufler
    [PM: fixed missing comment, long lines, !CONFIG_IMA_LSM_RULES case]
    Signed-off-by: Paul Moore
    Signed-off-by: Mimi Zohar
    Signed-off-by: Greg Kroah-Hartman

    GUO Zihua
     

03 Apr, 2024

2 commits

  • [ Upstream commit ac02f007d64eb2769d0bde742aac4d7a5fc6e8a5 ]

    If the SMACK64TRANSMUTE xattr is provided, and the inode is a directory,
    update the in-memory inode flags by setting SMK_INODE_TRANSMUTE.

    Cc: stable@vger.kernel.org
    Fixes: 5c6d1125f8db ("Smack: Transmute labels on specified directories") # v2.6.38.x
    Signed-off-by: Roberto Sassu
    Signed-off-by: Casey Schaufler
    Signed-off-by: Sasha Levin

    Roberto Sassu
     
  • [ Upstream commit 9c82169208dde516510aaba6bbd8b13976690c5d ]

    Since the SMACK64TRANSMUTE xattr makes sense only for directories, enforce
    this restriction in smack_inode_setxattr().

    Cc: stable@vger.kernel.org
    Fixes: 5c6d1125f8db ("Smack: Transmute labels on specified directories") # v2.6.38.x
    Signed-off-by: Roberto Sassu
    Signed-off-by: Casey Schaufler
    Signed-off-by: Sasha Levin

    Roberto Sassu
     

01 Feb, 2024

1 commit

  • commit f1bb47a31dff6d4b34fb14e99850860ee74bb003 upstream.

    Some ioctl commands do not require ioctl permission, but are routed to
    other permissions such as FILE_GETATTR or FILE_SETATTR. This routing is
    done by comparing the ioctl cmd to a set of 64-bit flags (FS_IOC_*).

    However, if a 32-bit process is running on a 64-bit kernel, it emits
    32-bit flags (FS_IOC32_*) for certain ioctl operations. These flags are
    being checked erroneously, which leads to these ioctl operations being
    routed to the ioctl permission, rather than the correct file
    permissions.

    This was also noted in a RED-PEN finding from a while back -
    "/* RED-PEN how should LSM module know it's handling 32bit? */".

    This patch introduces a new hook, security_file_ioctl_compat(), that is
    called from the compat ioctl syscall. All current LSMs have been changed
    to support this hook.

    Reviewing the three places where we are currently using
    security_file_ioctl(), it appears that only SELinux needs a dedicated
    compat change; TOMOYO and SMACK appear to be functional without any
    change.

    Cc: stable@vger.kernel.org
    Fixes: 0b24dcb7f2f7 ("Revert "selinux: simplify ioctl checking"")
    Signed-off-by: Alfred Piccioni
    Reviewed-by: Stephen Smalley
    [PM: subject tweak, line length fixes, and alignment corrections]
    Signed-off-by: Paul Moore
    Signed-off-by: Greg Kroah-Hartman

    Alfred Piccioni
     

31 Aug, 2023

2 commits

  • Pull smack updates from Casey Schaufler:
    "Two minor fixes: is a simple spelling fix. The other is a bounds check
    for a very likely underflow"

    * tag 'Smack-for-6.6' of https://github.com/cschaufler/smack-next:
    smackfs: Prevent underflow in smk_set_cipso()
    security: smack: smackfs: fix typo (lables->labels)

    Linus Torvalds
     
  • Pull LSM updates from Paul Moore:

    - Add proper multi-LSM support for xattrs in the
    security_inode_init_security() hook

    Historically the LSM layer has only allowed a single LSM to add an
    xattr to an inode, with IMA/EVM measuring that and adding its own as
    well. As we work towards promoting IMA/EVM to a "proper LSM" instead
    of the special case that it is now, we need to better support the
    case of multiple LSMs each adding xattrs to an inode and after
    several attempts we now appear to have something that is working
    well. It is worth noting that in the process of making this change we
    uncovered a problem with Smack's SMACK64TRANSMUTE xattr which is also
    fixed in this pull request.

    - Additional LSM hook constification

    Two patches to constify parameters to security_capget() and
    security_binder_transfer_file(). While I generally don't make a
    special note of who submitted these patches, these were the work of
    an Outreachy intern, Khadija Kamran, and that makes me happy;
    hopefully it does the same for all of you reading this.

    - LSM hook comment header fixes

    One patch to add a missing hook comment header, one to fix a minor
    typo.

    - Remove an old, unused credential function declaration

    It wasn't clear to me who should pick this up, but it was trivial,
    obviously correct, and arguably the LSM layer has a vested interest
    in credentials so I merged it. Sadly I'm now noticing that despite my
    subject line cleanup I didn't cleanup the "unsued" misspelling, sigh

    * tag 'lsm-pr-20230829' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/lsm:
    lsm: constify the 'file' parameter in security_binder_transfer_file()
    lsm: constify the 'target' parameter in security_capget()
    lsm: add comment block for security_sk_classify_flow LSM hook
    security: Fix ret values doc for security_inode_init_security()
    cred: remove unsued extern declaration change_create_files_as()
    evm: Support multiple LSMs providing an xattr
    evm: Align evm_inode_init_security() definition with LSM infrastructure
    smack: Set the SMACK64TRANSMUTE xattr in smack_inode_init_security()
    security: Allow all LSMs to provide xattrs for inode_init_security hook
    lsm: fix typo in security_file_lock() comment header

    Linus Torvalds
     

15 Aug, 2023

1 commit

  • When NFS superblocks are created by automounting, their LSM parameters
    aren't set in the fs_context struct prior to sget_fc() being called,
    leading to failure to match existing superblocks.

    This bug leads to messages like the following appearing in dmesg when
    fscache is enabled:

    NFS: Cache volume key already in use (nfs,4.2,2,108,106a8c0,1,,,,100000,100000,2ee,3a98,1d4c,3a98,1)

    Fix this by adding a new LSM hook to load fc->security for submount
    creation.

    Signed-off-by: David Howells
    Signed-off-by: Jeff Layton
    Link: https://lore.kernel.org/r/165962680944.3334508.6610023900349142034.stgit@warthog.procyon.org.uk/ # v1
    Link: https://lore.kernel.org/r/165962729225.3357250.14350728846471527137.stgit@warthog.procyon.org.uk/ # v2
    Link: https://lore.kernel.org/r/165970659095.2812394.6868894171102318796.stgit@warthog.procyon.org.uk/ # v3
    Link: https://lore.kernel.org/r/166133579016.3678898.6283195019480567275.stgit@warthog.procyon.org.uk/ # v4
    Link: https://lore.kernel.org/r/217595.1662033775@warthog.procyon.org.uk/ # v5
    Fixes: 9bc61ab18b1d ("vfs: Introduce fs_context, switch vfs_kern_mount() to it.")
    Fixes: 779df6a5480f ("NFS: Ensure security label is set for root inode")
    Tested-by: Jeff Layton
    Acked-by: Casey Schaufler
    Acked-by: "Christian Brauner (Microsoft)"
    Acked-by: Paul Moore
    Reviewed-by: Jeff Layton
    Message-Id:
    Signed-off-by: Christian Brauner

    David Howells
     

08 Aug, 2023

2 commits


11 Jul, 2023

2 commits

  • With the newly added ability of LSMs to supply multiple xattrs, set
    SMACK64TRASMUTE in smack_inode_init_security(), instead of d_instantiate().
    Do it by incrementing SMACK_INODE_INIT_XATTRS to 2 and by calling
    lsm_get_xattr_slot() a second time, if the transmuting conditions are met.

    The LSM infrastructure passes all xattrs provided by LSMs to the
    filesystems through the initxattrs() callback, so that filesystems can
    store xattrs in the disk.

    After the change, the SMK_INODE_TRANSMUTE inode flag is always set by
    d_instantiate() after fetching SMACK64TRANSMUTE from the disk. Before it
    was done by smack_inode_post_setxattr() as result of the __vfs_setxattr()
    call.

    Removing __vfs_setxattr() also prevents invalidating the EVM HMAC, by
    adding a new xattr without checking and updating the existing HMAC.

    Signed-off-by: Roberto Sassu
    Reviewed-by: Casey Schaufler
    Signed-off-by: Paul Moore

    Roberto Sassu
     
  • Currently, the LSM infrastructure supports only one LSM providing an xattr
    and EVM calculating the HMAC on that xattr, plus other inode metadata.

    Allow all LSMs to provide one or multiple xattrs, by extending the security
    blob reservation mechanism. Introduce the new lbs_xattr_count field of the
    lsm_blob_sizes structure, so that each LSM can specify how many xattrs it
    needs, and the LSM infrastructure knows how many xattr slots it should
    allocate.

    Modify the inode_init_security hook definition, by passing the full
    xattr array allocated in security_inode_init_security(), and the current
    number of xattr slots in that array filled by LSMs. The first parameter
    would allow EVM to access and calculate the HMAC on xattrs supplied by
    other LSMs, the second to not leave gaps in the xattr array, when an LSM
    requested but did not provide xattrs (e.g. if it is not initialized).

    Introduce lsm_get_xattr_slot(), which LSMs can call as many times as the
    number specified in the lbs_xattr_count field of the lsm_blob_sizes
    structure. During each call, lsm_get_xattr_slot() increments the number of
    filled xattrs, so that at the next invocation it returns the next xattr
    slot to fill.

    Cleanup security_inode_init_security(). Unify the !initxattrs and
    initxattrs case by simply not allocating the new_xattrs array in the
    former. Update the documentation to reflect the changes, and fix the
    description of the xattr name, as it is not allocated anymore.

    Adapt both SELinux and Smack to use the new definition of the
    inode_init_security hook, and to call lsm_get_xattr_slot() to obtain and
    fill the reserved slots in the xattr array.

    Move the xattr->name assignment after the xattr->value one, so that it is
    done only in case of successful memory allocation.

    Finally, change the default return value of the inode_init_security hook
    from zero to -EOPNOTSUPP, so that BPF LSM correctly follows the hook
    conventions.

    Reported-by: Nicolas Bouchinet
    Link: https://lore.kernel.org/linux-integrity/Y1FTSIo+1x+4X0LS@archlinux/
    Signed-off-by: Roberto Sassu
    Acked-by: Casey Schaufler
    [PM: minor comment and variable tweaks, approved by RS]
    Signed-off-by: Paul Moore

    Roberto Sassu
     

12 May, 2023

2 commits

  • smack_dentry_create_files_as() determines whether transmuting should occur
    based on the label of the parent directory the new inode will be added to,
    and not the label of the directory where it is created.

    This helps for example to do transmuting on overlayfs, since the latter
    first creates the inode in the working directory, and then moves it to the
    correct destination.

    However, despite smack_dentry_create_files_as() provides the correct label,
    smack_inode_init_security() does not know from passed information whether
    or not transmuting occurred. Without this information,
    smack_inode_init_security() cannot set SMK_INODE_CHANGED in smk_flags,
    which will result in the SMACK64TRANSMUTE xattr not being set in
    smack_d_instantiate().

    Thus, add the smk_transmuted field to the task_smack structure, and set it
    in smack_dentry_create_files_as() to smk_task if transmuting occurred. If
    smk_task is equal to smk_transmuted in smack_inode_init_security(), act as
    if transmuting was successful but without taking the label from the parent
    directory (the inode label was already set correctly from the current
    credentials in smack_inode_alloc_security()).

    Signed-off-by: Roberto Sassu
    Signed-off-by: Casey Schaufler

    Roberto Sassu
     
  • Enhance smack_inode_getsecurity() to retrieve the value for
    SMACK64TRANSMUTE from the inode security blob, similarly to SMACK64.

    This helps to display accurate values in the situation where the security
    labels come from mount options and not from xattrs.

    Signed-off-by: Roberto Sassu
    Signed-off-by: Casey Schaufler

    Roberto Sassu
     

25 Apr, 2023

1 commit

  • Pull smack updates from Casey Schaufler:
    "There are two changes, one small and one more substantial:

    - Remove of an unnecessary cast

    - The mount option processing introduced with the mount rework makes
    copies of mount option values. There is no good reason to make
    copies of Smack labels, as they are maintained on a list and never
    removed.

    The code now uses pointers to entries on the list, reducing
    processing time and memory use"

    * tag 'Smack-for-6.4' of https://github.com/cschaufler/smack-next:
    Smack: Improve mount process memory use
    smack_lsm: remove unnecessary type casting

    Linus Torvalds
     

05 Apr, 2023

1 commit

  • The existing mount processing code in Smack makes many unnecessary
    copies of Smack labels. Because Smack labels never go away once
    imported it is safe to use pointers to them rather than copies.
    Replace the use of copies of label names to pointers to the global
    label list entries.

    Signed-off-by: Casey Schaufler

    Casey Schaufler
     

21 Mar, 2023

1 commit

  • After working with the larger SELinux-based distros for several
    years, we're finally at a place where we can disable the SELinux
    runtime disable functionality. The existing kernel deprecation
    notice explains the functionality and why we want to remove it:

    The selinuxfs "disable" node allows SELinux to be disabled at
    runtime prior to a policy being loaded into the kernel. If
    disabled via this mechanism, SELinux will remain disabled until
    the system is rebooted.

    The preferred method of disabling SELinux is via the "selinux=0"
    boot parameter, but the selinuxfs "disable" node was created to
    make it easier for systems with primitive bootloaders that did not
    allow for easy modification of the kernel command line.
    Unfortunately, allowing for SELinux to be disabled at runtime makes
    it difficult to secure the kernel's LSM hooks using the
    "__ro_after_init" feature.

    It is that last sentence, mentioning the '__ro_after_init' hardening,
    which is the real motivation for this change, and if you look at the
    diffstat you'll see that the impact of this patch reaches across all
    the different LSMs, helping prevent tampering at the LSM hook level.

    From a SELinux perspective, it is important to note that if you
    continue to disable SELinux via "/etc/selinux/config" it may appear
    that SELinux is disabled, but it is simply in an uninitialized state.
    If you load a policy with `load_policy -i`, you will see SELinux
    come alive just as if you had loaded the policy during early-boot.

    It is also worth noting that the "/sys/fs/selinux/disable" file is
    always writable now, regardless of the Kconfig settings, but writing
    to the file has no effect on the system, other than to display an
    error on the console if a non-zero/true value is written.

    Finally, in the several years where we have been working on
    deprecating this functionality, there has only been one instance of
    someone mentioning any user visible breakage. In this particular
    case it was an individual's kernel test system, and the workaround
    documented in the deprecation notice ("selinux=0" on the kernel
    command line) resolved the issue without problem.

    Acked-by: Casey Schaufler
    Signed-off-by: Paul Moore

    Paul Moore
     

09 Mar, 2023

1 commit


23 Feb, 2023

1 commit


22 Feb, 2023

1 commit

  • If the catlen is 0, the memory for the netlbl_lsm_catmap
    structure must be allocated anyway, otherwise the check of
    such rules is not completed correctly.

    Signed-off-by: Denis Arefev
    Signed-off-by: Casey Schaufler

    Denis Arefev
     

19 Jan, 2023

3 commits

  • Convert to struct mnt_idmap.

    Last cycle we merged the necessary infrastructure in
    256c8aed2b42 ("fs: introduce dedicated idmap type for mounts").
    This is just the conversion to struct mnt_idmap.

    Currently we still pass around the plain namespace that was attached to a
    mount. This is in general pretty convenient but it makes it easy to
    conflate namespaces that are relevant on the filesystem with namespaces
    that are relevent on the mount level. Especially for non-vfs developers
    without detailed knowledge in this area this can be a potential source for
    bugs.

    Once the conversion to struct mnt_idmap is done all helpers down to the
    really low-level helpers will take a struct mnt_idmap argument instead of
    two namespace arguments. This way it becomes impossible to conflate the two
    eliminating the possibility of any bugs. All of the vfs and all filesystems
    only operate on struct mnt_idmap.

    Acked-by: Dave Chinner
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Christian Brauner (Microsoft)

    Christian Brauner
     
  • Convert to struct mnt_idmap.

    Last cycle we merged the necessary infrastructure in
    256c8aed2b42 ("fs: introduce dedicated idmap type for mounts").
    This is just the conversion to struct mnt_idmap.

    Currently we still pass around the plain namespace that was attached to a
    mount. This is in general pretty convenient but it makes it easy to
    conflate namespaces that are relevant on the filesystem with namespaces
    that are relevent on the mount level. Especially for non-vfs developers
    without detailed knowledge in this area this can be a potential source for
    bugs.

    Once the conversion to struct mnt_idmap is done all helpers down to the
    really low-level helpers will take a struct mnt_idmap argument instead of
    two namespace arguments. This way it becomes impossible to conflate the two
    eliminating the possibility of any bugs. All of the vfs and all filesystems
    only operate on struct mnt_idmap.

    Acked-by: Dave Chinner
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Christian Brauner (Microsoft)

    Christian Brauner
     
  • Convert to struct mnt_idmap.

    Last cycle we merged the necessary infrastructure in
    256c8aed2b42 ("fs: introduce dedicated idmap type for mounts").
    This is just the conversion to struct mnt_idmap.

    Currently we still pass around the plain namespace that was attached to a
    mount. This is in general pretty convenient but it makes it easy to
    conflate namespaces that are relevant on the filesystem with namespaces
    that are relevent on the mount level. Especially for non-vfs developers
    without detailed knowledge in this area this can be a potential source for
    bugs.

    Once the conversion to struct mnt_idmap is done all helpers down to the
    really low-level helpers will take a struct mnt_idmap argument instead of
    two namespace arguments. This way it becomes impossible to conflate the two
    eliminating the possibility of any bugs. All of the vfs and all filesystems
    only operate on struct mnt_idmap.

    Acked-by: Dave Chinner
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Christian Brauner (Microsoft)

    Christian Brauner
     

14 Dec, 2022

1 commit

  • Pull lsm updates from Paul Moore:

    - Improve the error handling in the device cgroup such that memory
    allocation failures when updating the access policy do not
    potentially alter the policy.

    - Some minor fixes to reiserfs to ensure that it properly releases
    LSM-related xattr values.

    - Update the security_socket_getpeersec_stream() LSM hook to take
    sockptr_t values.

    Previously the net/BPF folks updated the getsockopt code in the
    network stack to leverage the sockptr_t type to make it easier to
    pass both kernel and __user pointers, but unfortunately when they did
    so they didn't convert the LSM hook.

    While there was/is no immediate risk by not converting the LSM hook,
    it seems like this is a mistake waiting to happen so this patch
    proactively does the LSM hook conversion.

    - Convert vfs_getxattr_alloc() to return an int instead of a ssize_t
    and cleanup the callers. Internally the function was never going to
    return anything larger than an int and the callers were doing some
    very odd things casting the return value; this patch fixes all that
    and helps bring a bit of sanity to vfs_getxattr_alloc() and its
    callers.

    - More verbose, and helpful, LSM debug output when the system is booted
    with "lsm.debug" on the command line. There are examples in the
    commit description, but the quick summary is that this patch provides
    better information about which LSMs are enabled and the ordering in
    which they are processed.

    - General comment and kernel-doc fixes and cleanups.

    * tag 'lsm-pr-20221212' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/lsm:
    lsm: Fix description of fs_context_parse_param
    lsm: Add/fix return values in lsm_hooks.h and fix formatting
    lsm: Clarify documentation of vm_enough_memory hook
    reiserfs: Add missing calls to reiserfs_security_free()
    lsm,fs: fix vfs_getxattr_alloc() return type and caller error paths
    device_cgroup: Roll back to original exceptions after copy failure
    LSM: Better reporting of actual LSMs at boot
    lsm: make security_socket_getpeersec_stream() sockptr_t safe
    audit: Fix some kernel-doc warnings
    lsm: remove obsoleted comments for security hooks
    fs: edit a comment made in bad taste

    Linus Torvalds
     

05 Nov, 2022

1 commit

  • Commit 4ff09db1b79b ("bpf: net: Change sk_getsockopt() to take the
    sockptr_t argument") made it possible to call sk_getsockopt()
    with both user and kernel address space buffers through the use of
    the sockptr_t type. Unfortunately at the time of conversion the
    security_socket_getpeersec_stream() LSM hook was written to only
    accept userspace buffers, and in a desire to avoid having to change
    the LSM hook the commit author simply passed the sockptr_t's
    userspace buffer pointer. Since the only sk_getsockopt() callers
    at the time of conversion which used kernel sockptr_t buffers did
    not allow SO_PEERSEC, and hence the
    security_socket_getpeersec_stream() hook, this was acceptable but
    also very fragile as future changes presented the possibility of
    silently passing kernel space pointers to the LSM hook.

    There are several ways to protect against this, including careful
    code review of future commits, but since relying on code review to
    catch bugs is a recipe for disaster and the upstream eBPF maintainer
    is "strongly against defensive programming", this patch updates the
    LSM hook, and all of the implementations to support sockptr_t and
    safely handle both user and kernel space buffers.

    Acked-by: Casey Schaufler
    Acked-by: John Johansen
    Signed-off-by: Paul Moore

    Paul Moore
     

20 Oct, 2022

1 commit

  • The current way of setting and getting posix acls through the generic
    xattr interface is error prone and type unsafe. The vfs needs to
    interpret and fixup posix acls before storing or reporting it to
    userspace. Various hacks exist to make this work. The code is hard to
    understand and difficult to maintain in it's current form. Instead of
    making this work by hacking posix acls through xattr handlers we are
    building a dedicated posix acl api around the get and set inode
    operations. This removes a lot of hackiness and makes the codepaths
    easier to maintain. A lot of background can be found in [1].

    So far posix acls were passed as a void blob to the security and
    integrity modules. Some of them like evm then proceed to interpret the
    void pointer and convert it into the kernel internal struct posix acl
    representation to perform their integrity checking magic. This is
    obviously pretty problematic as that requires knowledge that only the
    vfs is guaranteed to have and has lead to various bugs. Add a proper
    security hook for setting posix acls and pass down the posix acls in
    their appropriate vfs format instead of hacking it through a void
    pointer stored in the uapi format.

    I spent considerate time in the security module infrastructure and
    audited all codepaths. Smack has no restrictions based on the posix
    acl values passed through it. The capability hook doesn't need to be
    called either because it only has restrictions on security.* xattrs. So
    these all becomes very simple hooks for smack.

    Link: https://lore.kernel.org/all/20220801145520.1532837-1-brauner@kernel.org [1]
    Reviewed-by: Casey Schaufler
    Reviewed-by: Paul Moore
    Signed-off-by: Christian Brauner (Microsoft)

    Christian Brauner
     

07 Oct, 2022

1 commit

  • Pull vfs constification updates from Al Viro:
    "whack-a-mole: constifying struct path *"

    * tag 'pull-path' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    ecryptfs: constify path
    spufs: constify path
    nd_jump_link(): constify path
    audit_init_parent(): constify path
    __io_setxattr(): constify path
    do_proc_readlink(): constify path
    overlayfs: constify path
    fs/notify: constify path
    may_linkat(): constify path
    do_sys_name_to_handle(): constify path
    ->getprocattr(): attribute name is const char *, TYVM...

    Linus Torvalds
     

04 Oct, 2022

1 commit

  • Pull smack updates from Casey Schaufler:
    "Two minor code clean-ups: one removes constants left over from the old
    mount API, while the other gets rid of an unneeded variable.

    The other change fixes a flaw in handling IPv6 labeling"

    * tag 'Smack-for-6.1' of https://github.com/cschaufler/smack-next:
    smack: cleanup obsolete mount option flags
    smack: lsm: remove the unneeded result variable
    SMACK: Add sk_clone_security LSM hook

    Linus Torvalds
     

28 Sep, 2022

3 commits

  • These mount option flags are obsolete since commit 12085b14a444 ("smack:
    switch to private smack_mnt_opts"), remove them.

    Signed-off-by: Xiu Jianfeng
    Signed-off-by: Casey Schaufler

    Xiu Jianfeng
     
  • Return the value smk_ptrace_rule_check() directly instead of storing it
    in another redundant variable.

    Reported-by: Zeal Robot
    Signed-off-by: Xu Panda
    Signed-off-by: Casey Schaufler

    Xu Panda
     
  • Using smk_of_current() during sk_alloc_security hook leads in
    rare cases to a faulty initialization of the security context
    of the created socket.

    By adding the LSM hook sk_clone_security to SMACK this initialization
    fault is corrected by copying the security context of the old socket
    pointer to the newly cloned one.

    Co-authored-by: Martin Ostertag:
    Signed-off-by: Lontke Michael
    Signed-off-by: Casey Schaufler

    Lontke Michael
     

02 Sep, 2022

1 commit


27 Aug, 2022

1 commit

  • Limit io_uring "cmd" options to files for which the caller has
    Smack read access. There may be cases where the cmd option may
    be closer to a write access than a read, but there is no way
    to make that determination.

    Cc: stable@vger.kernel.org
    Fixes: ee692a21e9bf ("fs,io_uring: add infrastructure for uring-cmd")
    Signed-off-by: Casey Schaufler
    Signed-off-by: Paul Moore

    Casey Schaufler
     

02 Aug, 2022

2 commits

  • It's not possible for inode->i_security to be NULL here because every
    inode will call inode_init_always and then lsm_inode_alloc to alloc
    memory for inode->security, this is what LSM infrastructure management
    do, so remove this redundant code.

    Signed-off-by: Xiu Jianfeng
    Signed-off-by: Casey Schaufler

    Xiu Jianfeng
     
  • Simplify the code by using kstrndup instead of kzalloc and strncpy in
    smk_parse_smack(), which meanwhile remove strncpy as [1] suggests.

    [1]: https://github.com/KSPP/linux/issues/90

    Signed-off-by: GONG, Ruiqi
    Signed-off-by: Casey Schaufler

    GONG, Ruiqi
     

05 Jun, 2022

1 commit

  • Pull mount handling updates from Al Viro:
    "Cleanups (and one fix) around struct mount handling.

    The fix is usermode_driver.c one - once you've done kern_mount(), you
    must kern_unmount(); simple mntput() will end up with a leak. Several
    failure exits in there messed up that way... In practice you won't hit
    those particular failure exits without fault injection, though"

    * tag 'pull-18-rc1-work.mount' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    move mount-related externs from fs.h to mount.h
    blob_to_mnt(): kern_unmount() is needed to undo kern_mount()
    m->mnt_root->d_inode->i_sb is a weird way to spell m->mnt_sb...
    linux/mount.h: trim includes
    uninline may_mount() and don't opencode it in fspick(2)/fsopen(2)

    Linus Torvalds
     

24 May, 2022

1 commit

  • Get rid of redundant assignments which end up in values not being
    read either because they are overwritten or the function ends.

    Reported by clang-tidy [deadcode.DeadStores]

    Signed-off-by: Michal Orzel
    Signed-off-by: Casey Schaufler

    Michal Orzel
     

20 May, 2022

1 commit