21 Feb, 2020

1 commit

  • Pull IMA fixes from Mimi Zohar:
    "Two bug fixes and an associated change for each.

    The one that adds SM3 to the IMA list of supported hash algorithms is
    a simple change, but could be considered a new feature"

    * 'next-integrity' of git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity:
    ima: add sm3 algorithm to hash algorithm configuration list
    crypto: rename sm3-256 to sm3 in hash_algo_name
    efi: Only print errors about failing to get certs if EFI vars are found
    x86/ima: use correct identifier for SetupMode variable

    Linus Torvalds
     

18 Feb, 2020

2 commits

  • sm3 has been supported by the ima hash algorithm, but it is not
    yet in the Kconfig configuration list. After adding, both ima and tpm2
    can support sm3 well.

    Signed-off-by: Tianjia Zhang
    Signed-off-by: Mimi Zohar

    Tianjia Zhang
     
  • If CONFIG_LOAD_UEFI_KEYS is enabled, the kernel attempts to load the certs
    from the db, dbx and MokListRT EFI variables into the appropriate keyrings.

    But it just assumes that the variables will be present and prints an error
    if the certs can't be loaded, even when is possible that the variables may
    not exist. For example the MokListRT variable will only be present if shim
    is used.

    So only print an error message about failing to get the certs list from an
    EFI variable if this is found. Otherwise these printed errors just pollute
    the kernel log ring buffer with confusing messages like the following:

    [ 5.427251] Couldn't get size: 0x800000000000000e
    [ 5.427261] MODSIGN: Couldn't get UEFI db list
    [ 5.428012] Couldn't get size: 0x800000000000000e
    [ 5.428023] Couldn't get UEFI MokListRT

    Reported-by: Hans de Goede
    Signed-off-by: Javier Martinez Canillas
    Tested-by: Hans de Goede
    Acked-by: Ard Biesheuvel
    Signed-off-by: Mimi Zohar

    Javier Martinez Canillas
     

11 Feb, 2020

1 commit


09 Feb, 2020

1 commit

  • Pull vfs file system parameter updates from Al Viro:
    "Saner fs_parser.c guts and data structures. The system-wide registry
    of syntax types (string/enum/int32/oct32/.../etc.) is gone and so is
    the horror switch() in fs_parse() that would have to grow another case
    every time something got added to that system-wide registry.

    New syntax types can be added by filesystems easily now, and their
    namespace is that of functions - not of system-wide enum members. IOW,
    they can be shared or kept private and if some turn out to be widely
    useful, we can make them common library helpers, etc., without having
    to do anything whatsoever to fs_parse() itself.

    And we already get that kind of requests - the thing that finally
    pushed me into doing that was "oh, and let's add one for timeouts -
    things like 15s or 2h". If some filesystem really wants that, let them
    do it. Without somebody having to play gatekeeper for the variants
    blessed by direct support in fs_parse(), TYVM.

    Quite a bit of boilerplate is gone. And IMO the data structures make a
    lot more sense now. -200LoC, while we are at it"

    * 'merge.nfs-fs_parse.1' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (25 commits)
    tmpfs: switch to use of invalfc()
    cgroup1: switch to use of errorfc() et.al.
    procfs: switch to use of invalfc()
    hugetlbfs: switch to use of invalfc()
    cramfs: switch to use of errofc() et.al.
    gfs2: switch to use of errorfc() et.al.
    fuse: switch to use errorfc() et.al.
    ceph: use errorfc() and friends instead of spelling the prefix out
    prefix-handling analogues of errorf() and friends
    turn fs_param_is_... into functions
    fs_parse: handle optional arguments sanely
    fs_parse: fold fs_parameter_desc/fs_parameter_spec
    fs_parser: remove fs_parameter_description name field
    add prefix to fs_context->log
    ceph_parse_param(), ceph_parse_mon_ips(): switch to passing fc_log
    new primitive: __fs_parse()
    switch rbd and libceph to p_log-based primitives
    struct p_log, variants of warnf() et.al. taking that one instead
    teach logfc() to handle prefices, give it saner calling conventions
    get rid of cg_invalf()
    ...

    Linus Torvalds
     

08 Feb, 2020

2 commits


06 Feb, 2020

