01 Feb, 2020

1 commit

  • commit eb143f8756e77c8fcfc4d574922ae9efd3a43ca9 upstream.

    Since commit 43e23b6c0b01 ("debugfs: log errors when something goes wrong")
    debugfs logs attempts to create existing files.

    However binder attempts to create multiple debugfs files with
    the same name when a single PID has multiple contexts, this leads
    to log spamming during an Android boot (17 such messages during
    boot on my system).

    Fix this by checking if we already know the PID and only create
    the debugfs entry for the first context per PID.

    Do the same thing for binderfs for symmetry.

    Signed-off-by: Martin Fuzzey
    Acked-by: Todd Kjos
    Fixes: 43e23b6c0b01 ("debugfs: log errors when something goes wrong")
    Cc: stable
    Link: https://lore.kernel.org/r/1578671054-5982-1-git-send-email-martin.fuzzey@flowbird.group
    Signed-off-by: Greg Kroah-Hartman

    Martin Fuzzey
     

18 Dec, 2019

1 commit

  • commit 16981742717b04644a41052570fb502682a315d2 upstream.

    For BINDER_TYPE_PTR and BINDER_TYPE_FDA transactions, the
    num_valid local was calculated incorrectly causing the
    range check in binder_validate_ptr() to miss out-of-bounds
    offsets.

    Fixes: bde4a19fc04f ("binder: use userspace pointer as base of buffer space")
    Signed-off-by: Todd Kjos
    Cc: stable
    Link: https://lore.kernel.org/r/20191213202531.55010-1-tkjos@google.com
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     

17 Oct, 2019

