03 Jan, 2018

1 commit

  • commit 9f5cb6b32d9e0a3a7453222baaf15664d92adbf2 upstream.

    Now that the LDT mapping is in a known area when PAGE_TABLE_ISOLATION is
    enabled its a primary target for attacks, if a user space interface fails
    to validate a write address correctly. That can never happen, right?

    The SDM states:

    If the segment descriptors in the GDT or an LDT are placed in ROM, the
    processor can enter an indefinite loop if software or the processor
    attempts to update (write to) the ROM-based segment descriptors. To
    prevent this problem, set the accessed bits for all segment descriptors
    placed in a ROM. Also, remove operating-system or executive code that
    attempts to modify segment descriptors located in ROM.

    So its a valid approach to set the ACCESS bit when setting up the LDT entry
    and to map the table RO. Fixup the selftest so it can handle that new mode.

    Remove the manual ACCESS bit setter in set_tls_desc() as this is now
    pointless. Folded the patch from Peter Ziljstra.

    Signed-off-by: Thomas Gleixner
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Dave Hansen
    Cc: H. Peter Anvin
    Cc: Josh Poimboeuf
    Cc: Juergen Gross
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

29 Aug, 2017

1 commit

  • The union inside of desc_struct which allows access to the raw u32 parts of
    the descriptors. This raw access part is about to go away.

    Replace the few code parts which access those fields.

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Boris Ostrovsky
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Brian Gerst
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Josh Poimboeuf
    Cc: Juergen Gross
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Steven Rostedt
    Link: http://lkml.kernel.org/r/20170828064958.120214366@linutronix.de
    Signed-off-by: Ingo Molnar

    Thomas Gleixner
     

19 Mar, 2017

1 commit

  • For mysterious historical reasons, struct user_desc doesn't indicate
    whether segments are accessed. set_thread_area() has always programmed
    segments as non-accessed, so the first write will set the accessed bit.
    This will fault if the GDT is read-only.

    Fix it by making TLS segments start out accessed.

    If this ends up breaking something, we could, in principle, leave TLS
    segments non-accessed and fix them up when we get the page fault. I'd be
    surprised, though -- AFAIK all the nasty legacy segmented programs (DOSEMU,
    Wine, things that run on DOSEMU and Wine, etc.) do their nasty segmented
    things using the LDT and not the GDT. I assume this is mainly because old
    OSes (Linux and otherwise) didn't historically provide APIs to do nasty
    things in the GDT.

    Fixes: 45fc8757d1d2 ("x86: Make the GDT remapping read-only on 64-bit")
    Signed-off-by: Andy Lutomirski
    Cc: Linus Torvalds
    Cc: Borislav Petkov
    Cc: Thomas Garnier
    Link: http://lkml.kernel.org/r/62b7748542df0164af7e0a5231283b9b13858c45.1489900519.git.luto@kernel.org
    Signed-off-by: Thomas Gleixner

    Andy Lutomirski
     

25 Dec, 2016

1 commit


29 Apr, 2016

1 commit

  • The current behavior of set_thread_area() when it modifies a segment that is
    currently loaded is a bit confused.

    If CS [1] or SS is modified, the change will take effect on return
    to userspace because CS and SS are fundamentally always reloaded on
    return to userspace.

    Similarly, on 32-bit kernels, if DS, ES, FS, or (depending on
    configuration) GS refers to a modified segment, the change will take
    effect immediately on return to user mode because the entry code
    reloads these registers.

    If set_thread_area() modifies DS, ES [2], FS, or GS on 64-bit kernels or
    GS on 32-bit lazy-GS [3] kernels, however, the segment registers
    will be left alone until something (most likely a context switch)
    causes them to be reloaded. This means that behavior visible to
    user space is inconsistent.

    If set_thread_area() is implicitly called via CLONE_SETTLS, then all
    segment registers will be reloaded before the thread starts because
    CLONE_SETTLS happens before the initial context switch into the
    newly created thread.

    Empirically, glibc requires the immediate reload on CLONE_SETTLS --
    32-bit glibc on my system does *not* manually reload GS when
    creating a new thread.

    Before enabling FSGSBASE, we need to figure out what the behavior
    will be, as FSGSBASE requires that we reconsider our behavior when,
    e.g., GS and GSBASE are out of sync in user mode. Given that we
    must preserve the existing behavior of CLONE_SETTLS, it makes sense
    to me that we simply extend similar behavior to all invocations
    of set_thread_area().

    This patch explicitly updates any segment register referring to a
    segment that is targetted by set_thread_area(). If set_thread_area()
    deletes the segment, then the segment register will be nulled out.

    [1] This can't actually happen since 0e58af4e1d21 ("x86/tls:
    Disallow unusual TLS segments") but, if it did, this is how it
    would behave.

    [2] I strongly doubt that any existing non-malicious program loads a
    TLS segment into DS or ES on a 64-bit kernel because the context
    switch code was badly broken until recently, but that's not an
    excuse to leave the current code alone.

    [3] One way or another, that config option should to go away. Yuck!

    Signed-off-by: Andy Lutomirski
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Brian Gerst
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/27d119b0d396e9b82009e40dff8333a249038225.1461698311.git.luto@kernel.org
    Signed-off-by: Ingo Molnar

    Andy Lutomirski
     

