15 Nov, 2013

1 commit

  • Pull module updates from Rusty Russell:
    "Mainly boring here, too. rmmod --wait finally removed, though"

    * tag 'modules-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux:
    modpost: fix bogus 'exported twice' warnings.
    init: fix in-place parameter modification regression
    asmlinkage, module: Make ksymtab and kcrctab symbols and __this_module __visible
    kernel: add support for init_array constructors
    modpost: Optionally ignore secondary errors seen if a single module build fails
    module: remove rmmod --wait option.

    Linus Torvalds
     

13 Nov, 2013

1 commit

  • kernel/module.c uses a mix of printk(KERN_foo and pr_foo(). Convert it
    all to pr_foo and make the offered cleanups.

    Not sure what to do about the printk(KERN_DEFAULT). We don't have a
    pr_default().

    Cc: Rusty Russell
    Cc: Joe Perches
    Cc: Frantisek Hrbata
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andrew Morton
     

17 Oct, 2013

1 commit

  • This adds the .init_array section as yet another section with constructors. This
    is needed because gcc could add __gcov_init calls to .init_array or .ctors
    section, depending on gcc (and binutils) version .

    v2: - reuse mod->ctors for .init_array section for modules, because gcc uses
    .ctors or .init_array, but not both at the same time
    v3: - fail to load if that does happen somehow.

    Signed-off-by: Frantisek Hrbata
    Signed-off-by: Rusty Russell

    Frantisek Hrbata
     

23 Sep, 2013

1 commit

  • The option to wait for a module reference count to reach zero was in
    the initial module implementation, but it was never supported in
    modprobe (you had to use rmmod --wait). After discussion with Lucas,
    It has been deprecated (with a 10 second sleep) in kmod for the last
    year.

    This finally removes it: the flag will evoke a printk warning and a
    normal (non-blocking) remove attempt.

    Cc: Lucas De Marchi
    Signed-off-by: Rusty Russell

    Rusty Russell
     

05 Sep, 2013

1 commit

  • Pull vfs pile 1 from Al Viro:
    "Unfortunately, this merge window it'll have a be a lot of small piles -
    my fault, actually, for not keeping #for-next in anything that would
    resemble a sane shape ;-/

    This pile: assorted fixes (the first 3 are -stable fodder, IMO) and
    cleanups + %pd/%pD formats (dentry/file pathname, up to 4 last
    components) + several long-standing patches from various folks.

    There definitely will be a lot more (starting with Miklos'
    check_submount_and_drop() series)"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (26 commits)
    direct-io: Handle O_(D)SYNC AIO
    direct-io: Implement generic deferred AIO completions
    add formats for dentry/file pathnames
    kvm eventfd: switch to fdget
    powerpc kvm: use fdget
    switch fchmod() to fdget
    switch epoll_ctl() to fdget
    switch copy_module_from_fd() to fdget
    git simplify nilfs check for busy subtree
    ibmasmfs: don't bother passing superblock when not needed
    don't pass superblock to hypfs_{mkdir,create*}
    don't pass superblock to hypfs_diag_create_files
    don't pass superblock to hypfs_vm_create_files()
    oprofile: get rid of pointless forward declarations of struct super_block
    oprofilefs_create_...() do not need superblock argument
    oprofilefs_mkdir() doesn't need superblock argument
    don't bother with passing superblock to oprofile_create_stats_files()
    oprofile: don't bother with passing superblock to ->create_files()
    don't bother passing sb to oprofile_create_files()
    coh901318: don't open-code simple_read_from_buffer()
    ...

    Linus Torvalds
     

04 Sep, 2013

1 commit


03 Sep, 2013

1 commit

  • DEBUG_KOBJECT_RELEASE helps to find the issue attached below.

    After some investigation, it seems the reason is:
    The mod->mkobj.kobj(ffffffffa01600d0 below) is freed together with mod
    itself in free_module(). However, its children still hold references to
    it, as the delay caused by DEBUG_KOBJECT_RELEASE. So when the
    child(holders below) tries to decrease the reference count to its parent
    in kobject_del(), BUG happens as it tries to access already freed memory.

    This patch tries to fix it by waiting for the mod->mkobj.kobj to be
    really released in the module removing process (and some error code
    paths).

    [ 1844.175287] kobject: 'holders' (ffff88007c1f1600): kobject_release, parent ffffffffa01600d0 (delayed)
    [ 1844.178991] kobject: 'notes' (ffff8800370b2a00): kobject_release, parent ffffffffa01600d0 (delayed)
    [ 1845.180118] kobject: 'holders' (ffff88007c1f1600): kobject_cleanup, parent ffffffffa01600d0
    [ 1845.182130] kobject: 'holders' (ffff88007c1f1600): auto cleanup kobject_del
    [ 1845.184120] BUG: unable to handle kernel paging request at ffffffffa01601d0
    [ 1845.185026] IP: [] kobject_put+0x11/0x60
    [ 1845.185026] PGD 1a13067 PUD 1a14063 PMD 7bd30067 PTE 0
    [ 1845.185026] Oops: 0000 [#1] PREEMPT
    [ 1845.185026] Modules linked in: xfs libcrc32c [last unloaded: kprobe_example]
    [ 1845.185026] CPU: 0 PID: 18 Comm: kworker/0:1 Tainted: G O 3.11.0-rc6-next-20130819+ #1
    [ 1845.185026] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2007
    [ 1845.185026] Workqueue: events kobject_delayed_cleanup
    [ 1845.185026] task: ffff88007ca51f00 ti: ffff88007ca5c000 task.ti: ffff88007ca5c000
    [ 1845.185026] RIP: 0010:[] [] kobject_put+0x11/0x60
    [ 1845.185026] RSP: 0018:ffff88007ca5dd08 EFLAGS: 00010282
    [ 1845.185026] RAX: 0000000000002000 RBX: ffffffffa01600d0 RCX: ffffffff8177d638
    [ 1845.185026] RDX: ffff88007ca5dc18 RSI: 0000000000000000 RDI: ffffffffa01600d0
    [ 1845.185026] RBP: ffff88007ca5dd18 R08: ffffffff824e9810 R09: ffffffffffffffff
    [ 1845.185026] R10: ffff8800ffffffff R11: dead4ead00000001 R12: ffffffff81a95040
    [ 1845.185026] R13: ffff88007b27a960 R14: ffff88007c1f1600 R15: 0000000000000000
    [ 1845.185026] FS: 0000000000000000(0000) GS:ffffffff81a23000(0000) knlGS:0000000000000000
    [ 1845.185026] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    [ 1845.185026] CR2: ffffffffa01601d0 CR3: 0000000037207000 CR4: 00000000000006b0
    [ 1845.185026] Stack:
    [ 1845.185026] ffff88007c1f1600 ffff88007c1f1600 ffff88007ca5dd38 ffffffff812cdb7e
    [ 1845.185026] 0000000000000000 ffff88007c1f1640 ffff88007ca5dd68 ffffffff812cdbfe
    [ 1845.185026] ffff88007c974800 ffff88007c1f1640 ffff88007ff61a00 0000000000000000
    [ 1845.185026] Call Trace:
    [ 1845.185026] [] kobject_del+0x2e/0x40
    [ 1845.185026] [] kobject_delayed_cleanup+0x6e/0x1d0
    [ 1845.185026] [] process_one_work+0x1e5/0x670
    [ 1845.185026] [] ? process_one_work+0x183/0x670
    [ 1845.185026] [] worker_thread+0x113/0x370
    [ 1845.185026] [] ? rescuer_thread+0x290/0x290
    [ 1845.185026] [] kthread+0xda/0xe0
    [ 1845.185026] [] ? _raw_spin_unlock_irq+0x30/0x60
    [ 1845.185026] [] ? kthread_create_on_node+0x130/0x130
    [ 1845.185026] [] ret_from_fork+0x7a/0xb0
    [ 1845.185026] [] ? kthread_create_on_node+0x130/0x130
    [ 1845.185026] Code: 81 48 c7 c7 28 95 ad 81 31 c0 e8 9b da 01 00 e9 4f ff ff ff 66 0f 1f 44 00 00 55 48 89 e5 53 48 89 fb 48 83 ec 08 48 85 ff 74 1d 87 00 01 00 00 01 74 1e 48 8d 7b 38 83 6b 38 01 0f 94 c0 84
    [ 1845.185026] RIP [] kobject_put+0x11/0x60
    [ 1845.185026] RSP
    [ 1845.185026] CR2: ffffffffa01601d0
    [ 1845.185026] ---[ end trace 49a70afd109f5653 ]---

    Signed-off-by: Li Zhong
    Acked-by: Greg Kroah-Hartman
    Signed-off-by: Rusty Russell

    Li Zhong
     

20 Aug, 2013

2 commits


11 Jul, 2013

1 commit

  • Pull module updates from Rusty Russell:
    "Nothing interesting. Except the most embarrassing bugfix ever. But
    let's ignore that"

    * tag 'modules-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux:
    module: cleanup call chain.
    module: do percpu allocation after uniqueness check. No, really!
    modules: don't fail to load on unknown parameters.
    ABI: Clarify when /sys/module/MODULENAME is created
    There is no /sys/parameters
    module: don't modify argument of module_kallsyms_lookup_name()

    Linus Torvalds
     

03 Jul, 2013

2 commits


02 Jul, 2013

2 commits

  • Although parameters are supposed to be part of the kernel API, experimental
    parameters are often removed. In addition, downgrading a kernel might cause
    previously-working modules to fail to load.

    On balance, it's probably better to warn, and load the module anyway.
    This may let through a typo, but at least the logs will show it.

    Reported-by: Andy Lutomirski
    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • If we pass a pointer to a const string in the form "module:symbol"
    module_kallsyms_lookup_name() will try to split the string at the colon,
    i.e., will try to modify r/o data. That will, in fact, fail on a kernel
    with enabled CONFIG_DEBUG_RODATA.

    Avoid modifying the passed string in module_kallsyms_lookup_name(),
    modify find_module_all() instead to pass it the module name length.

    Signed-off-by: Mathias Krause
    Signed-off-by: Rusty Russell

    Mathias Krause
     

17 May, 2013

2 commits


17 Apr, 2013

1 commit

  • Otherwise we get a race between unload and reload of the same module:
    the new module doesn't see the old one in the list, but then fails because
    it can't register over the still-extant entries in sysfs:

    [ 103.981925] ------------[ cut here ]------------
    [ 103.986902] WARNING: at fs/sysfs/dir.c:536 sysfs_add_one+0xab/0xd0()
    [ 103.993606] Hardware name: CrownBay Platform
    [ 103.998075] sysfs: cannot create duplicate filename '/module/pch_gbe'
    [ 104.004784] Modules linked in: pch_gbe(+) [last unloaded: pch_gbe]
    [ 104.011362] Pid: 3021, comm: modprobe Tainted: G W 3.9.0-rc5+ #5
    [ 104.018662] Call Trace:
    [ 104.021286] [] warn_slowpath_common+0x6d/0xa0
    [ 104.026933] [] ? sysfs_add_one+0xab/0xd0
    [ 104.031986] [] ? sysfs_add_one+0xab/0xd0
    [ 104.037000] [] warn_slowpath_fmt+0x2e/0x30
    [ 104.042188] [] sysfs_add_one+0xab/0xd0
    [ 104.046982] [] create_dir+0x5e/0xa0
    [ 104.051633] [] sysfs_create_dir+0x78/0xd0
    [ 104.056774] [] kobject_add_internal+0x83/0x1f0
    [ 104.062351] [] ? kvasprintf+0x46/0x60
    [ 104.067231] [] kobject_add_varg+0x2d/0x50
    [ 104.072450] [] kobject_init_and_add+0x27/0x30
    [ 104.078075] [] mod_sysfs_setup+0x80/0x540
    [ 104.083207] [] ? module_bug_finalize+0x51/0xc0
    [ 104.088720] [] load_module+0x1429/0x18b0

    We can teardown sysfs first, then to be sure, put the state in
    MODULE_STATE_UNFORMED so it's ignored while we deconstruct it.

    Reported-by: Veaceslav Falico
    Tested-by: Veaceslav Falico
    Signed-off-by: Rusty Russell

    Rusty Russell
     

20 Mar, 2013

1 commit

  • Fix symbol versioning on architectures with symbol prefixes. Although
    the build was free from warnings the actual modules still wouldn't load
    as the ____versions table contained unprefixed symbol names, which were
    being compared against the prefixed symbol names when checking the
    symbol versions.

    This is fixed by modifying modpost to add the symbol prefix to the
    ____versions table it outputs (Modules.symvers still contains unprefixed
    symbol names). The check_modstruct_version() function is also fixed as
    it checks the version of the unprefixed "module_layout" symbol which
    would no longer work.

    Signed-off-by: James Hogan
    Cc: Michal Marek
    Cc: Sam Ravnborg
    Cc: Greg Kroah-Hartman
    Cc: Jonathan Kliegman
    Signed-off-by: Rusty Russell (use VMLINUX_SYMBOL_STR)

    James Hogan
     

15 Mar, 2013

1 commit

  • We have CONFIG_SYMBOL_PREFIX, which three archs define to the string
    "_". But Al Viro broke this in "consolidate cond_syscall and
    SYSCALL_ALIAS declarations" (in linux-next), and he's not the first to
    do so.

    Using CONFIG_SYMBOL_PREFIX is awkward, since we usually just want to
    prefix it so something. So various places define helpers which are
    defined to nothing if CONFIG_SYMBOL_PREFIX isn't set:

    1) include/asm-generic/unistd.h defines __SYMBOL_PREFIX.
    2) include/asm-generic/vmlinux.lds.h defines VMLINUX_SYMBOL(sym)
    3) include/linux/export.h defines MODULE_SYMBOL_PREFIX.
    4) include/linux/kernel.h defines SYMBOL_PREFIX (which differs from #7)
    5) kernel/modsign_certificate.S defines ASM_SYMBOL(sym)
    6) scripts/modpost.c defines MODULE_SYMBOL_PREFIX
    7) scripts/Makefile.lib defines SYMBOL_PREFIX on the commandline if
    CONFIG_SYMBOL_PREFIX is set, so that we have a non-string version
    for pasting.

    (arch/h8300/include/asm/linkage.h defines SYMBOL_NAME(), too).

    Let's solve this properly:
    1) No more generic prefix, just CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX.
    2) Make linux/export.h usable from asm.
    3) Define VMLINUX_SYMBOL() and VMLINUX_SYMBOL_STR().
    4) Make everyone use them.

    Signed-off-by: Rusty Russell
    Reviewed-by: James Hogan
    Tested-by: James Hogan (metag)

    Rusty Russell
     