4 commits

  • Pull smack fix from Casey Schaufler:
    "One fix for an obscure error found using an old version of ping(1)
    that did not use IPv6 sockets in the documented way"

    * tag 'Smack-for-5.6' of git://github.com/cschaufler/smack-next:
    broken ping to ipv6 linklocal addresses on debian buster

    Linus Torvalds
     
  • Avoiding taking a lock in an IRQ context is not enough to prevent
    deadlocks, as discovered by syzbot:

    ===
    WARNING: SOFTIRQ-safe -> SOFTIRQ-unsafe lock order detected
    5.5.0-syzkaller #0 Not tainted
    -----------------------------------------------------
    syz-executor.0/8927 [HC0[0]:SC0[2]:HE1:SE0] is trying to acquire:
    ffff888027c94098 (&(&s->cache_lock)->rlock){+.+.}, at: spin_lock include/linux/spinlock.h:338 [inline]
    ffff888027c94098 (&(&s->cache_lock)->rlock){+.+.}, at: sidtab_sid2str_put.part.0+0x36/0x880 security/selinux/ss/sidtab.c:533

    and this task is already holding:
    ffffffff898639b0 (&(&nf_conntrack_locks[i])->rlock){+.-.}, at: spin_lock include/linux/spinlock.h:338 [inline]
    ffffffff898639b0 (&(&nf_conntrack_locks[i])->rlock){+.-.}, at: nf_conntrack_lock+0x17/0x70 net/netfilter/nf_conntrack_core.c:91
    which would create a new lock dependency:
    (&(&nf_conntrack_locks[i])->rlock){+.-.} -> (&(&s->cache_lock)->rlock){+.+.}

    but this new dependency connects a SOFTIRQ-irq-safe lock:
    (&(&nf_conntrack_locks[i])->rlock){+.-.}

    [...]

    other info that might help us debug this:

    Possible interrupt unsafe locking scenario:

    CPU0 CPU1
    ---- ----
    lock(&(&s->cache_lock)->rlock);
    local_irq_disable();
    lock(&(&nf_conntrack_locks[i])->rlock);
    lock(&(&s->cache_lock)->rlock);

    lock(&(&nf_conntrack_locks[i])->rlock);

    *** DEADLOCK ***
    [...]
    ===

    Fix this by simply locking with irqsave/irqrestore and stop giving up on
    !in_task(). It makes the locking a bit slower, but it shouldn't make a
    big difference in real workloads. Under the scenario from [1] (only
    cache hits) it only increased the runtime overhead from the
    security_secid_to_secctx() function from ~2% to ~3% (it was ~5-65%
    before introducing the cache).

    [1] https://bugzilla.redhat.com/show_bug.cgi?id=1733259

    Fixes: d97bd23c2d7d ("selinux: cache the SID -> context string translation")
    Reported-by: syzbot+61cba5033e2072d61806@syzkaller.appspotmail.com
    Signed-off-by: Ondrej Mosnacek
    Acked-by: Stephen Smalley
    Signed-off-by: Paul Moore

    Ondrej Mosnacek
     
  • Correct the filesystem name to "binder" to enable genfscon per-file
    labelling for binderfs.

    Fixes: 7a4b5194747 ("selinux: allow per-file labelling for binderfs")
    Signed-off-by: Hridya Valsaraju
    Acked-by: Stephen Smalley
    [PM: slight style changes to the subj/description]
    Signed-off-by: Paul Moore

    Hridya Valsaraju
     
  • I am seeing ping failures to IPv6 linklocal addresses with Debian
    buster. Easiest example to reproduce is:

    $ ping -c1 -w1 ff02::1%eth1
    connect: Invalid argument

    $ ping -c1 -w1 ff02::1%eth1
    PING ff02::01%eth1(ff02::1%eth1) 56 data bytes
    64 bytes from fe80::e0:f9ff:fe0c:37%eth1: icmp_seq=1 ttl=64 time=0.059 ms

    git bisect traced the failure to
    commit b9ef5513c99b ("smack: Check address length before reading address family")

    Arguably ping is being stupid since the buster version is not setting
    the address family properly (ping on stretch for example does):

    $ strace -e connect ping6 -c1 -w1 ff02::1%eth1
    connect(5, {sa_family=AF_UNSPEC,
    sa_data="\4\1\0\0\0\0\377\2\0\0\0\0\0\0\0\0\0\0\0\0\0\1\3\0\0\0"}, 28)
    = -1 EINVAL (Invalid argument)

    but the command works fine on kernels prior to this commit, so this is
    breakage which goes against the Linux paradigm of "don't break userspace"

    Cc: stable@vger.kernel.org
    Reported-by: David Ahern
    Suggested-by: Tetsuo Handa
    Signed-off-by: Casey Schaufler

     security/smack/smack_lsm.c | 41 +++++++++++++++++++----------------------
    1 file changed, 19 insertions(+), 22 deletions(-)

    Casey Schaufler
     

30 Jan, 2020