1 commit

  • binder_mmap() tries to prevent the creation of overly big binder mappings
    by silently truncating the size of the VMA to 4MiB. However, this violates
    the API contract of mmap(). If userspace attempts to create a large binder
    VMA, and later attempts to unmap that VMA, it will call munmap() on a range
    beyond the end of the VMA, which may have been allocated to another VMA in
    the meantime. This can lead to userspace memory corruption.

    The following sequence of calls leads to a segfault without this commit:

    int main(void) {
    int binder_fd = open("/dev/binder", O_RDWR);
    if (binder_fd == -1) err(1, "open binder");
    void *binder_mapping = mmap(NULL, 0x800000UL, PROT_READ, MAP_SHARED,
    binder_fd, 0);
    if (binder_mapping == MAP_FAILED) err(1, "mmap binder");
    void *data_mapping = mmap(NULL, 0x400000UL, PROT_READ|PROT_WRITE,
    MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
    if (data_mapping == MAP_FAILED) err(1, "mmap data");
    munmap(binder_mapping, 0x800000UL);
    *(char*)data_mapping = 1;
    return 0;
    }

    Cc: stable@vger.kernel.org
    Signed-off-by: Jann Horn
    Acked-by: Todd Kjos
    Acked-by: Christian Brauner
    Link: https://lore.kernel.org/r/20191016150119.154756-1-jannh@google.com
    Signed-off-by: Greg Kroah-Hartman

    Jann Horn
     

10 Oct, 2019

1 commit

  • When a binder transaction is initiated on a binder device coming from a
    binderfs instance, a pointer to the name of the binder device is stashed
    in the binder_transaction_log_entry's context_name member. Later on it
    is used to print the name in print_binder_transaction_log_entry(). By
    the time print_binder_transaction_log_entry() accesses context_name
    binderfs_evict_inode() might have already freed the associated memory
    thereby causing a UAF. Do the simple thing and prevent this by copying
    the name of the binder device instead of stashing a pointer to it.

    Reported-by: Jann Horn
    Fixes: 03e2e07e3814 ("binder: Make transaction_log available in binderfs")
    Link: https://lore.kernel.org/r/CAG48ez14Q0-F8LqsvcNbyR2o6gPW8SHXsm4u5jmD9MpsteM2Tw@mail.gmail.com
    Signed-off-by: Christian Brauner
    Reviewed-by: Joel Fernandes (Google)
    Acked-by: Todd Kjos
    Reviewed-by: Hridya Valsaraju
    Link: https://lore.kernel.org/r/20191008130159.10161-1-christian.brauner@ubuntu.com
    Signed-off-by: Greg Kroah-Hartman

    Christian Brauner
     

04 Sep, 2019

4 commits

  • Currently /sys/kernel/debug/binder/proc contains
    the debug data for every binder_proc instance.
    This patch makes this information also available
    in a binderfs instance mounted with a mount option
    "stats=global" in addition to debugfs. The patch does
    not affect the presence of the file in debugfs.

    If a binderfs instance is mounted at path /dev/binderfs,
    this file would be present at /dev/binderfs/binder_logs/proc.
    This change provides an alternate way to access this file when debugfs
    is not mounted.

    Acked-by: Christian Brauner
    Signed-off-by: Hridya Valsaraju
    Link: https://lore.kernel.org/r/20190903161655.107408-5-hridya@google.com
    Signed-off-by: Greg Kroah-Hartman

    Hridya Valsaraju
     
  • Currently, the binder transaction log files 'transaction_log'
    and 'failed_transaction_log' live in debugfs at the following locations:

    /sys/kernel/debug/binder/failed_transaction_log
    /sys/kernel/debug/binder/transaction_log

    This patch makes these files also available in a binderfs instance
    mounted with the mount option "stats=global".
    It does not affect the presence of these files in debugfs.
    If a binderfs instance is mounted at path /dev/binderfs, the location of
    these files will be as follows:

    /dev/binderfs/binder_logs/failed_transaction_log
    /dev/binderfs/binder_logs/transaction_log

    This change provides an alternate option to access these files when
    debugfs is not mounted.

    Acked-by: Christian Brauner
    Signed-off-by: Hridya Valsaraju
    Link: https://lore.kernel.org/r/20190903161655.107408-4-hridya@google.com
    Signed-off-by: Greg Kroah-Hartman

    Hridya Valsaraju
     
  • The following binder stat files currently live in debugfs.

    /sys/kernel/debug/binder/state
    /sys/kernel/debug/binder/stats
    /sys/kernel/debug/binder/transactions

    This patch makes these files available in a binderfs instance
    mounted with the mount option 'stats=global'. For example, if a binderfs
    instance is mounted at path /dev/binderfs, the above files will be
    available at the following locations:

    /dev/binderfs/binder_logs/state
    /dev/binderfs/binder_logs/stats
    /dev/binderfs/binder_logs/transactions

    This provides a way to access them even when debugfs is not mounted.

    Acked-by: Christian Brauner
    Signed-off-by: Hridya Valsaraju
    Acked-by: Christian Brauner
    Link: https://lore.kernel.org/r/20190903161655.107408-3-hridya@google.com
    Signed-off-by: Greg Kroah-Hartman

    Hridya Valsaraju
     
  • Currently, since each binderfs instance needs its own
    private binder devices, every time a binderfs instance is
    mounted, all the default binder devices need to be created
    via the BINDER_CTL_ADD IOCTL. This patch aims to
    add a solution to automatically create the default binder
    devices for each binderfs instance that gets mounted.
    To achieve this goal, when CONFIG_ANDROID_BINDERFS is set,
    the default binder devices specified by CONFIG_ANDROID_BINDER_DEVICES
    are created in each binderfs instance instead of global devices
    being created by the binder driver.

    Co-developed-by: Christian Brauner
    Signed-off-by: Christian Brauner
    Signed-off-by: Hridya Valsaraju
    Reviewed-by: Joel Fernandes (Google)
    Link: https://lore.kernel.org/r/20190808222727.132744-2-hridya@google.com
    Link: https://lore.kernel.org/r/20190904110704.8606-2-christian.brauner@ubuntu.com
    Signed-off-by: Greg Kroah-Hartman

    Hridya Valsaraju
     

24 Jul, 2019

2 commits

  • Currently, a transaction to context manager from its own process
    is prevented by checking if its binder_proc struct is the same as
    that of the sender. However, this would not catch cases where the
    process opens the binder device again and uses the new fd to send
    a transaction to the context manager.

    Reported-by: syzbot+8b3c354d33c4ac78bfad@syzkaller.appspotmail.com
    Signed-off-by: Hridya Valsaraju
    Acked-by: Todd Kjos
    Cc: stable
    Link: https://lore.kernel.org/r/20190715191804.112933-1-hridya@google.com
    Signed-off-by: Greg Kroah-Hartman

    Hridya Valsaraju
     
  • In case the target node requests a security context, the
    extra_buffers_size is increased with the size of the security context.
    But, that size is not available for use by regular scatter-gather
    buffers; make sure the ending of that buffer is marked correctly.

    Acked-by: Todd Kjos
    Fixes: ec74136ded79 ("binder: create node flag to request sender's security context")
    Signed-off-by: Martijn Coenen
    Cc: stable@vger.kernel.org # 5.1+
    Link: https://lore.kernel.org/r/20190709110923.220736-1-maco@android.com
    Signed-off-by: Greg Kroah-Hartman

    Martijn Coenen
     

01 Jul, 2019

1 commit

  • The buffer copy functions assumed the caller would ensure
    correct alignment and that the memory to be copied was
    completely within the binder buffer. There have been
    a few cases discovered by syzkallar where a malformed
    transaction created by a user could violated the
    assumptions and resulted in a BUG_ON.

    The fix is to remove the BUG_ON and always return the
    error to be handled appropriately by the caller.

    Acked-by: Martijn Coenen
    Reported-by: syzbot+3ae18325f96190606754@syzkaller.appspotmail.com
    Fixes: bde4a19fc04f ("binder: use userspace pointer as base of buffer space")
    Suggested-by: Dan Carpenter
    Signed-off-by: Todd Kjos
    Cc: stable
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     

23 Jun, 2019

1 commit


22 Jun, 2019

1 commit

  • syzkallar found a 32-byte memory leak in a rarely executed error
    case. The transaction complete work item was not freed if put_user()
    failed when writing the BR_TRANSACTION_COMPLETE to the user command
    buffer. Fixed by freeing it before put_user() is called.

    Reported-by: syzbot+182ce46596c3f2e1eb24@syzkaller.appspotmail.com
    Signed-off-by: Todd Kjos
    Cc: stable
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     

13 Jun, 2019

1 commit

  • There is a race between the binder driver cleaning
    up a completed transaction via binder_free_transaction()
    and a user calling binder_ioctl(BC_FREE_BUFFER) to
    release a buffer. It doesn't matter which is first but
    they need to be protected against running concurrently
    which can result in a UAF.

    Signed-off-by: Todd Kjos
    Cc: stable
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     

05 Jun, 2019

1 commit

  • Based on 1 normalized pattern(s):

    this software is licensed under the terms of the gnu general public
    license version 2 as published by the free software foundation and
    may be copied distributed and modified under those terms this
    program is distributed in the hope that it will be useful but
    without any warranty without even the implied warranty of
    merchantability or fitness for a particular purpose see the gnu
    general public license for more details

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 285 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Alexios Zavras
    Reviewed-by: Allison Randal
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190529141900.642774971@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

26 Apr, 2019

1 commit

  • When allocating space in the target buffer for the security context,
    make sure the extra_buffers_size doesn't overflow. This can only
    happen if the given size is invalid, but an overflow can turn it
    into a valid size. Fail the transaction if an overflow is detected.

    Signed-off-by: Todd Kjos
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     

21 Mar, 2019

1 commit

  • The selinux-testsuite found an issue resulting in a BUG_ON()
    where a conditional relied on a size_t going negative when
    checking the validity of a buffer offset.

    Fixes: 7a67a39320df ("binder: add function to copy binder object from buffer")
    Reported-by: Paul Moore
    Tested-by: Paul Moore
    Signed-off-by: Todd Kjos
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     

15 Feb, 2019

1 commit


12 Feb, 2019

6 commits

  • Now that alloc->buffer points to the userspace vm_area
    rename buffer->data to buffer->user_data and rename
    local pointers that hold user addresses. Also use the
    "__user" tag to annotate all user pointers so sparse
    can flag cases where user pointer vaues are copied to
    kernel pointers. Refactor code to use offsets instead
    of user pointers.

    Signed-off-by: Todd Kjos
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     
  • Remove user_buffer_offset since there is no kernel
    buffer pointer anymore.

    Signed-off-by: Todd Kjos
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     
  • Refactor the functions to validate and fixup struct
    binder_buffer pointer objects to avoid using vm_area
    pointers. Instead copy to/from kernel space using
    binder_alloc_copy_to_buffer() and
    binder_alloc_copy_from_buffer(). The following
    functions were refactored:

    refactor binder_validate_ptr()
    binder_validate_fixup()
    binder_fixup_parent()

    Signed-off-by: Todd Kjos
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     
  • When creating or tearing down a transaction, the binder driver
    examines objects in the buffer and takes appropriate action.
    To do this without needing to dereference pointers into the
    buffer, the local copies of the objects are needed. This patch
    introduces a function to validate and copy binder objects
    from the buffer to a local structure.

    Signed-off-by: Todd Kjos
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     
  • Avoid vm_area when copying to or from binder buffers.
    Instead, new copy functions are added that copy from
    kernel space to binder buffer space. These use
    kmap_atomic() and kunmap_atomic() to create temporary
    mappings and then memcpy() is used to copy within
    that page.

    Also, kmap_atomic() / kunmap_atomic() use the appropriate
    cache flushing to support VIVT cache architectures.
    Allow binder to build if CPU_CACHE_VIVT is defined.

    Several uses of the new functions are added here. More
    to follow in subsequent patches.

    Signed-off-by: Todd Kjos
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     
  • The binder driver uses a vm_area to map the per-process
    binder buffer space. For 32-bit android devices, this is
    now taking too much vmalloc space. This patch removes
    the use of vm_area when copying the transaction data
    from the sender to the buffer space. Instead of using
    copy_from_user() for multi-page copies, it now uses
    binder_alloc_copy_user_to_buffer() which uses kmap()
    and kunmap() to map each page, and uses copy_from_user()
    for copying to that page.

    Signed-off-by: Todd Kjos
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     

11 Feb, 2019

1 commit


01 Feb, 2019

1 commit

  • binderfs should not have a separate device_initcall(). When a kernel is
    compiled with CONFIG_ANDROID_BINDERFS register the filesystem alongside
    CONFIG_ANDROID_IPC. This use-case is especially sensible when users specify
    CONFIG_ANDROID_IPC=y, CONFIG_ANDROID_BINDERFS=y and
    ANDROID_BINDER_DEVICES="".
    When CONFIG_ANDROID_BINDERFS=n then this always succeeds so there's no
    regression potential for legacy workloads.

    Signed-off-by: Christian Brauner
    Signed-off-by: Greg Kroah-Hartman

    Christian Brauner
     

30 Jan, 2019

1 commit

  • Several users have tried to only rely on binderfs to provide binder devices
    and set CONFIG_ANDROID_BINDER_DEVICES="" empty. This is a great use-case of
    binderfs and one that was always intended to work. However, this is
    currently not possible since setting CONFIG_ANDROID_BINDER_DEVICES="" emtpy
    will simply panic the kernel:

    kobject: (00000000028c2f79): attempted to be registered with empty name!
    WARNING: CPU: 7 PID: 1703 at lib/kobject.c:228 kobject_add_internal+0x288/0x2b0
    Modules linked in: binder_linux(+) bridge stp llc ipmi_ssif gpio_ich dcdbas coretemp kvm_intel kvm irqbypass serio_raw input_leds lpc_ich i5100_edac mac_hid ipmi_si ipmi_devintf ipmi_msghandler sch_fq_codel ib_i
    CPU: 7 PID: 1703 Comm: modprobe Not tainted 5.0.0-rc2-brauner-binderfs #263
    Hardware name: Dell DCS XS24-SC2 /XS24-SC2 , BIOS S59_3C20 04/07/2011
    RIP: 0010:kobject_add_internal+0x288/0x2b0
    Code: 12 95 48 c7 c7 78 63 3b 95 e8 77 35 71 ff e9 91 fe ff ff 0f 0b eb a7 0f 0b eb 9a 48 89 de 48 c7 c7 00 63 3b 95 e8 f8 95 6a ff 0b 41 bc ea ff ff ff e9 6d fe ff ff 41 bc fe ff ff ff e9 62 fe
    RSP: 0018:ffff973f84237a30 EFLAGS: 00010282
    RAX: 0000000000000000 RBX: ffff8b53e2472010 RCX: 0000000000000006
    RDX: 0000000000000007 RSI: 0000000000000086 RDI: ffff8b53edbd63a0
    RBP: ffff973f84237a60 R08: 0000000000000342 R09: 0000000000000004
    R10: ffff973f84237af0 R11: 0000000000000001 R12: 0000000000000000
    R13: ffff8b53e9f1a1e0 R14: 00000000e9f1a1e0 R15: 0000000000a00037
    FS: 00007fbac36f7540(0000) GS:ffff8b53edbc0000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007fbac364cfa7 CR3: 00000004a6d48000 CR4: 00000000000406e0
    Call Trace:
    kobject_add+0x71/0xd0
    ? _cond_resched+0x19/0x40
    ? mutex_lock+0x12/0x40
    device_add+0x12e/0x6b0
    device_create_groups_vargs+0xe4/0xf0
    device_create_with_groups+0x3f/0x60
    ? _cond_resched+0x19/0x40
    misc_register+0x140/0x180
    binder_init+0x1ed/0x2d4 [binder_linux]
    ? trace_event_define_fields_binder_transaction_fd_send+0x8e/0x8e [binder_linux]
    do_one_initcall+0x4a/0x1c9
    ? _cond_resched+0x19/0x40
    ? kmem_cache_alloc_trace+0x151/0x1c0
    do_init_module+0x5f/0x216
    load_module+0x223d/0x2b20
    __do_sys_finit_module+0xfc/0x120
    ? __do_sys_finit_module+0xfc/0x120
    __x64_sys_finit_module+0x1a/0x20
    do_syscall_64+0x5a/0x120
    entry_SYSCALL_64_after_hwframe+0x44/0xa9
    RIP: 0033:0x7fbac3202839
    Code: 00 f3 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d 1f f6 2c 00 f7 d8 64 89 01 48
    RSP: 002b:00007ffd1494a908 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
    RAX: ffffffffffffffda RBX: 000055b629ebec60 RCX: 00007fbac3202839
    RDX: 0000000000000000 RSI: 000055b629c20d2e RDI: 0000000000000003
    RBP: 000055b629c20d2e R08: 0000000000000000 R09: 000055b629ec2310
    R10: 0000000000000003 R11: 0000000000000246 R12: 0000000000000000
    R13: 000055b629ebed70 R14: 0000000000040000 R15: 000055b629ebec60

    So check for the empty string since strsep() will otherwise return the
    emtpy string which will cause kobject_add_internal() to panic when trying
    to add a kobject with an emtpy name.

    Fixes: ac4812c5ffbb ("binder: Support multiple /dev instances")
    Cc: Martijn Coenen
    Signed-off-by: Christian Brauner
    Acked-by: Todd Kjos
    Signed-off-by: Greg Kroah-Hartman

    Christian Brauner
     

22 Jan, 2019

1 commit

  • To allow servers to verify client identity, allow a node
    flag to be set that causes the sender's security context
    to be delivered with the transaction. The BR_TRANSACTION
    command is extended in BR_TRANSACTION_SEC_CTX to
    contain a pointer to the security context string.

    Signed-off-by: Todd Kjos
    Reviewed-by: Joel Fernandes (Google)
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     

19 Dec, 2018

2 commits

  • As discussed at Linux Plumbers Conference 2018 in Vancouver [1] this is the
    implementation of binderfs.

    /* Abstract */
    binderfs is a backwards-compatible filesystem for Android's binder ipc
    mechanism. Each ipc namespace will mount a new binderfs instance. Mounting
    binderfs multiple times at different locations in the same ipc namespace
    will not cause a new super block to be allocated and hence it will be the
    same filesystem instance.
    Each new binderfs mount will have its own set of binder devices only
    visible in the ipc namespace it has been mounted in. All devices in a new
    binderfs mount will follow the scheme binder%d and numbering will always
    start at 0.

    /* Backwards compatibility */
    Devices requested in the Kconfig via CONFIG_ANDROID_BINDER_DEVICES for the
    initial ipc namespace will work as before. They will be registered via
    misc_register() and appear in the devtmpfs mount. Specifically, the
    standard devices binder, hwbinder, and vndbinder will all appear in their
    standard locations in /dev. Mounting or unmounting the binderfs mount in
    the initial ipc namespace will have no effect on these devices, i.e. they
    will neither show up in the binderfs mount nor will they disappear when the
    binderfs mount is gone.

    /* binder-control */
    Each new binderfs instance comes with a binder-control device. No other
    devices will be present at first. The binder-control device can be used to
    dynamically allocate binder devices. All requests operate on the binderfs
    mount the binder-control device resides in.
    Assuming a new instance of binderfs has been mounted at /dev/binderfs
    via mount -t binderfs binderfs /dev/binderfs. Then a request to create a
    new binder device can be made as illustrated in [2].
    Binderfs devices can simply be removed via unlink().

    /* Implementation details */
    - dynamic major number allocation:
    When binderfs is registered as a new filesystem it will dynamically
    allocate a new major number. The allocated major number will be returned
    in struct binderfs_device when a new binder device is allocated.
    - global minor number tracking:
    Minor are tracked in a global idr struct that is capped at
    BINDERFS_MAX_MINOR. The minor number tracker is protected by a global
    mutex. This is the only point of contention between binderfs mounts.
    - struct binderfs_info:
    Each binderfs super block has its own struct binderfs_info that tracks
    specific details about a binderfs instance:
    - ipc namespace
    - dentry of the binder-control device
    - root uid and root gid of the user namespace the binderfs instance
    was mounted in
    - mountable by user namespace root:
    binderfs can be mounted by user namespace root in a non-initial user
    namespace. The devices will be owned by user namespace root.
    - binderfs binder devices without misc infrastructure:
    New binder devices associated with a binderfs mount do not use the
    full misc_register() infrastructure.
    The misc_register() infrastructure can only create new devices in the
    host's devtmpfs mount. binderfs does however only make devices appear
    under its own mountpoint and thus allocates new character device nodes
    from the inode of the root dentry of the super block. This will have
    the side-effect that binderfs specific device nodes do not appear in
    sysfs. This behavior is similar to devpts allocated pts devices and
    has no effect on the functionality of the ipc mechanism itself.

    [1]: https://goo.gl/JL2tfX
    [2]: program to allocate a new binderfs binder device:

    #define _GNU_SOURCE
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    int main(int argc, char *argv[])
    {
    int fd, ret, saved_errno;
    size_t len;
    struct binderfs_device device = { 0 };

    if (argc < 2)
    exit(EXIT_FAILURE);

    len = strlen(argv[1]);
    if (len > BINDERFS_MAX_NAME)
    exit(EXIT_FAILURE);

    memcpy(device.name, argv[1], len);

    fd = open("/dev/binderfs/binder-control", O_RDONLY | O_CLOEXEC);
    if (fd < 0) {
    printf("%s - Failed to open binder-control device\n",
    strerror(errno));
    exit(EXIT_FAILURE);
    }

    ret = ioctl(fd, BINDER_CTL_ADD, &device);
    saved_errno = errno;
    close(fd);
    errno = saved_errno;
    if (ret < 0) {
    printf("%s - Failed to allocate new binder device\n",
    strerror(errno));
    exit(EXIT_FAILURE);
    }

    printf("Allocated new binder device with major %d, minor %d, and "
    "name %s\n", device.major, device.minor,
    device.name);

    exit(EXIT_SUCCESS);
    }

    Cc: Martijn Coenen
    Cc: Greg Kroah-Hartman
    Signed-off-by: Christian Brauner
    Acked-by: Todd Kjos
    Signed-off-by: Greg Kroah-Hartman

    Christian Brauner
     
  • 44d8047f1d8 ("binder: use standard functions to allocate fds")
    exposed a pre-existing issue in the binder driver.

    fdget() is used in ksys_ioctl() as a performance optimization.
    One of the rules associated with fdget() is that ksys_close() must
    not be called between the fdget() and the fdput(). There is a case
    where this requirement is not met in the binder driver which results
    in the reference count dropping to 0 when the device is still in
    use. This can result in use-after-free or other issues.

    If userpace has passed a file-descriptor for the binder driver using
    a BINDER_TYPE_FDA object, then kys_close() is called on it when
    handling a binder_ioctl(BC_FREE_BUFFER) command. This violates
    the assumptions for using fdget().

    The problem is fixed by deferring the close using task_work_add(). A
    new variant of __close_fd() was created that returns a struct file
    with a reference. The fput() is deferred instead of using ksys_close().

    Fixes: 44d8047f1d87a ("binder: use standard functions to allocate fds")
    Suggested-by: Al Viro
    Signed-off-by: Todd Kjos
    Cc: stable
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     

06 Dec, 2018

2 commits


03 Dec, 2018

1 commit


27 Nov, 2018

2 commits

  • Add __acquire()/__release() annnotations to fix warnings
    in sparse context checking

    There is one case where the warning was due to a lack of
    a "default:" case in a switch statement where a lock was
    being released in each of the cases, so the default
    case was added.

    Signed-off-by: Todd Kjos
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     
  • Malicious code can attempt to free buffers using the BC_FREE_BUFFER
    ioctl to binder. There are protections against a user freeing a buffer
    while in use by the kernel, however there was a window where
    BC_FREE_BUFFER could be used to free a recently allocated buffer that
    was not completely initialized. This resulted in a use-after-free
    detected by KASAN with a malicious test program.

    This window is closed by setting the buffer's allow_user_free attribute
    to 0 when the buffer is allocated or when the user has previously freed
    it instead of waiting for the caller to set it. The problem was that
    when the struct buffer was recycled, allow_user_free was stale and set
    to 1 allowing a free to go through.

    Signed-off-by: Todd Kjos
    Acked-by: Arve Hjønnevåg
    Cc: stable # 4.14
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     

03 Oct, 2018

1 commit


14 Sep, 2018

4 commits

  • This allows the context manager to retrieve information about nodes
    that it holds a reference to, such as the current number of
    references to those nodes.

    Such information can for example be used to determine whether the
    servicemanager is the only process holding a reference to a node.
    This information can then be passed on to the process holding the
    node, which can in turn decide whether it wants to shut down to
    reduce resource usage.

    Signed-off-by: Martijn Coenen
    Signed-off-by: Greg Kroah-Hartman

    Martijn Coenen
     
  • Signed-off-by: Rasmus Villemoes
    Signed-off-by: Greg Kroah-Hartman

    Rasmus Villemoes
     
  • Binder uses internal fs interfaces to allocate and install fds:

    __alloc_fd
    __fd_install
    __close_fd
    get_files_struct
    put_files_struct

    These were used to support the passing of fds between processes
    as part of a transaction. The actual allocation and installation
    of the fds in the target process was handled by the sending
    process so the standard functions, alloc_fd() and fd_install()
    which assume task==current couldn't be used.

    This patch refactors this mechanism so that the fds are
    allocated and installed by the target process allowing the
    standard functions to be used.

    The sender now creates a list of fd fixups that contains the
    struct *file and the address to fixup with the new fd once
    it is allocated. This list is processed by the target process
    when the transaction is dequeued.

    A new error case is introduced by this change. If an async
    transaction with file descriptors cannot allocate new
    fds in the target (probably due to out of file descriptors),
    the transaction is discarded with a log message. In the old
    implementation this would have been detected in the sender
    context and failed prior to sending.

    Signed-off-by: Todd Kjos
    Signed-off-by: Greg Kroah-Hartman

    Todd Kjos
     
  • When a process dies, failed reply is sent to the sender of any transaction
    queued on a dead thread's todo list. The sender asserts that the
    received failed reply corresponds to the head of the transaction stack.
    This assert can fail if the dead thread is allowed to send outgoing
    transactions when there is already a transaction on its todo list,
    because this new transaction can end up on the transaction stack of the
    original sender. The following steps illustrate how this assertion can
    fail.

    1. Thread1 sends txn19 to Thread2
    (T1->transaction_stack=txn19, T2->todo+=txn19)
    2. Without processing todo list, Thread2 sends txn20 to Thread1
    (T1->todo+=txn20, T2->transaction_stack=txn20)
    3. T1 processes txn20 on its todo list
    (T1->transaction_stack=txn20->txn19, T1->todo=)
    4. T2 dies, T2->todo cleanup attempts to send failed reply for txn19, but
    T1->transaction_stack points to txn20 -- assertion failes

    Step 2. is the incorrect behavior. When there is a transaction on a
    thread's todo list, this thread should not be able to send any outgoing
    synchronous transactions. Only the head of the todo list needs to be
    checked because only threads that are waiting for proc work can directly
    receive work from another thread, and no work is allowed to be queued
    on such a thread without waking up the thread. This patch also enforces
    that a thread is not waiting for proc work when a work is directly
    enqueued to its todo list.

    Acked-by: Arve Hjønnevåg
    Signed-off-by: Sherry Yang
    Reviewed-by: Martijn Coenen
    Signed-off-by: Greg Kroah-Hartman

    Sherry Yang