07 Oct, 2020

1 commit

  • Kernel threads intentionally do CLONE_FS in order to follow any changes
    that 'init' does to set up the root directory (or cwd).

    It is admittedly a bit odd, but it avoids the situation where 'init'
    does some extensive setup to initialize the system environment, and then
    we execute a usermode helper program, and it uses the original FS setup
    from boot time that may be very limited and incomplete.

    [ Both Al Viro and Eric Biederman point out that 'pivot_root()' will
    follow the root regardless, since it fixes up other users of root (see
    chroot_fs_refs() for details), but overmounting root and doing a
    chroot() would not. ]

    However, Vegard Nossum noticed that the CLONE_FS not only means that we
    follow the root and current working directories, it also means we share
    umask with whatever init changed it to. That wasn't intentional.

    Just reset umask to the original default (0022) before actually starting
    the usermode helper program.

    Reported-by: Vegard Nossum
    Cc: Al Viro
    Acked-by: Eric W. Biederman
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

13 Aug, 2020

1 commit

  • Add a helper that waits for a pid and stores the status in the passed in
    kernel pointer. Use it to fix the usage of kernel_wait4 in
    call_usermodehelper_exec_sync that only happens to work due to the
    implicit set_fs(KERNEL_DS) for kernel threads.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Andrew Morton
    Reviewed-by: Andrew Morton
    Acked-by: "Eric W. Biederman"
    Cc: Luis Chamberlain
    Link: http://lkml.kernel.org/r/20200721130449.5008-1-hch@lst.de
    Signed-off-by: Linus Torvalds

    Christoph Hellwig
     

21 Jul, 2020

1 commit

  • To allow the kernel not to play games with set_fs to call exec
    implement kernel_execve. The function kernel_execve takes pointers
    into kernel memory and copies the values pointed to onto the new
    userspace stack.

    The calls with arguments from kernel space of do_execve are replaced
    with calls to kernel_execve.

    The calls do_execve and do_execveat are made static as there are now
    no callers outside of exec.

    The comments that mention do_execve are updated to refer to
    kernel_execve or execve depending on the circumstances. In addition
    to correcting the comments, this makes it easy to grep for do_execve
    and verify it is not used.

    Inspired-by: https://lkml.kernel.org/r/20200627072704.2447163-1-hch@lst.de
    Reviewed-by: Kees Cook
    Link: https://lkml.kernel.org/r/87wo365ikj.fsf@x220.int.ebiederm.org
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     

04 Jul, 2020