2 commits

  • …kernel/git/shuah/linux-kselftest

    Pull Kselftest kunit updates from Shuah Khan:
    "This kunit update consists of:

    - Support for building kunit as a module from Alan Maguire

    - AppArmor KUnit tests for policy unpack from Mike Salvatore"

    * tag 'linux-kselftest-5.6-rc1-kunit' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest:
    kunit: building kunit as a module breaks allmodconfig
    kunit: update documentation to describe module-based build
    kunit: allow kunit to be loaded as a module
    kunit: remove timeout dependence on sysctl_hung_task_timeout_seconds
    kunit: allow kunit tests to be loaded as a module
    kunit: hide unexported try-catch interface in try-catch-impl.h
    kunit: move string-stream.h to lib/kunit
    apparmor: add AppArmor KUnit tests for policy unpack

    Linus Torvalds
     
  • Pull openat2 support from Al Viro:
    "This is the openat2() series from Aleksa Sarai.

    I'm afraid that the rest of namei stuff will have to wait - it got
    zero review the last time I'd posted #work.namei, and there had been a
    leak in the posted series I'd caught only last weekend. I was going to
    repost it on Monday, but the window opened and the odds of getting any
    review during that... Oh, well.

    Anyway, openat2 part should be ready; that _did_ get sane amount of
    review and public testing, so here it comes"

    From Aleksa's description of the series:
    "For a very long time, extending openat(2) with new features has been
    incredibly frustrating. This stems from the fact that openat(2) is
    possibly the most famous counter-example to the mantra "don't silently
    accept garbage from userspace" -- it doesn't check whether unknown
    flags are present[1].

    This means that (generally) the addition of new flags to openat(2) has
    been fraught with backwards-compatibility issues (O_TMPFILE has to be
    defined as __O_TMPFILE|O_DIRECTORY|[O_RDWR or O_WRONLY] to ensure old
    kernels gave errors, since it's insecure to silently ignore the
    flag[2]). All new security-related flags therefore have a tough road
    to being added to openat(2).

    Furthermore, the need for some sort of control over VFS's path
    resolution (to avoid malicious paths resulting in inadvertent
    breakouts) has been a very long-standing desire of many userspace
    applications.

    This patchset is a revival of Al Viro's old AT_NO_JUMPS[3] patchset
    (which was a variant of David Drysdale's O_BENEATH patchset[4] which
    was a spin-off of the Capsicum project[5]) with a few additions and
    changes made based on the previous discussion within [6] as well as
    others I felt were useful.

    In line with the conclusions of the original discussion of
    AT_NO_JUMPS, the flag has been split up into separate flags. However,
    instead of being an openat(2) flag it is provided through a new
    syscall openat2(2) which provides several other improvements to the
    openat(2) interface (see the patch description for more details). The
    following new LOOKUP_* flags are added:

    LOOKUP_NO_XDEV:

    Blocks all mountpoint crossings (upwards, downwards, or through
    absolute links). Absolute pathnames alone in openat(2) do not
    trigger this. Magic-link traversal which implies a vfsmount jump is
    also blocked (though magic-link jumps on the same vfsmount are
    permitted).

    LOOKUP_NO_MAGICLINKS:

    Blocks resolution through /proc/$pid/fd-style links. This is done
    by blocking the usage of nd_jump_link() during resolution in a
    filesystem. The term "magic-links" is used to match with the only
    reference to these links in Documentation/, but I'm happy to change
    the name.

    It should be noted that this is different to the scope of
    ~LOOKUP_FOLLOW in that it applies to all path components. However,
    you can do openat2(NO_FOLLOW|NO_MAGICLINKS) on a magic-link and it
    will *not* fail (assuming that no parent component was a
    magic-link), and you will have an fd for the magic-link.

    In order to correctly detect magic-links, the introduction of a new
    LOOKUP_MAGICLINK_JUMPED state flag was required.

    LOOKUP_BENEATH:

    Disallows escapes to outside the starting dirfd's
    tree, using techniques such as ".." or absolute links. Absolute
    paths in openat(2) are also disallowed.

    Conceptually this flag is to ensure you "stay below" a certain
    point in the filesystem tree -- but this requires some additional
    to protect against various races that would allow escape using
    "..".

    Currently LOOKUP_BENEATH implies LOOKUP_NO_MAGICLINKS, because it
    can trivially beam you around the filesystem (breaking the
    protection). In future, there might be similar safety checks done
    as in LOOKUP_IN_ROOT, but that requires more discussion.

    In addition, two new flags are added that expand on the above ideas:

    LOOKUP_NO_SYMLINKS:

    Does what it says on the tin. No symlink resolution is allowed at
    all, including magic-links. Just as with LOOKUP_NO_MAGICLINKS this
    can still be used with NOFOLLOW to open an fd for the symlink as
    long as no parent path had a symlink component.

    LOOKUP_IN_ROOT:

    This is an extension of LOOKUP_BENEATH that, rather than blocking
    attempts to move past the root, forces all such movements to be
    scoped to the starting point. This provides chroot(2)-like
    protection but without the cost of a chroot(2) for each filesystem
    operation, as well as being safe against race attacks that
    chroot(2) is not.

    If a race is detected (as with LOOKUP_BENEATH) then an error is
    generated, and similar to LOOKUP_BENEATH it is not permitted to
    cross magic-links with LOOKUP_IN_ROOT.

    The primary need for this is from container runtimes, which
    currently need to do symlink scoping in userspace[7] when opening
    paths in a potentially malicious container.

    There is a long list of CVEs that could have bene mitigated by
    having RESOLVE_THIS_ROOT (such as CVE-2017-1002101,
    CVE-2017-1002102, CVE-2018-15664, and CVE-2019-5736, just to name a
    few).

    In order to make all of the above more usable, I'm working on
    libpathrs[8] which is a C-friendly library for safe path resolution.
    It features a userspace-emulated backend if the kernel doesn't support
    openat2(2). Hopefully we can get userspace to switch to using it, and
    thus get openat2(2) support for free once it's ready.

    Future work would include implementing things like
    RESOLVE_NO_AUTOMOUNT and possibly a RESOLVE_NO_REMOTE (to allow
    programs to be sure they don't hit DoSes though stale NFS handles)"

    * 'work.openat2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    Documentation: path-lookup: include new LOOKUP flags
    selftests: add openat2(2) selftests
    open: introduce openat2(2) syscall
    namei: LOOKUP_{IN_ROOT,BENEATH}: permit limited ".." resolution
    namei: LOOKUP_IN_ROOT: chroot-like scoped resolution
    namei: LOOKUP_BENEATH: O_BENEATH-like scoped resolution
    namei: LOOKUP_NO_XDEV: block mountpoint crossing
    namei: LOOKUP_NO_MAGICLINKS: block magic-link resolution
    namei: LOOKUP_NO_SYMLINKS: block symlink resolution
    namei: allow set_root() to produce errors
    namei: allow nd_jump_link() to produce errors
    nsfs: clean-up ns_get_path() signature to return int
    namei: only return -ECHILD from follow_dotdot_rcu()

    Linus Torvalds
     

29 Jan, 2020

4 commits

  • Pull security subsystem update from James Morris:
    "Just one minor fix this time"

    * 'for-v5.6' of git://git.kernel.org:/pub/scm/linux/kernel/git/jmorris/linux-security:
    security: remove EARLY_LSM_COUNT which never used

    Linus Torvalds
     
  • Pull IMA updates from Mimi Zohar:
    "Two new features - measuring certificates and querying IMA for a file
    hash - and three bug fixes:

    - Measuring certificates is like the rest of IMA, based on policy,
    but requires loading a custom policy. Certificates loaded onto a
    keyring, for example during early boot, before a custom policy has
    been loaded, are queued and only processed after loading the custom
    policy.

    - IMA calculates and caches files hashes. Other kernel subsystems,
    and possibly kernel modules, are interested in accessing these
    cached file hashes.

    The bug fixes prevent classifying a file short read (e.g. shutdown) as
    an invalid file signature, add a missing blank when displaying the
    securityfs policy rules containing LSM labels, and, lastly, fix the
    handling of the IMA policy information for unknown LSM labels"

    * 'next-integrity' of git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity:
    IMA: Defined delayed workqueue to free the queued keys
    IMA: Call workqueue functions to measure queued keys
    IMA: Define workqueue for early boot key measurements
    IMA: pre-allocate buffer to hold keyrings string
    ima: ima/lsm policy rule loading logic bug fixes
    ima: add the ability to query the cached hash of a given file
    ima: Add a space after printing LSM rules for readability
    IMA: fix measuring asymmetric keys Kconfig
    IMA: Read keyrings= option from the IMA policy
    IMA: Add support to limit measuring keys
    KEYS: Call the IMA hook to measure keys
    IMA: Define an IMA hook to measure keys
    IMA: Add KEY_CHECK func to measure keys
    IMA: Check IMA policy flag
    ima: avoid appraise error for hash calc interrupt

    Linus Torvalds
     
  • Pull tomoyo update from Tetsuo Handa:
    "One 'int' -> 'atomic_t' conversion patch to suppress KCSAN's warning"

    * tag 'tomoyo-pr-20200128' of git://git.osdn.net/gitroot/tomoyo/tomoyo-test1:
    tomoyo: Use atomic_t for statistics counter

    Linus Torvalds
     
  • Pull networking updates from David Miller:

    1) Add WireGuard

    2) Add HE and TWT support to ath11k driver, from John Crispin.

    3) Add ESP in TCP encapsulation support, from Sabrina Dubroca.

    4) Add variable window congestion control to TIPC, from Jon Maloy.

    5) Add BCM84881 PHY driver, from Russell King.

    6) Start adding netlink support for ethtool operations, from Michal
    Kubecek.

    7) Add XDP drop and TX action support to ena driver, from Sameeh
    Jubran.

    8) Add new ipv4 route notifications so that mlxsw driver does not have
    to handle identical routes itself. From Ido Schimmel.

    9) Add BPF dynamic program extensions, from Alexei Starovoitov.

    10) Support RX and TX timestamping in igc, from Vinicius Costa Gomes.

    11) Add support for macsec HW offloading, from Antoine Tenart.

    12) Add initial support for MPTCP protocol, from Christoph Paasch,
    Matthieu Baerts, Florian Westphal, Peter Krystad, and many others.

    13) Add Octeontx2 PF support, from Sunil Goutham, Geetha sowjanya, Linu
    Cherian, and others.

    * git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next: (1469 commits)
    net: phy: add default ARCH_BCM_IPROC for MDIO_BCM_IPROC
    udp: segment looped gso packets correctly
    netem: change mailing list
    qed: FW 8.42.2.0 debug features
    qed: rt init valid initialization changed
    qed: Debug feature: ilt and mdump
    qed: FW 8.42.2.0 Add fw overlay feature
    qed: FW 8.42.2.0 HSI changes
    qed: FW 8.42.2.0 iscsi/fcoe changes
    qed: Add abstraction for different hsi values per chip
    qed: FW 8.42.2.0 Additional ll2 type
    qed: Use dmae to write to widebus registers in fw_funcs
    qed: FW 8.42.2.0 Parser offsets modified
    qed: FW 8.42.2.0 Queue Manager changes
    qed: FW 8.42.2.0 Expose new registers and change windows
    qed: FW 8.42.2.0 Internal ram offsets modifications
    MAINTAINERS: Add entry for Marvell OcteonTX2 Physical Function driver
    Documentation: net: octeontx2: Add RVU HW and drivers overview
    octeontx2-pf: ethtool RSS config support
    octeontx2-pf: Add basic ethtool support
    ...

    Linus Torvalds
     