23 Jan, 2015

1 commit

  • The Witcher 2 did something like this to allocate a TLS segment index:

    struct user_desc u_info;
    bzero(&u_info, sizeof(u_info));
    u_info.entry_number = (uint32_t)-1;

    syscall(SYS_set_thread_area, &u_info);

    Strictly speaking, this code was never correct. It should have set
    read_exec_only and seg_not_present to 1 to indicate that it wanted
    to find a free slot without putting anything there, or it should
    have put something sensible in the TLS slot if it wanted to allocate
    a TLS entry for real. The actual effect of this code was to
    allocate a bogus segment that could be used to exploit espfix.

    The set_thread_area hardening patches changed the behavior, causing
    set_thread_area to return -EINVAL and crashing the game.

    This changes set_thread_area to interpret this as a request to find
    a free slot and to leave it empty, which isn't *quite* what the game
    expects but should be close enough to keep it working. In
    particular, using the code above to allocate two segments will
    allocate the same segment both times.

    According to FrostbittenKing on Github, this fixes The Witcher 2.

    If this somehow still causes problems, we could instead allocate
    a limit==0 32-bit data segment, but that seems rather ugly to me.

    Fixes: 41bdc78544b8 x86/tls: Validate TLS entries to protect espfix
    Signed-off-by: Andy Lutomirski
    Cc: stable@vger.kernel.org
    Cc: torvalds@linux-foundation.org
    Link: http://lkml.kernel.org/r/0cb251abe1ff0958b8e468a9a9a905b80ae3a746.1421954363.git.luto@amacapital.net
    Signed-off-by: Thomas Gleixner

    Andy Lutomirski
     

18 Dec, 2014

1 commit

  • It turns out that there's a lurking ABI issue. GCC, when
    compiling this in a 32-bit program:

    struct user_desc desc = {
    .entry_number = idx,
    .base_addr = base,
    .limit = 0xfffff,
    .seg_32bit = 1,
    .contents = 0, /* Data, grow-up */
    .read_exec_only = 0,
    .limit_in_pages = 1,
    .seg_not_present = 0,
    .useable = 0,
    };

    will leave .lm uninitialized. This means that anything in the
    kernel that reads user_desc.lm for 32-bit tasks is unreliable.

    Revert the .lm check in set_thread_area(). The value never did
    anything in the first place.

    Fixes: 0e58af4e1d21 ("x86/tls: Disallow unusual TLS segments")
    Signed-off-by: Andy Lutomirski
    Acked-by: Thomas Gleixner
    Cc: stable@vger.kernel.org # Only if 0e58af4e1d21 is backported
    Cc: Linus Torvalds
    Link: http://lkml.kernel.org/r/d7875b60e28c512f6a6fc0baf5714d58e7eaadbb.1418856405.git.luto@amacapital.net
    Signed-off-by: Ingo Molnar

    Andy Lutomirski
     

14 Dec, 2014

2 commits

  • Users have no business installing custom code segments into the
    GDT, and segments that are not present but are otherwise valid
    are a historical source of interesting attacks.

    For completeness, block attempts to set the L bit. (Prior to
    this patch, the L bit would have been silently dropped.)

    This is an ABI break. I've checked glibc, musl, and Wine, and
    none of them look like they'll have any trouble.

    Note to stable maintainers: this is a hardening patch that fixes
    no known bugs. Given the possibility of ABI issues, this
    probably shouldn't be backported quickly.

    Signed-off-by: Andy Lutomirski
    Acked-by: H. Peter Anvin
    Cc: stable@vger.kernel.org # optional
    Cc: Konrad Rzeszutek Wilk
    Cc: Linus Torvalds
    Cc: security@kernel.org
    Cc: Willy Tarreau
    Signed-off-by: Ingo Molnar

    Andy Lutomirski
     
  • Installing a 16-bit RW data segment into the GDT defeats espfix.
    AFAICT this will not affect glibc, Wine, or dosemu at all.

    Signed-off-by: Andy Lutomirski
    Acked-by: H. Peter Anvin
    Cc: stable@vger.kernel.org
    Cc: Konrad Rzeszutek Wilk
    Cc: Linus Torvalds
    Cc: security@kernel.org
    Cc: Willy Tarreau
    Signed-off-by: Ingo Molnar

    Andy Lutomirski
     

04 Mar, 2013

1 commit


30 Mar, 2012