6 commits

  • With the user mode driver code changed to not set subprocess_info.file
    there are no more users of subproces_info.file. Remove this field
    from struct subprocess_info and remove the only user in
    call_usermodehelper_exec_async that would call do_execve_file instead
    of do_execve if file was set.

    v1: https://lkml.kernel.org/r/877dvuf0i7.fsf_-_@x220.int.ebiederm.org
    v2: https://lkml.kernel.org/r/87r1tx4p2a.fsf_-_@x220.int.ebiederm.org
    Link: https://lkml.kernel.org/r/20200702164140.4468-9-ebiederm@xmission.com
    Reviewed-by: Greg Kroah-Hartman
    Acked-by: Alexei Starovoitov
    Tested-by: Alexei Starovoitov
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • This makes it clear which code is part of the core user mode
    helper support and which code is needed to implement user mode
    drivers.

    This makes the kernel smaller for everyone who does not use a usermode
    driver.

    v1: https://lkml.kernel.org/r/87tuyyf0ln.fsf_-_@x220.int.ebiederm.org
    v2: https://lkml.kernel.org/r/87imf963s6.fsf_-_@x220.int.ebiederm.org
    Link: https://lkml.kernel.org/r/20200702164140.4468-5-ebiederm@xmission.com
    Reviewed-by: Greg Kroah-Hartman
    Acked-by: Alexei Starovoitov
    Tested-by: Alexei Starovoitov
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • The only caller of call_usermodehelper_setup_file is fork_usermode_blob.
    In fork_usermode_blob replace call_usermodehelper_setup_file with
    call_usermodehelper_setup and delete fork_usermodehelper_setup_file.

    For this to work the argv_free is moved from umh_clean_and_save_pid
    to fork_usermode_blob.

    v1: https://lkml.kernel.org/r/87zh8qf0mp.fsf_-_@x220.int.ebiederm.org
    v2: https://lkml.kernel.org/r/87o8p163u1.fsf_-_@x220.int.ebiederm.org
    Link: https://lkml.kernel.org/r/20200702164140.4468-4-ebiederm@xmission.com
    Reviewed-by: Greg Kroah-Hartman
    Acked-by: Alexei Starovoitov
    Tested-by: Alexei Starovoitov
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • Now that the functionality of umh_setup_pipe and
    umh_clean_and_save_pid has changed their names are too specific and
    don't make much sense. Instead name them umd_setup and umd_cleanup
    for the functional role in setting up user mode drivers.

    v1: https://lkml.kernel.org/r/875zbegf82.fsf_-_@x220.int.ebiederm.org
    v2: https://lkml.kernel.org/r/87tuyt63x3.fsf_-_@x220.int.ebiederm.org
    Link: https://lkml.kernel.org/r/20200702164140.4468-3-ebiederm@xmission.com
    Reviewed-by: Greg Kroah-Hartman
    Acked-by: Alexei Starovoitov
    Tested-by: Alexei Starovoitov
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • I am separating the code specific to user mode drivers from the code
    for ordinary user space helpers. Move setting of PF_UMH from
    call_usermodehelper_exec_async which is core user mode helper code
    into umh_pipe_setup which is user mode driver code.

    The code is equally as easy to write in one location as the other and
    the movement minimizes the impact of the user mode driver code on the
    core of the user mode helper code.

    Setting PF_UMH unconditionally is harmless as an action will only
    happen if it is paired with an entry on umh_list.

    v1: https://lkml.kernel.org/r/87bll6gf8t.fsf_-_@x220.int.ebiederm.org
    v2: https://lkml.kernel.org/r/87zh8l63xs.fsf_-_@x220.int.ebiederm.org
    Link: https://lkml.kernel.org/r/20200702164140.4468-2-ebiederm@xmission.com
    Reviewed-by: Greg Kroah-Hartman
    Acked-by: Alexei Starovoitov
    Tested-by: Alexei Starovoitov
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • The pid in struct subprocess_info is only used by umh_clean_and_save_pid to
    write the pid into umh_info.

    Instead always capture the pid on struct umh_info in umh_pipe_setup, removing
    code that is specific to user mode drivers from the common user path of
    user mode helpers.

    v1: https://lkml.kernel.org/r/87h7uygf9i.fsf_-_@x220.int.ebiederm.org
    v2: https://lkml.kernel.org/r/875zb97iix.fsf_-_@x220.int.ebiederm.org
    Link: https://lkml.kernel.org/r/20200702164140.4468-1-ebiederm@xmission.com
    Reviewed-by: Greg Kroah-Hartman
    Acked-by: Alexei Starovoitov
    Tested-by: Alexei Starovoitov
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     

16 May, 2020