28 Jan, 2020

2 commits

  • Pull SELinux update from Paul Moore:
    "This is one of the bigger SELinux pull requests in recent years with
    28 patches. Everything is passing our test suite and the highlights
    are below:

    - Mark CONFIG_SECURITY_SELINUX_DISABLE as deprecated. We're some time
    away from actually attempting to remove this in the kernel, but the
    only distro we know that still uses it (Fedora) is working on
    moving away from this so we want to at least let people know we are
    planning to remove it.

    - Reorder the SELinux hooks to help prevent bad things when SELinux
    is disabled at runtime. The proper fix is to remove the
    CONFIG_SECURITY_SELINUX_DISABLE functionality (see above) and just
    take care of it at boot time (e.g. "selinux=0").

    - Add SELinux controls for the kernel lockdown functionality,
    introducing a new SELinux class/permissions: "lockdown { integrity
    confidentiality }".

    - Add a SELinux control for move_mount(2) that reuses the "file {
    mounton }" permission.

    - Improvements to the SELinux security label data store lookup
    functions to speed up translations between our internal label
    representations and the visible string labels (both directions).

    - Revisit a previous fix related to SELinux inode auditing and
    permission caching and do it correctly this time.

    - Fix the SELinux access decision cache to cleanup properly on error.
    In some extreme cases this could limit the cache size and result in
    a decrease in performance.

    - Enable SELinux per-file labeling for binderfs.

    - The SELinux initialized and disabled flags were wrapped with
    accessors to ensure they are accessed correctly.

    - Mark several key SELinux structures with __randomize_layout.

    - Changes to the LSM build configuration to only build
    security/lsm_audit.c when needed.

    - Changes to the SELinux build configuration to only build the IB
    object cache when CONFIG_SECURITY_INFINIBAND is enabled.

    - Move a number of single-caller functions into their callers.

    - Documentation fixes (/selinux -> /sys/fs/selinux).

    - A handful of cleanup patches that aren't worth mentioning on their
    own, the individual descriptions have plenty of detail"

    * tag 'selinux-pr-20200127' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux: (28 commits)
    selinux: fix regression introduced by move_mount(2) syscall
    selinux: do not allocate ancillary buffer on first load
    selinux: remove redundant allocation and helper functions
    selinux: remove redundant selinux_nlmsg_perm
    selinux: fix wrong buffer types in policydb.c
    selinux: reorder hooks to make runtime disable less broken
    selinux: treat atomic flags more carefully
    selinux: make default_noexec read-only after init
    selinux: move ibpkeys code under CONFIG_SECURITY_INFINIBAND.
    selinux: remove redundant msg_msg_alloc_security
    Documentation,selinux: fix references to old selinuxfs mount point
    selinux: deprecate disabling SELinux and runtime
    selinux: allow per-file labelling for binderfs
    selinuxfs: use scnprintf to get real length for inode
    selinux: remove set but not used variable 'sidtab'
    selinux: ensure the policy has been loaded before reading the sidtab stats
    selinux: ensure we cleanup the internal AVC counters on error in avc_update()
    selinux: randomize layout of key structures
    selinux: clean up selinux_enabled/disabled/enforcing_boot
    selinux: remove unnecessary selinux cred request
    ...

    Linus Torvalds
     
  • This macro is never used from it was introduced in commit e6b1db98cf4d5
    ("security: Support early LSMs"), better to remove it.

    Signed-off-by: Alex Shi
    Acked-by: Serge Hallyn
    Signed-off-by: James Morris

    Alex Shi
     