27 Feb, 2013

1 commit

  • Pull vfs pile (part one) from Al Viro:
    "Assorted stuff - cleaning namei.c up a bit, fixing ->d_name/->d_parent
    locking violations, etc.

    The most visible changes here are death of FS_REVAL_DOT (replaced with
    "has ->d_weak_revalidate()") and a new helper getting from struct file
    to inode. Some bits of preparation to xattr method interface changes.

    Misc patches by various people sent this cycle *and* ocfs2 fixes from
    several cycles ago that should've been upstream right then.

    PS: the next vfs pile will be xattr stuff."

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (46 commits)
    saner proc_get_inode() calling conventions
    proc: avoid extra pde_put() in proc_fill_super()
    fs: change return values from -EACCES to -EPERM
    fs/exec.c: make bprm_mm_init() static
    ocfs2/dlm: use GFP_ATOMIC inside a spin_lock
    ocfs2: fix possible use-after-free with AIO
    ocfs2: Fix oops in ocfs2_fast_symlink_readpage() code path
    get_empty_filp()/alloc_file() leave both ->f_pos and ->f_version zero
    target: writev() on single-element vector is pointless
    export kernel_write(), convert open-coded instances
    fs: encode_fh: return FILEID_INVALID if invalid fid_type
    kill f_vfsmnt
    vfs: kill FS_REVAL_DOT by adding a d_weak_revalidate dentry op
    nfsd: handle vfs_getattr errors in acl protocol
    switch vfs_getattr() to struct path
    default SET_PERSONALITY() in linux/elf.h
    ceph: prepopulate inodes only when request is aborted
    d_hash_and_lookup(): export, switch open-coded instances
    9p: switch v9fs_set_create_acl() to inode+fid, do it before d_instantiate()
    9p: split dropping the acls from v9fs_set_create_acl()
    ...

    Linus Torvalds
     