2 commits

  • Move the bpf verifier trace check into the new switch statement in
    HEAD.

    Resolve the overlapping changes in hinic, where bug fixes overlap
    the addition of VF support.

    Signed-off-by: David S. Miller

    David S. Miller
     
  • Pull networking fixes from David Miller:

    1) Fix sk_psock reference count leak on receive, from Xiyu Yang.

    2) CONFIG_HNS should be invisible, from Geert Uytterhoeven.

    3) Don't allow locking route MTUs in ipv6, RFCs actually forbid this,
    from Maciej Żenczykowski.

    4) ipv4 route redirect backoff wasn't actually enforced, from Paolo
    Abeni.

    5) Fix netprio cgroup v2 leak, from Zefan Li.

    6) Fix infinite loop on rmmod in conntrack, from Florian Westphal.

    7) Fix tcp SO_RCVLOWAT hangs, from Eric Dumazet.

    8) Various bpf probe handling fixes, from Daniel Borkmann.

    * git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (68 commits)
    selftests: mptcp: pm: rm the right tmp file
    dpaa2-eth: properly handle buffer size restrictions
    bpf: Restrict bpf_trace_printk()'s %s usage and add %pks, %pus specifier
    bpf: Add bpf_probe_read_{user, kernel}_str() to do_refine_retval_range
    bpf: Restrict bpf_probe_read{, str}() only to archs where they work
    MAINTAINERS: Mark networking drivers as Maintained.
    ipmr: Add lockdep expression to ipmr_for_each_table macro
    ipmr: Fix RCU list debugging warning
    drivers: net: hamradio: Fix suspicious RCU usage warning in bpqether.c
    net: phy: broadcom: fix BCM54XX_SHD_SCR3_TRDDAPD value for BCM54810
    tcp: fix error recovery in tcp_zerocopy_receive()
    MAINTAINERS: Add Jakub to networking drivers.
    MAINTAINERS: another add of Karsten Graul for S390 networking
    drivers: ipa: fix typos for ipa_smp2p structure doc
    pppoe: only process PADT targeted at local interfaces
    selftests/bpf: Enforce returning 0 for fentry/fexit programs
    bpf: Enforce returning 0 for fentry/fexit progs
    net: stmmac: fix num_por initialization
    security: Fix the default value of secid_to_secctx hook
    libbpf: Fix register naming in PT_REGS s390 macros
    ...

    Linus Torvalds
     

09 May, 2020

1 commit

  • If a UMH process created by fork_usermode_blob() fails to execute,
    a pair of struct file allocated by umh_pipe_setup() will leak.

    Under normal conditions, the caller (like bpfilter) needs to manage the
    lifetime of the UMH and its two pipes. But when fork_usermode_blob()
    fails, the caller doesn't really have a way to know what needs to be
    done. It seems better to do the cleanup ourselves in this case.

    Fixes: 449325b52b7a ("umh: introduce fork_usermode_blob() helper")
    Signed-off-by: Vincent Minet
    Signed-off-by: Jakub Kicinski

    Vincent Minet
     

28 Apr, 2020