23 Jan, 2020

7 commits

  • Keys queued for measurement should be freed if a custom IMA policy
    was not loaded. Otherwise, the keys will remain queued forever
    consuming kernel memory.

    This patch defines a delayed workqueue to handle the above scenario.
    The workqueue handler is setup to execute 5 minutes after IMA
    initialization is completed.

    If a custom IMA policy is loaded before the workqueue handler is
    scheduled to execute, the workqueue task is cancelled and any queued keys
    are processed for measurement. But if a custom policy was not loaded then
    the queued keys are just freed when the delayed workqueue handler is run.

    Signed-off-by: Lakshmi Ramasubramanian
    Reported-by: kernel test robot # sleeping
    function called from invalid context
    Reported-by: kbuild test robot # redefinition of
    ima_init_key_queue() function.
    Signed-off-by: Mimi Zohar

    Lakshmi Ramasubramanian
     
  • Measuring keys requires a custom IMA policy to be loaded. Keys should
    be queued for measurement if a custom IMA policy is not yet loaded.
    Keys queued for measurement, if any, should be processed when a custom
    policy is loaded.

    This patch updates the IMA hook function ima_post_key_create_or_update()
    to queue the key if a custom IMA policy has not yet been loaded. And,
    ima_update_policy() function, which is called when a custom IMA policy
    is loaded, is updated to process queued keys.

    Signed-off-by: Lakshmi Ramasubramanian
    Signed-off-by: Mimi Zohar

    Lakshmi Ramasubramanian
     
  • Measuring keys requires a custom IMA policy to be loaded. Keys created
    or updated before a custom IMA policy is loaded should be queued and
    will be processed after a custom policy is loaded.

    This patch defines a workqueue for queuing keys when a custom IMA policy
    has not yet been loaded. An intermediate Kconfig boolean option namely
    IMA_QUEUE_EARLY_BOOT_KEYS is used to declare the workqueue functions.

    A flag namely ima_process_keys is used to check if the key should be
    queued or should be processed immediately.

    Signed-off-by: Lakshmi Ramasubramanian
    Signed-off-by: Mimi Zohar

    Lakshmi Ramasubramanian
     
  • ima_match_keyring() is called while holding rcu read lock. Since this
    function executes in atomic context, it should not call any function
    that can sleep (such as kstrdup()).

    This patch pre-allocates a buffer to hold the keyrings string read from
    the IMA policy and uses that to match the given keyring.

    Signed-off-by: Lakshmi Ramasubramanian
    Fixes: e9085e0ad38a ("IMA: Add support to limit measuring keys")
    Signed-off-by: Mimi Zohar

    Lakshmi Ramasubramanian
     
  • Keep the ima policy rules around from the beginning even if they appear
    invalid at the time of loading, as they may become active after an lsm
    policy load. However, loading a custom IMA policy with unknown LSM
    labels is only safe after we have transitioned from the "built-in"
    policy rules to a custom IMA policy.

    Patch also fixes the rule re-use during the lsm policy reload and makes
    some prints a bit more human readable.

    Changelog:
    v4:
    - Do not allow the initial policy load refer to non-existing lsm rules.
    v3:
    - Fix too wide policy rule matching for non-initialized LSMs
    v2:
    - Fix log prints

    Fixes: b16942455193 ("ima: use the lsm policy update notifier")
    Cc: Casey Schaufler
    Reported-by: Mimi Zohar
    Signed-off-by: Janne Karhunen
    Signed-off-by: Konsta Karsisto
    Signed-off-by: Mimi Zohar

    Janne Karhunen
     
  • This allows other parts of the kernel (perhaps a stacked LSM allowing
    system monitoring, eg. the proposed KRSI LSM [1]) to retrieve the hash
    of a given file from IMA if it's present in the iint cache.

    It's true that the existence of the hash means that it's also in the
    audit logs or in /sys/kernel/security/ima/ascii_runtime_measurements,
    but it can be difficult to pull that information out for every
    subsequent exec. This is especially true if a given host has been up
    for a long time and the file was first measured a long time ago.

    It should be kept in mind that this function gives access to cached
    entries which can be removed, for instance on security_inode_free().

    This is based on Peter Moody's patch:
    https://sourceforge.net/p/linux-ima/mailman/message/33036180/

    [1] https://lkml.org/lkml/2019/9/10/393

    Signed-off-by: Florent Revest
    Reviewed-by: KP Singh
    Signed-off-by: Mimi Zohar

    Florent Revest
     
  • When reading ima_policy from securityfs, there is a missing
    space between output string of LSM rules and the remaining
    rules.

    Signed-off-by: Clay Chang
    Signed-off-by: Mimi Zohar

    Clay Chang
     