26 Feb, 2013

1 commit


21 Jan, 2013

5 commits


17 Jan, 2013

1 commit

  • If the default iosched is built as module, the kernel may deadlock
    while trying to load the iosched module on device probe if the probing
    was running off async. This is because async_synchronize_full() at
    the end of module init ends up waiting for the async job which
    initiated the module loading.

    async A modprobe

    1. finds a device
    2. registers the block device
    3. request_module(default iosched)
    4. modprobe in userland
    5. load and init module
    6. async_synchronize_full()

    Async A waits for modprobe to finish in request_module() and modprobe
    waits for async A to finish in async_synchronize_full().

    Because there's no easy to track dependency once control goes out to
    userland, implementing properly nested flushing is difficult. For
    now, make module init perform async_synchronize_full() iff module init
    has queued async jobs as suggested by Linus.

    This avoids the described deadlock because iosched module doesn't use
    async and thus wouldn't invoke async_synchronize_full(). This is
    hacky and incomplete. It will deadlock if async module loading nests;
    however, this works around the known problem case and seems to be the
    best of bad options.

    For more details, please refer to the following thread.

    http://thread.gmane.org/gmane.linux.kernel/1420814

    Signed-off-by: Tejun Heo
    Reported-by: Alex Riesen
    Tested-by: Ming Lei
    Tested-by: Alex Riesen
    Cc: Arjan van de Ven
    Cc: Jens Axboe
    Signed-off-by: Linus Torvalds

    Tejun Heo
     