1 commit

  • Pull x86 updates from Ingo Molnar.

    This touches some non-x86 files due to the sanitized INLINE_SPIN_UNLOCK
    config usage.

    Fixed up trivial conflicts due to just header include changes (removing
    headers due to cpu_idle() merge clashing with the split).

    * 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    x86/apic/amd: Be more verbose about LVT offset assignments
    x86, tls: Off by one limit check
    x86/ioapic: Add io_apic_ops driver layer to allow interception
    x86/olpc: Add debugfs interface for EC commands
    x86: Merge the x86_32 and x86_64 cpu_idle() functions
    x86/kconfig: Remove CONFIG_TR=y from the defconfigs
    x86: Stop recursive fault in print_context_stack after stack overflow
    x86/io_apic: Move and reenable irq only when CONFIG_GENERIC_PENDING_IRQ=y
    x86/apic: Add separate apic_id_valid() functions for selected apic drivers
    locking/kconfig: Simplify INLINE_SPIN_UNLOCK usage
    x86/kconfig: Update defconfigs
    x86: Fix excessive MSR print out when show_msr is not specified

    Linus Torvalds
     

29 Mar, 2012

2 commits


22 Jul, 2008

1 commit


11 Apr, 2008

1 commit

  • The prevent_tail_call() macro works around the problem of the compiler
    clobbering argument words on the stack, which for asmlinkage functions
    is the caller's (user's) struct pt_regs. The tail/sibling-call
    optimization is not the only way that the compiler can decide to use
    stack argument words as scratch space, which we have to prevent.
    Other optimizations can do it too.

    Until we have new compiler support to make "asmlinkage" binding on the
    compiler's own use of the stack argument frame, we have work around all
    the manifestations of this issue that crop up.

    More cases seem to be prevented by also keeping the incoming argument
    variables live at the end of the function. This makes their original
    stack slots attractive places to leave those variables, so the compiler
    tends not clobber them for something else. It's still no guarantee, but
    it handles some observed cases that prevent_tail_call() did not.

    Signed-off-by: Roland McGrath
    Signed-off-by: Linus Torvalds

    Roland McGrath
     

01 Mar, 2008

1 commit

  • Fix a kernel bug (vmware boot problem) reported by Tomasz Grobelny,
    which occurs with certain .config variants and gccs.

    The x86 TLS cleanup in commit efd1ca52d04d2f6df337a3332cee56cd60e6d4c4
    made the sys_set_thread_area and sys_get_thread_area functions ripe for
    tail call optimization. If the compiler chooses to use it for them, it
    can clobber the user trap frame because these are asmlinkage functions.

    Reported-by: Tomasz Grobelny
    Signed-off-by: Roland McGrath
    Signed-off-by: Ingo Molnar

    Roland McGrath
     

30 Jan, 2008

6 commits

  • This adds accessor functions in the user_regset style for the TLS data.

    Signed-off-by: Roland McGrath
    Signed-off-by: Ingo Molnar
    Signed-off-by: Thomas Gleixner

    Roland McGrath
     
  • This cleans up the TLS code to use struct desc_struct and to separate the
    encoding and installation magic from the interface wrappers.

    Signed-off-by: Roland McGrath
    Signed-off-by: Ingo Molnar
    Signed-off-by: Thomas Gleixner

    Roland McGrath
     
  • This patch makes get_desc_base() receive a struct desc_struct,
    and then uses its internal fields to compute the base address.
    This is done at both i386 and x86_64, and then it is moved
    to common header

    Signed-off-by: Glauber de Oliveira Costa
    Signed-off-by: Ingo Molnar
    Signed-off-by: Thomas Gleixner

    Glauber de Oliveira Costa
     
  • This patch introduces fill_ldt(), which populates a ldt descriptor
    from a user_desc in once, instead of relying in the LDT_entry_a and
    LDT_entry_b macros

    Signed-off-by: Glauber de Oliveira Costa
    Signed-off-by: Ingo Molnar
    Signed-off-by: Thomas Gleixner

    Glauber de Oliveira Costa
     
  • This consolidates the four different places that implemented the same
    encoding magic for the GDT-slot 32-bit TLS support. The old tls32.c was
    renamed and is now only slightly modified to be the shared implementation.

    Signed-off-by: Roland McGrath
    Cc: Andrew Morton
    Cc: Zachary Amsden
    Signed-off-by: Thomas Gleixner
    Signed-off-by: Ingo Molnar
    Signed-off-by: Thomas Gleixner

    Roland McGrath
     
  • This renames arch/x86/ia32/tls32.c to arch/x86/kernel/tls.c, which does
    nothing now but paves the way to consolidate this code for 32-bit too.

    Signed-off-by: Roland McGrath
    Cc: Andrew Morton
    Cc: Zachary Amsden
    Signed-off-by: Thomas Gleixner
    Signed-off-by: Ingo Molnar
    Signed-off-by: Thomas Gleixner

    Roland McGrath