20 Jan, 2020

1 commit

  • commit 2db154b3ea8e ("vfs: syscall: Add move_mount(2) to move mounts around")
    introduced a new move_mount(2) system call and a corresponding new LSM
    security_move_mount hook but did not implement this hook for any existing
    LSM. This creates a regression for SELinux with respect to consistent
    checking of mounts; the existing selinux_mount hook checks mounton
    permission to the mount point path. Provide a SELinux hook
    implementation for move_mount that applies this same check for
    consistency. In the future we may wish to add a new move_mount
    filesystem permission and check as well, but this addresses
    the immediate regression.

    Fixes: 2db154b3ea8e ("vfs: syscall: Add move_mount(2) to move mounts around")
    Signed-off-by: Stephen Smalley
    Reviewed-by: Ondrej Mosnacek
    Signed-off-by: Paul Moore

    Stephen Smalley
     

17 Jan, 2020

4 commits

  • In security_load_policy(), we can defer allocating the newpolicydb
    ancillary array to after checking state->initialized, thereby avoiding
    the pointless allocation when loading policy the first time.

    Signed-off-by: Ondrej Mosnacek
    [PM: merged portions by hand]
    Reviewed-by: Stephen Smalley
    Signed-off-by: Paul Moore

    Ondrej Mosnacek
     
  • This patch removes the inode, file, and superblock security blob
    allocation functions and moves the associated code into the
    respective LSM hooks. This patch also removes the inode_doinit()
    function as it was a trivial wrapper around
    inode_doinit_with_dentry() and called from one location in the code.

    Reviewed-by: Casey Schaufler
    Acked-by: Stephen Smalley
    Signed-off-by: Paul Moore

    Paul Moore
     
  • selinux_nlmsg_perm is used for only by selinux_netlink_send. Remove
    the redundant function to simplify the code.

    Fix a typo by suggestion from Stephen.

    Signed-off-by: Huaisheng Ye
    Acked-by: Stephen Smalley
    Signed-off-by: Paul Moore

    Huaisheng Ye
     
  • Two places used u32 where there should have been __le32.

    Fixes sparse warnings:
    CHECK [...]/security/selinux/ss/services.c
    [...]/security/selinux/ss/policydb.c:2669:16: warning: incorrect type in assignment (different base types)
    [...]/security/selinux/ss/policydb.c:2669:16: expected unsigned int
    [...]/security/selinux/ss/policydb.c:2669:16: got restricted __le32 [usertype]
    [...]/security/selinux/ss/policydb.c:2674:24: warning: incorrect type in assignment (different base types)
    [...]/security/selinux/ss/policydb.c:2674:24: expected unsigned int
    [...]/security/selinux/ss/policydb.c:2674:24: got restricted __le32 [usertype]
    [...]/security/selinux/ss/policydb.c:2675:24: warning: incorrect type in assignment (different base types)
    [...]/security/selinux/ss/policydb.c:2675:24: expected unsigned int
    [...]/security/selinux/ss/policydb.c:2675:24: got restricted __le32 [usertype]
    [...]/security/selinux/ss/policydb.c:2676:24: warning: incorrect type in assignment (different base types)
    [...]/security/selinux/ss/policydb.c:2676:24: expected unsigned int
    [...]/security/selinux/ss/policydb.c:2676:24: got restricted __le32 [usertype]
    [...]/security/selinux/ss/policydb.c:2681:32: warning: incorrect type in assignment (different base types)
    [...]/security/selinux/ss/policydb.c:2681:32: expected unsigned int
    [...]/security/selinux/ss/policydb.c:2681:32: got restricted __le32 [usertype]
    [...]/security/selinux/ss/policydb.c:2701:16: warning: incorrect type in assignment (different base types)
    [...]/security/selinux/ss/policydb.c:2701:16: expected unsigned int
    [...]/security/selinux/ss/policydb.c:2701:16: got restricted __le32 [usertype]
    [...]/security/selinux/ss/policydb.c:2706:24: warning: incorrect type in assignment (different base types)
    [...]/security/selinux/ss/policydb.c:2706:24: expected unsigned int
    [...]/security/selinux/ss/policydb.c:2706:24: got restricted __le32 [usertype]
    [...]/security/selinux/ss/policydb.c:2707:24: warning: incorrect type in assignment (different base types)
    [...]/security/selinux/ss/policydb.c:2707:24: expected unsigned int
    [...]/security/selinux/ss/policydb.c:2707:24: got restricted __le32 [usertype]

    Signed-off-by: Ondrej Mosnacek
    Reviewed-by: Stephen Smalley
    Signed-off-by: Paul Moore

    Ondrej Mosnacek
     