12 Jan, 2013

2 commits

  • Prarit's excellent bug report:
    > In recent Fedora releases (F17 & F18) some users have reported seeing
    > messages similar to
    >
    > [ 15.478160] kvm: Could not allocate 304 bytes percpu data
    > [ 15.478174] PERCPU: allocation failed, size=304 align=32, alloc from
    > reserved chunk failed
    >
    > during system boot. In some cases, users have also reported seeing this
    > message along with a failed load of other modules.
    >
    > What is happening is systemd is loading an instance of the kvm module for
    > each cpu found (see commit e9bda3b). When the module load occurs the kernel
    > currently allocates the modules percpu data area prior to checking to see
    > if the module is already loaded or is in the process of being loaded. If
    > the module is already loaded, or finishes load, the module loading code
    > releases the current instance's module's percpu data.

    Now we have a new state MODULE_STATE_UNFORMED, we can insert the
    module into the list (and thus guarantee its uniqueness) before we
    allocate the per-cpu region.

    Reported-by: Prarit Bhargava
    Signed-off-by: Rusty Russell
    Tested-by: Prarit Bhargava

    Rusty Russell
     
  • You should never look at such a module, so it's excised from all paths
    which traverse the modules list.

    We add the state at the end, to avoid gratuitous ABI break (ksplice).

    Signed-off-by: Rusty Russell

    Rusty Russell
     