1 commit

  • Commit 64e90a8acb859 ("Introduce STATIC_USERMODEHELPER to mediate
    call_usermodehelper()") added the optiont to disable all
    call_usermodehelper() calls by setting STATIC_USERMODEHELPER_PATH to
    an empty string. When this is done, and crashdump is triggered, it
    will crash on null pointer dereference, since we make assumptions
    over what call_usermodehelper_exec() did.

    This has been reported by Sergey when one triggers a a coredump
    with the following configuration:

    ```
    CONFIG_STATIC_USERMODEHELPER=y
    CONFIG_STATIC_USERMODEHELPER_PATH=""
    kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h %e
    ```

    The way disabling the umh was designed was that call_usermodehelper_exec()
    would just return early, without an error. But coredump assumes
    certain variables are set up for us when this happens, and calls
    ile_start_write(cprm.file) with a NULL file.

    [ 2.819676] BUG: kernel NULL pointer dereference, address: 0000000000000020
    [ 2.819859] #PF: supervisor read access in kernel mode
    [ 2.820035] #PF: error_code(0x0000) - not-present page
    [ 2.820188] PGD 0 P4D 0
    [ 2.820305] Oops: 0000 [#1] SMP PTI
    [ 2.820436] CPU: 2 PID: 89 Comm: a Not tainted 5.7.0-rc1+ #7
    [ 2.820680] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ?-20190711_202441-buildvm-armv7-10.arm.fedoraproject.org-2.fc31 04/01/2014
    [ 2.821150] RIP: 0010:do_coredump+0xd80/0x1060
    [ 2.821385] Code: e8 95 11 ed ff 48 c7 c6 cc a7 b4 81 48 8d bd 28 ff
    ff ff 89 c2 e8 70 f1 ff ff 41 89 c2 85 c0 0f 84 72 f7 ff ff e9 b4 fe ff
    ff 8b 57 20 0f b7 02 66 25 00 f0 66 3d 00 8
    0 0f 84 9c 01 00 00 44
    [ 2.822014] RSP: 0000:ffffc9000029bcb8 EFLAGS: 00010246
    [ 2.822339] RAX: 0000000000000000 RBX: ffff88803f860000 RCX: 000000000000000a
    [ 2.822746] RDX: 0000000000000009 RSI: 0000000000000282 RDI: 0000000000000000
    [ 2.823141] RBP: ffffc9000029bde8 R08: 0000000000000000 R09: ffffc9000029bc00
    [ 2.823508] R10: 0000000000000001 R11: ffff88803dec90be R12: ffffffff81c39da0
    [ 2.823902] R13: ffff88803de84400 R14: 0000000000000000 R15: 0000000000000000
    [ 2.824285] FS: 00007fee08183540(0000) GS:ffff88803e480000(0000) knlGS:0000000000000000
    [ 2.824767] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 2.825111] CR2: 0000000000000020 CR3: 000000003f856005 CR4: 0000000000060ea0
    [ 2.825479] Call Trace:
    [ 2.825790] get_signal+0x11e/0x720
    [ 2.826087] do_signal+0x1d/0x670
    [ 2.826361] ? force_sig_info_to_task+0xc1/0xf0
    [ 2.826691] ? force_sig_fault+0x3c/0x40
    [ 2.826996] ? do_trap+0xc9/0x100
    [ 2.827179] exit_to_usermode_loop+0x49/0x90
    [ 2.827359] prepare_exit_to_usermode+0x77/0xb0
    [ 2.827559] ? invalid_op+0xa/0x30
    [ 2.827747] ret_from_intr+0x20/0x20
    [ 2.827921] RIP: 0033:0x55e2c76d2129
    [ 2.828107] Code: 2d ff ff ff e8 68 ff ff ff 5d c6 05 18 2f 00 00 01
    c3 0f 1f 80 00 00 00 00 c3 0f 1f 80 00 00 00 00 e9 7b ff ff ff 55 48 89
    e5 0b b8 00 00 00 00 5d c3 66 2e 0f 1f 84 0
    0 00 00 00 00 0f 1f 40
    [ 2.828603] RSP: 002b:00007fffeba5e080 EFLAGS: 00010246
    [ 2.828801] RAX: 000055e2c76d2125 RBX: 0000000000000000 RCX: 00007fee0817c718
    [ 2.829034] RDX: 00007fffeba5e188 RSI: 00007fffeba5e178 RDI: 0000000000000001
    [ 2.829257] RBP: 00007fffeba5e080 R08: 0000000000000000 R09: 00007fee08193c00
    [ 2.829482] R10: 0000000000000009 R11: 0000000000000000 R12: 000055e2c76d2040
    [ 2.829727] R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
    [ 2.829964] CR2: 0000000000000020
    [ 2.830149] ---[ end trace ceed83d8c68a1bf1 ]---
    ```

    Cc: # v4.11+
    Fixes: 64e90a8acb85 ("Introduce STATIC_USERMODEHELPER to mediate call_usermodehelper()")
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=199795
    Reported-by: Tony Vroon
    Reported-by: Sergey Kvachonok
    Tested-by: Sergei Trofimovich
    Signed-off-by: Luis Chamberlain
    Link: https://lore.kernel.org/r/20200416162859.26518-1-mcgrof@kernel.org
    Signed-off-by: Greg Kroah-Hartman

    Luis Chamberlain
     

27 Apr, 2020

1 commit

  • Instead of having all the sysctl handlers deal with user pointers, which
    is rather hairy in terms of the BPF interaction, copy the input to and
    from userspace in common code. This also means that the strings are
    always NUL-terminated by the common code, making the API a little bit
    safer.

    As most handler just pass through the data to one of the common handlers
    a lot of the changes are mechnical.

    Signed-off-by: Christoph Hellwig
    Acked-by: Andrey Ignatov
    Signed-off-by: Al Viro

    Christoph Hellwig
     

21 May, 2019

1 commit

  • Add SPDX license identifiers to all files which:

    - Have no license information of any form

    - Have EXPORT_.*_SYMBOL_GPL inside which was used in the
    initial scan/conversion to ignore the file

    These files fall under the project license, GPL v2 only. The resulting SPDX
    license identifier is:

    GPL-2.0-only

    Signed-off-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

12 Jan, 2019

1 commit

  • A UMH process which is created by the fork_usermode_blob() such as
    bpfilter needs to release members of the umh_info when process is
    terminated.
    But the do_exit() does not release members of the umh_info. hence module
    which uses UMH needs own code to detect whether UMH process is
    terminated or not.
    But this implementation needs extra code for checking the status of
    UMH process. it eventually makes the code more complex.

    The new PF_UMH flag is added and it is used to identify UMH processes.
    The exit_umh() does not release members of the umh_info.
    Hence umh_info->cleanup callback should release both members of the
    umh_info and the private data.

    Suggested-by: David S. Miller
    Signed-off-by: Taehee Yoo
    Signed-off-by: David S. Miller

    Taehee Yoo
     

23 Oct, 2018

1 commit

  • User mode helpers were spawned without a command line, and because
    an empty command line is used by many tools to identify processes as
    kernel threads, this could cause some issues.

    Notably during killing spree on shutdown, since such helper would then
    be skipped (i.e. not killed) which would result in the process remaining
    alive, and thus preventing unmouting of the rootfs (as experienced with
    the bpfilter umh).

    Fixes: 449325b52b7a ("umh: introduce fork_usermode_blob() helper")
    Signed-off-by: Olivier Brunel
    Signed-off-by: David S. Miller

    Olivier Brunel
     

08 Jun, 2018

1 commit

  • kasan reported use-after-free:
    BUG: KASAN: use-after-free in call_usermodehelper_exec_work+0x2d3/0x310 kernel/umh.c:195
    Write of size 4 at addr ffff8801d9202370 by task kworker/u4:2/50
    Workqueue: events_unbound call_usermodehelper_exec_work
    Call Trace:
    __dump_stack lib/dump_stack.c:77 [inline]
    dump_stack+0x1b9/0x294 lib/dump_stack.c:113
    print_address_description+0x6c/0x20b mm/kasan/report.c:256
    kasan_report_error mm/kasan/report.c:354 [inline]
    kasan_report.cold.7+0x242/0x2fe mm/kasan/report.c:412
    __asan_report_store4_noabort+0x17/0x20 mm/kasan/report.c:437
    call_usermodehelper_exec_work+0x2d3/0x310 kernel/umh.c:195
    process_one_work+0xc1e/0x1b50 kernel/workqueue.c:2145
    worker_thread+0x1cc/0x1440 kernel/workqueue.c:2279
    kthread+0x345/0x410 kernel/kthread.c:240
    ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:412

    The reason is that 'sub_info' cannot be accessed out of parent task
    context, since it will be freed by the child.
    Instead remember the pid in the child task.

    Fixes: 449325b52b7a ("umh: introduce fork_usermode_blob() helper")
    Reported-by: syzbot+2c73319c406f1987d156@syzkaller.appspotmail.com
    Signed-off-by: Alexei Starovoitov
    Signed-off-by: David S. Miller

    Alexei Starovoitov
     

24 May, 2018

1 commit

  • Introduce helper:
    int fork_usermode_blob(void *data, size_t len, struct umh_info *info);
    struct umh_info {
    struct file *pipe_to_umh;
    struct file *pipe_from_umh;
    pid_t pid;
    };

    that GPLed kernel modules (signed or unsigned) can use it to execute part
    of its own data as swappable user mode process.

    The kernel will do:
    - allocate a unique file in tmpfs
    - populate that file with [data, data + len] bytes
    - user-mode-helper code will do_execve that file and, before the process
    starts, the kernel will create two unix pipes for bidirectional
    communication between kernel module and umh
    - close tmpfs file, effectively deleting it
    - the fork_usermode_blob will return zero on success and populate
    'struct umh_info' with two unix pipes and the pid of the user process

    As the first step in the development of the bpfilter project
    the fork_usermode_blob() helper is introduced to allow user mode code
    to be invoked from a kernel module. The idea is that user mode code plus
    normal kernel module code are built as part of the kernel build
    and installed as traditional kernel module into distro specified location,
    such that from a distribution point of view, there is
    no difference between regular kernel modules and kernel modules + umh code.
    Such modules can be signed, modprobed, rmmod, etc. The use of this new helper
    by a kernel module doesn't make it any special from kernel and user space
    tooling point of view.

    Such approach enables kernel to delegate functionality traditionally done
    by the kernel modules into the user space processes (either root or !root) and
    reduces security attack surface of the new code. The buggy umh code would crash
    the user process, but not the kernel. Another advantage is that umh code
    of the kernel module can be debugged and tested out of user space
    (e.g. opening the possibility to run clang sanitizers, fuzzers or
    user space test suites on the umh code).
    In case of the bpfilter project such architecture allows complex control plane
    to be done in the user space while bpf based data plane stays in the kernel.

    Since umh can crash, can be oom-ed by the kernel, killed by the admin,
    the kernel module that uses them (like bpfilter) needs to manage life
    time of umh on its own via two unix pipes and the pid of umh.

    The exit code of such kernel module should kill the umh it started,
    so that rmmod of the kernel module will cleanup the corresponding umh.
    Just like if the kernel module does kmalloc() it should kfree() it
    in the exit code.

    Signed-off-by: Alexei Starovoitov
    Signed-off-by: David S. Miller

    Alexei Starovoitov
     

03 Apr, 2018

1 commit

  • All call sites of sys_wait4() set *rusage to NULL. Therefore, there is
    no need for the copy_to_user() handling of *rusage, and we can use
    kernel_wait4() directly.

    This patch is part of a series which removes in-kernel calls to syscalls.
    On this basis, the syscall entry path can be streamlined. For details, see
    http://lkml.kernel.org/r/20180325162527.GA17492@light.dominikbrodowski.net

    Acked-by: Luis R. Rodriguez
    Cc: Al Viro
    Cc: Andrew Morton
    Signed-off-by: Dominik Brodowski

    Dominik Brodowski
     

18 Nov, 2017

1 commit


09 Sep, 2017

1 commit

  • Patch series "kmod: few code cleanups to split out umh code"

    The usermode helper has a provenance from the old usb code which first
    required a usermode helper. Eventually this was shoved into kmod.c and
    the kernel's modprobe calls was converted over eventually to share the
    same code. Over time the list of usermode helpers in the kernel has grown
    -- so kmod is just but one user of the API.

    This series is a simple logical cleanup which acknowledges the code
    evolution of the usermode helper and shoves the UMH API into its own
    dedicated file. This way users of the API can later just include umh.h
    instead of kmod.h.

    Note despite the diff state the first patch really is just a code shove,
    no functional changes are done there. I did use git format-patch -M to
    generate the patch, but in the end the split was not enough for git to
    consider it a rename hence the large diffstat.

    I've put this through 0-day and it gives me their machine compilation
    blessings with all tests as OK.

    This patch (of 4):

    There's a slew of usermode helper users and kmod is just one of them.
    Split out the usermode helper code into its own file to keep the logic and
    focus split up.

    This change provides no functional changes.

    Link: http://lkml.kernel.org/r/20170810180618.22457-2-mcgrof@kernel.org
    Signed-off-by: Luis R. Rodriguez
    Cc: Kees Cook
    Cc: Dmitry Torokhov
    Cc: Jessica Yu
    Cc: Rusty Russell
    Cc: Michal Marek
    Cc: Petr Mladek
    Cc: Miroslav Benes
    Cc: Josh Poimboeuf
    Cc: Guenter Roeck
    Cc: "Eric W. Biederman"
    Cc: Matt Redfearn
    Cc: Dan Carpenter
    Cc: Colin Ian King
    Cc: Daniel Mentz
    Cc: David Binderman
    Cc: Greg Kroah-Hartman
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Luis R. Rodriguez