15 Jan, 2020

1 commit

  • This patch adds vlan rtm definitions:
    - NEWVLAN: to be used for creating vlans, setting options and
    notifications
    - DELVLAN: to be used for deleting vlans
    - GETVLAN: used for dumping vlan information

    Dumping vlans which can span multiple messages is added now with basic
    information (vid and flags). We use nlmsg_parse() to validate the header
    length in order to be able to extend the message with filtering
    attributes later.

    Signed-off-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Nikolay Aleksandrov
     

11 Jan, 2020

6 commits

  • kunit tests that do not support module build should depend
    on KUNIT=y rather than just KUNIT in Kconfig, otherwise
    they will trigger compilation errors for "make allmodconfig"
    builds.

    Fixes: 9fe124bf1b77 ("kunit: allow kunit to be loaded as a module")
    Reported-by: Stephen Rothwell
    Signed-off-by: Alan Maguire
    Signed-off-by: Shuah Khan

    Alan Maguire
     
  • Commit b1d9e6b0646d ("LSM: Switch to lists of hooks") switched the LSM
    infrastructure to use per-hook lists, which meant that removing the
    hooks for a given module was no longer atomic. Even though the commit
    clearly documents that modules implementing runtime revmoval of hooks
    (only SELinux attempts this madness) need to take special precautions to
    avoid race conditions, SELinux has never addressed this.

    By inserting an artificial delay between the loop iterations of
    security_delete_hooks() (I used 100 ms), booting to a state where
    SELinux is enabled, but policy is not yet loaded, and running these
    commands:

    while true; do ping -c 1 ; done &
    echo -n 1 >/sys/fs/selinux/disable
    kill %1
    wait

    ...I was able to trigger NULL pointer dereferences in various places. I
    also have a report of someone getting panics on a stock RHEL-8 kernel
    after setting SELINUX=disabled in /etc/selinux/config and rebooting
    (without adding "selinux=0" to kernel command-line).

    Reordering the SELinux hooks such that those that allocate structures
    are removed last seems to prevent these panics. It is very much possible
    that this doesn't make the runtime disable completely race-free, but at
    least it makes the operation much less fragile.

    Cc: stable@vger.kernel.org
    Fixes: b1d9e6b0646d ("LSM: Switch to lists of hooks")
    Signed-off-by: Ondrej Mosnacek
    Reviewed-by: Stephen Smalley
    Signed-off-by: Paul Moore

    Ondrej Mosnacek
     
  • The disabled/enforcing/initialized flags are all accessed concurrently
    by threads so use the appropriate accessors that ensure atomicity and
    document that it is expected.

    Use smp_load/acquire...() helpers (with memory barriers) for the
    initialized flag, since it gates access to the rest of the state
    structures.

    Note that the disabled flag is currently not used for anything other
    than avoiding double disable, but it will be used for bailing out of
    hooks once security_delete_hooks() is removed.

    Signed-off-by: Ondrej Mosnacek
    Acked-by: Stephen Smalley
    Reviewed-by: Kees Cook
    Reviewed-by: James Morris
    Signed-off-by: Paul Moore

    Ondrej Mosnacek
     
  • SELinux checks whether VM_EXEC is set in the VM_DATA_DEFAULT_FLAGS
    during initialization and saves the result in default_noexec for use
    in its mmap and mprotect hook function implementations to decide
    whether to apply EXECMEM, EXECHEAP, EXECSTACK, and EXECMOD checks.
    Mark default_noexec as ro_after_init to prevent later clearing it
    and thereby disabling these checks. It is only set legitimately from
    init code.

    Signed-off-by: Stephen Smalley
    Signed-off-by: Paul Moore

    Stephen Smalley
     
  • Move cache based pkey sid retrieval code which was added
    with commit "409dcf31" under CONFIG_SECURITY_INFINIBAND.
    As its going to alloc a new cache which impacts
    low RAM devices which was enabled by default.

    Suggested-by: Paul Moore
    Signed-off-by: Ravi Kumar Siddojigari
    [PM: checkpatch.pl cleanups, fixed capitalization in the description]
    Signed-off-by: Paul Moore

    Ravi Kumar Siddojigari
     
  • selinux_msg_msg_alloc_security only calls msg_msg_alloc_security but
    do nothing else. And also msg_msg_alloc_security is just used by the
    former.

    Remove the redundant function to simplify the code.

    Signed-off-by: Huaisheng Ye
    Acked-by: Stephen Smalley
    Signed-off-by: Paul Moore

    Huaisheng Ye
     