03 Jan, 2013

1 commit


19 Dec, 2012

1 commit

  • Pull module update from Rusty Russell:
    "Nothing all that exciting; a new module-from-fd syscall for those who
    want to verify the source of the module (ChromeOS) and/or use standard
    IMA on it or other security hooks."

    * tag 'modules-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux:
    MODSIGN: Fix kbuild output when using default extra_certificates
    MODSIGN: Avoid using .incbin in C source
    modules: don't hand 0 to vmalloc.
    module: Remove a extra null character at the top of module->strtab.
    ASN.1: Use the ASN1_LONG_TAG and ASN1_INDEFINITE_LENGTH constants
    ASN.1: Define indefinite length marker constant
    moduleparam: use __UNIQUE_ID()
    __UNIQUE_ID()
    MODSIGN: Add modules_sign make target
    powerpc: add finit_module syscall.
    ima: support new kernel module syscall
    add finit_module syscall to asm-generic
    ARM: add finit_module syscall to ARM
    security: introduce kernel_module_from_file hook
    module: add flags arg to sys_finit_module()
    module: add syscall to load module from fd

    Linus Torvalds
     

18 Dec, 2012

1 commit


14 Dec, 2012

5 commits

  • In commit d0a21265dfb5fa8a David Rientjes unified various archs'
    module_alloc implementation (including x86) and removed the graduitous
    shortcut for size == 0.

    Then, in commit de7d2b567d040e3b, Joe Perches added a warning for
    zero-length vmallocs, which can happen without kallsyms on modules
    with no init sections (eg. zlib_deflate).

    Fix this once and for all; the module code has to handle zero length
    anyway, so get it right at the caller and remove the now-gratuitous
    checks within the arch-specific module_alloc implementations.

    Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=42608
    Reported-by: Conrad Kostecki
    Cc: David Rientjes
    Cc: Joe Perches
    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • There is a extra null character('\0') at the top of module->strtab for
    each module. Commit 59ef28b introduced this bug and this patch fixes it.

    Live dump log of the current linus git kernel(HEAD is 2844a4870):
    ============================================================================
    crash> mod | grep loop
    ffffffffa01db0a0 loop 16689 (not loaded) [CONFIG_KALLSYMS]
    crash> module.core_symtab ffffffffa01db0a0
    core_symtab = 0xffffffffa01db320crash> rd 0xffffffffa01db320 12
    ffffffffa01db320: 0000005500000001 0000000000000000 ....U...........
    ffffffffa01db330: 0000000000000000 0002007400000002 ............t...
    ffffffffa01db340: ffffffffa01d8000 0000000000000038 ........8.......
    ffffffffa01db350: 001a00640000000e ffffffffa01daeb0 ....d...........
    ffffffffa01db360: 00000000000000a0 0002007400000019 ............t...
    ffffffffa01db370: ffffffffa01d8068 000000000000001b h...............
    crash> module.core_strtab ffffffffa01db0a0
    core_strtab = 0xffffffffa01dbb30 ""
    crash> rd 0xffffffffa01dbb30 4
    ffffffffa01dbb30: 615f70616d6b0000 66780063696d6f74 ..kmap_atomic.xf
    ffffffffa01dbb40: 73636e75665f7265 72665f646e696600 er_funcs.find_fr
    ============================================================================

    We expect Just first one byte of '\0', but actually first two bytes
    are '\0'. Here is The relationship between symtab and strtab.

    symtab_idx strtab_idx symbol
    -----------------------------------------------
    0 0x1 "\0" # startab_idx should be 0
    1 0x2 "kmap_atomic"
    2 0xe "xfer_funcs"
    3 0x19 "find_fr..."

    By applying this patch, it becomes as follows.

    symtab_idx strtab_idx symbol
    -----------------------------------------------
    0 0x0 "\0" # extra byte is removed
    1 0x1 "kmap_atomic"
    2 0xd "xfer_funcs"
    3 0x18 "find_fr..."

    Signed-off-by: Satoru Takeuchi
    Cc: Masaki Kimura
    Cc: Rusty Russell
    Cc: Greg Kroah-Hartman
    Signed-off-by: Rusty Russell

    Satoru Takeuchi
     
  • Now that kernel module origins can be reasoned about, provide a hook to
    the LSMs to make policy decisions about the module file. This will let
    Chrome OS enforce that loadable kernel modules can only come from its
    read-only hash-verified root filesystem. Other LSMs can, for example,
    read extended attributes for signatures, etc.

    Signed-off-by: Kees Cook
    Acked-by: Serge E. Hallyn
    Acked-by: Eric Paris
    Acked-by: Mimi Zohar
    Acked-by: James Morris
    Signed-off-by: Rusty Russell

    Kees Cook
     
  • Thanks to Michael Kerrisk for keeping us honest. These flags are actually
    useful for eliminating the only case where kmod has to mangle a module's
    internals: for overriding module versioning.

    Signed-off-by: Rusty Russell
    Acked-by: Lucas De Marchi
    Acked-by: Kees Cook

    Rusty Russell
     
  • As part of the effort to create a stronger boundary between root and
    kernel, Chrome OS wants to be able to enforce that kernel modules are
    being loaded only from our read-only crypto-hash verified (dm_verity)
    root filesystem. Since the init_module syscall hands the kernel a module
    as a memory blob, no reasoning about the origin of the blob can be made.

    Earlier proposals for appending signatures to kernel modules would not be
    useful in Chrome OS, since it would involve adding an additional set of
    keys to our kernel and builds for no good reason: we already trust the
    contents of our root filesystem. We don't need to verify those kernel
    modules a second time. Having to do signature checking on module loading
    would slow us down and be redundant. All we need to know is where a
    module is coming from so we can say yes/no to loading it.

    If a file descriptor is used as the source of a kernel module, many more
    things can be reasoned about. In Chrome OS's case, we could enforce that
    the module lives on the filesystem we expect it to live on. In the case
    of IMA (or other LSMs), it would be possible, for example, to examine
    extended attributes that may contain signatures over the contents of
    the module.

    This introduces a new syscall (on x86), similar to init_module, that has
    only two arguments. The first argument is used as a file descriptor to
    the module and the second argument is a pointer to the NULL terminated
    string of module arguments.

    Signed-off-by: Kees Cook
    Cc: Andrew Morton
    Signed-off-by: Rusty Russell (merge fixes)

    Kees Cook
     

31 Oct, 2012

1 commit

  • Masaki found and patched a kallsyms issue: the last symbol in a
    module's symtab wasn't transferred. This is because we manually copy
    the zero'th entry (which is always empty) then copy the rest in a loop
    starting at 1, though from src[0]. His fix was minimal, I prefer to
    rewrite the loops in more standard form.

    There are two loops: one to get the size, and one to copy. Make these
    identical: always count entry 0 and any defined symbol in an allocated
    non-init section.

    This bug exists since the following commit was introduced.
    module: reduce symbol table for loaded modules (v2)
    commit: 4a4962263f07d14660849ec134ee42b63e95ea9a

    LKML: http://lkml.org/lkml/2012/10/24/27
    Reported-by: Masaki Kimura
    Cc: stable@kernel.org

    Rusty Russell
     

20 Oct, 2012

1 commit

  • Emit the magic string that indicates a module has a signature after the
    signature data instead of before it. This allows module_sig_check() to
    be made simpler and faster by the elimination of the search for the
    magic string. Instead we just need to do a single memcmp().

    This works because at the end of the signature data there is the
    fixed-length signature information block. This block then falls
    immediately prior to the magic number.

    From the contents of the information block, it is trivial to calculate
    the size of the signature data and thus the size of the actual module
    data.

    Signed-off-by: David Howells
    Signed-off-by: Linus Torvalds

    David Howells
     

10 Oct, 2012

1 commit

  • If we're in FIPS mode, we should panic if we fail to verify the signature on a
    module or we're asked to load an unsigned module in signature enforcing mode.
    Possibly FIPS mode should automatically enable enforcing mode.

    Signed-off-by: David Howells
    Signed-off-by: Rusty Russell

    David Howells