10 Jan, 2020

2 commits

  • Add KUnit tests to test AppArmor unpacking of userspace policies.
    AppArmor uses a serialized binary format for loading policies. To find
    policy format documentation see
    Documentation/admin-guide/LSM/apparmor.rst.

    In order to write the tests against the policy unpacking code, some
    static functions needed to be exposed for testing purposes. One of the
    goals of this patch is to establish a pattern for which testing these
    kinds of functions should be done in the future.

    Signed-off-by: Brendan Higgins
    Signed-off-by: Mike Salvatore
    Acked-by: John Johansen
    Reviewed-by: Kees Cook
    Signed-off-by: Shuah Khan

    Mike Salvatore
     
  • As a result of the asymmetric public keys subtype Kconfig option being
    defined as tristate, with the existing IMA Makefile, ima_asymmetric_keys.c
    could be built as a kernel module. To prevent this from happening, this
    patch defines and uses an intermediate Kconfig boolean option named
    IMA_MEASURE_ASYMMETRIC_KEYS.

    Signed-off-by: Lakshmi Ramasubramanian
    Suggested-by: James.Bottomley
    Cc: David Howells
    Cc: Jarkko Sakkinen
    Reported-by: kbuild test robot # ima_asymmetric_keys.c
    is built as a kernel module.
    Fixes: 88e70da170e8 ("IMA: Define an IMA hook to measure keys")
    Fixes: cb1aa3823c92 ("KEYS: Call the IMA hook to measure keys")
    [zohar@linux.ibm.com: updated patch description]
    Signed-off-by: Mimi Zohar

    Lakshmi Ramasubramanian