30 Nov, 2013

1 commit

  • This patch stores the address of the 'template_fmt_copy' variable in a new
    variable, called 'template_fmt_ptr', so that the latter is passed as an
    argument of strsep() instead of the former. This modification is needed
    in order to correctly free the memory area referenced by
    'template_fmt_copy' (strsep() modifies the pointer of the passed string).

    Signed-off-by: Roberto Sassu
    Reported-by: Sebastian Ott
    Signed-off-by: Mimi Zohar
    Signed-off-by: James Morris

    Roberto Sassu
     

26 Nov, 2013

1 commit

  • This patch makes a copy of the 'template_fmt' function argument so that
    the latter will not be modified by strsep(), which does the splitting by
    replacing the given separator with '\0'.

     IMA: No TPM chip found, activating TPM-bypass!
     Unable to handle kernel pointer dereference at virtual kernel address 0000000000842000
     Oops: 0004 [#1] SMP
     Modules linked in:
     CPU: 3 PID: 1 Comm: swapper/0 Not tainted 3.12.0-rc2-00098-g3ce1217d6cd5 #17
     task: 000000003ffa0000 ti: 000000003ff84000 task.ti: 000000003ff84000
     Krnl PSW : 0704e00180000000 000000000044bf88 (strsep+0x7c/0xa0)
                R:0 T:1 IO:1 EX:1 Key:0 M:1 W:0 P:0 AS:3 CC:2 PM:0 EA:3
     Krnl GPRS: 000000000000007c 000000000000007c 000000003ff87d90 0000000000821fd8
                0000000000000000 000000000000007c 0000000000aa37e0 0000000000aa9008
                0000000000000051 0000000000a114d8 0000000100000002 0000000000842bde
                0000000000842bdf 00000000006f97f0 000000000040062c 000000003ff87cf0
     Krnl Code: 000000000044bf7c: a7f4000a           brc     15,44bf90
                000000000044bf80: b90200cc           ltgr    %r12,%r12
               #000000000044bf84: a7840006           brc     8,44bf90
               >000000000044bf88: 9200c000           mvi     0(%r12),0
                000000000044bf8c: 41c0c001           la      %r12,1(%r12)
                000000000044bf90: e3c020000024       stg     %r12,0(%r2)
                000000000044bf96: b904002b           lgr     %r2,%r11
                000000000044bf9a: ebbcf0700004       lmg     %r11,%r12,112(%r15)
     Call Trace:
     ([] ima_init_template+0xa2/0x1bc)
      [] ima_init+0x7a/0xa8
      [] init_ima+0x24/0x40
      [] do_one_initcall+0x68/0x128
      [] kernel_init_freeable+0x20a/0x2b4
      [] kernel_init+0x30/0x178
      [] kernel_thread_starter+0x6/0xc
      [] kernel_thread_starter+0x0/0xc
     Last Breaking-Event-Address:
      [] strsep+0x36/0xa0

    Fixes commit: adf53a7 ima: new templates management mechanism

    Changelog v1:
    - make template_fmt 'const char *' (reported-by James Morris)
    - fix kstrdup memory leak (reported-by James Morris)

    Reported-by: Heiko Carstens
    Signed-off-by: Roberto Sassu
    Signed-off-by: Mimi Zohar
    Tested-by: Heiko Carstens

    Roberto Sassu
     

25 Nov, 2013

2 commits


24 Nov, 2013

1 commit

  • This reverts commit 217091dd7a7a1bdac027ddb7c5a25f6ac0b8e241, which
    caused the following build error:

    security/integrity/digsig.c:70:5: error: redefinition of ‘integrity_init_keyring’
    security/integrity/integrity.h:149:12: note: previous definition of ‘integrity_init_keyring’ w
    security/integrity/integrity.h:149:12: warning: ‘integrity_init_keyring’ defined but not used

    reported by Krzysztof Kolasa. Mimi says:

    "I made the classic mistake of requesting this patch to be upstreamed
    at the last second, rather than waiting until the next open window.

    At this point, the best course would probably be to revert the two
    commits and fix them for the next open window"

    Reported-by: Krzysztof Kolasa
    Acked-by: Mimi Zohar
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

22 Nov, 2013

2 commits

  • Pull security subsystem updates from James Morris:
    "In this patchset, we finally get an SELinux update, with Paul Moore
    taking over as maintainer of that code.

    Also a significant update for the Keys subsystem, as well as
    maintenance updates to Smack, IMA, TPM, and Apparmor"

    and since I wanted to know more about the updates to key handling,
    here's the explanation from David Howells on that:

    "Okay. There are a number of separate bits. I'll go over the big bits
    and the odd important other bit, most of the smaller bits are just
    fixes and cleanups. If you want the small bits accounting for, I can
    do that too.

    (1) Keyring capacity expansion.

    KEYS: Consolidate the concept of an 'index key' for key access
    KEYS: Introduce a search context structure
    KEYS: Search for auth-key by name rather than target key ID
    Add a generic associative array implementation.
    KEYS: Expand the capacity of a keyring

    Several of the patches are providing an expansion of the capacity of a
    keyring. Currently, the maximum size of a keyring payload is one page.
    Subtract a small header and then divide up into pointers, that only gives
    you ~500 pointers on an x86_64 box. However, since the NFS idmapper uses
    a keyring to store ID mapping data, that has proven to be insufficient to
    the cause.

    Whatever data structure I use to handle the keyring payload, it can only
    store pointers to keys, not the keys themselves because several keyrings
    may point to a single key. This precludes inserting, say, and rb_node
    struct into the key struct for this purpose.

    I could make an rbtree of records such that each record has an rb_node
    and a key pointer, but that would use four words of space per key stored
    in the keyring. It would, however, be able to use much existing code.

    I selected instead a non-rebalancing radix-tree type approach as that
    could have a better space-used/key-pointer ratio. I could have used the
    radix tree implementation that we already have and insert keys into it by
    their serial numbers, but that means any sort of search must iterate over
    the whole radix tree. Further, its nodes are a bit on the capacious side
    for what I want - especially given that key serial numbers are randomly
    allocated, thus leaving a lot of empty space in the tree.

    So what I have is an associative array that internally is a radix-tree
    with 16 pointers per node where the index key is constructed from the key
    type pointer and the key description. This means that an exact lookup by
    type+description is very fast as this tells us how to navigate directly to
    the target key.

    I made the data structure general in lib/assoc_array.c as far as it is
    concerned, its index key is just a sequence of bits that leads to a
    pointer. It's possible that someone else will be able to make use of it
    also. FS-Cache might, for example.

    (2) Mark keys as 'trusted' and keyrings as 'trusted only'.

    KEYS: verify a certificate is signed by a 'trusted' key
    KEYS: Make the system 'trusted' keyring viewable by userspace
    KEYS: Add a 'trusted' flag and a 'trusted only' flag
    KEYS: Separate the kernel signature checking keyring from module signing

    These patches allow keys carrying asymmetric public keys to be marked as
    being 'trusted' and allow keyrings to be marked as only permitting the
    addition or linkage of trusted keys.

    Keys loaded from hardware during kernel boot or compiled into the kernel
    during build are marked as being trusted automatically. New keys can be
    loaded at runtime with add_key(). They are checked against the system
    keyring contents and if their signatures can be validated with keys that
    are already marked trusted, then they are marked trusted also and can
    thus be added into the master keyring.

    Patches from Mimi Zohar make this usable with the IMA keyrings also.

    (3) Remove the date checks on the key used to validate a module signature.

    X.509: Remove certificate date checks

    It's not reasonable to reject a signature just because the key that it was
    generated with is no longer valid datewise - especially if the kernel
    hasn't yet managed to set the system clock when the first module is
    loaded - so just remove those checks.

    (4) Make it simpler to deal with additional X.509 being loaded into the kernel.

    KEYS: Load *.x509 files into kernel keyring
    KEYS: Have make canonicalise the paths of the X.509 certs better to deduplicate

    The builder of the kernel now just places files with the extension ".x509"
    into the kernel source or build trees and they're concatenated by the
    kernel build and stuffed into the appropriate section.

    (5) Add support for userspace kerberos to use keyrings.

    KEYS: Add per-user_namespace registers for persistent per-UID kerberos caches
    KEYS: Implement a big key type that can save to tmpfs

    Fedora went to, by default, storing kerberos tickets and tokens in tmpfs.
    We looked at storing it in keyrings instead as that confers certain
    advantages such as tickets being automatically deleted after a certain
    amount of time and the ability for the kernel to get at these tokens more
    easily.

    To make this work, two things were needed:

    (a) A way for the tickets to persist beyond the lifetime of all a user's
    sessions so that cron-driven processes can still use them.

    The problem is that a user's session keyrings are deleted when the
    session that spawned them logs out and the user's user keyring is
    deleted when the UID is deleted (typically when the last log out
    happens), so neither of these places is suitable.

    I've added a system keyring into which a 'persistent' keyring is
    created for each UID on request. Each time a user requests their
    persistent keyring, the expiry time on it is set anew. If the user
    doesn't ask for it for, say, three days, the keyring is automatically
    expired and garbage collected using the existing gc. All the kerberos
    tokens it held are then also gc'd.

    (b) A key type that can hold really big tickets (up to 1MB in size).

    The problem is that Active Directory can return huge tickets with lots
    of auxiliary data attached. We don't, however, want to eat up huge
    tracts of unswappable kernel space for this, so if the ticket is
    greater than a certain size, we create a swappable shmem file and dump
    the contents in there and just live with the fact we then have an
    inode and a dentry overhead. If the ticket is smaller than that, we
    slap it in a kmalloc()'d buffer"

    * 'for-linus2' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security: (121 commits)
    KEYS: Fix keyring content gc scanner
    KEYS: Fix error handling in big_key instantiation
    KEYS: Fix UID check in keyctl_get_persistent()
    KEYS: The RSA public key algorithm needs to select MPILIB
    ima: define '_ima' as a builtin 'trusted' keyring
    ima: extend the measurement list to include the file signature
    kernel/system_certificate.S: use real contents instead of macro GLOBAL()
    KEYS: fix error return code in big_key_instantiate()
    KEYS: Fix keyring quota misaccounting on key replacement and unlink
    KEYS: Fix a race between negating a key and reading the error set
    KEYS: Make BIG_KEYS boolean
    apparmor: remove the "task" arg from may_change_ptraced_domain()
    apparmor: remove parent task info from audit logging
    apparmor: remove tsk field from the apparmor_audit_struct
    apparmor: fix capability to not use the current task, during reporting
    Smack: Ptrace access check mode
    ima: provide hash algo info in the xattr
    ima: enable support for larger default filedata hash algorithms
    ima: define kernel parameter 'ima_template=' to change configured default
    ima: add Kconfig default measurement list template
    ...

    Linus Torvalds
     
  • Pull audit updates from Eric Paris:
    "Nothing amazing. Formatting, small bug fixes, couple of fixes where
    we didn't get records due to some old VFS changes, and a change to how
    we collect execve info..."

    Fixed conflict in fs/exec.c as per Eric and linux-next.

    * git://git.infradead.org/users/eparis/audit: (28 commits)
    audit: fix type of sessionid in audit_set_loginuid()
    audit: call audit_bprm() only once to add AUDIT_EXECVE information
    audit: move audit_aux_data_execve contents into audit_context union
    audit: remove unused envc member of audit_aux_data_execve
    audit: Kill the unused struct audit_aux_data_capset
    audit: do not reject all AUDIT_INODE filter types
    audit: suppress stock memalloc failure warnings since already managed
    audit: log the audit_names record type
    audit: add child record before the create to handle case where create fails
    audit: use given values in tty_audit enable api
    audit: use nlmsg_len() to get message payload length
    audit: use memset instead of trying to initialize field by field
    audit: fix info leak in AUDIT_GET requests
    audit: update AUDIT_INODE filter rule to comparator function
    audit: audit feature to set loginuid immutable
    audit: audit feature to only allow unsetting the loginuid
    audit: allow unsetting the loginuid (with priv)
    audit: remove CONFIG_AUDIT_LOGINUID_IMMUTABLE
    audit: loginuid functions coding style
    selinux: apply selinux checks on new audit message types
    ...

    Linus Torvalds
     

14 Nov, 2013

2 commits

  • Key pointers stored in the keyring are marked in bit 1 to indicate if they
    point to a keyring. We need to strip off this bit before using the pointer
    when iterating over the keyring for the purpose of looking for links to garbage
    collect.

    This means that expirable keyrings aren't correctly expiring because the
    checker is seeing their key pointer with 2 added to it.

    Since the fix for this involves knowing about the internals of the keyring,
    key_gc_keyring() is moved to keyring.c and merged into keyring_gc().

    This can be tested by:

    echo 2 >/proc/sys/kernel/keys/gc_delay
    keyctl timeout `keyctl add keyring qwerty "" @s` 2
    cat /proc/keys
    sleep 5; cat /proc/keys

    which should see a keyring called "qwerty" appear in the session keyring and
    then disappear after it expires, and:

    echo 2 >/proc/sys/kernel/keys/gc_delay
    a=`keyctl get_persistent @s`
    b=`keyctl add keyring 0 "" $a`
    keyctl add user a a $b
    keyctl timeout $b 2
    cat /proc/keys
    sleep 5; cat /proc/keys

    which should see a keyring called "0" with a key called "a" in it appear in the
    user's persistent keyring (which will be attached to the session keyring) and
    then both the "0" keyring and the "a" key should disappear when the "0" keyring
    expires.

    Signed-off-by: David Howells
    Acked-by: Simo Sorce

    David Howells
     
  • In the big_key_instantiate() function we return 0 if kernel_write() returns us
    an error rather than returning an error. This can potentially lead to
    dentry_open() giving a BUG when called from big_key_read() with an unset
    tmpfile path.

    ------------[ cut here ]------------
    kernel BUG at fs/open.c:798!
    ...
    RIP: 0010:[] dentry_open+0xd1/0xe0
    ...
    Call Trace:
    [] big_key_read+0x55/0x100
    [] keyctl_read_key+0xb4/0xe0
    [] SyS_keyctl+0xf8/0x1d0
    [] system_call_fastpath+0x16/0x1b

    Signed-off-by: David Howells
    Reviewed-by: Stephen Gallagher

    David Howells
     

13 Nov, 2013

2 commits

  • Pull networking updates from David Miller:

    1) The addition of nftables. No longer will we need protocol aware
    firewall filtering modules, it can all live in userspace.

    At the core of nftables is a, for lack of a better term, virtual
    machine that executes byte codes to inspect packet or metadata
    (arriving interface index, etc.) and make verdict decisions.

    Besides support for loading packet contents and comparing them, the
    interpreter supports lookups in various datastructures as
    fundamental operations. For example sets are supports, and
    therefore one could create a set of whitelist IP address entries
    which have ACCEPT verdicts attached to them, and use the appropriate
    byte codes to do such lookups.

    Since the interpreted code is composed in userspace, userspace can
    do things like optimize things before giving it to the kernel.

    Another major improvement is the capability of atomically updating
    portions of the ruleset. In the existing netfilter implementation,
    one has to update the entire rule set in order to make a change and
    this is very expensive.

    Userspace tools exist to create nftables rules using existing
    netfilter rule sets, but both kernel implementations will need to
    co-exist for quite some time as we transition from the old to the
    new stuff.

    Kudos to Patrick McHardy, Pablo Neira Ayuso, and others who have
    worked so hard on this.

    2) Daniel Borkmann and Hannes Frederic Sowa made several improvements
    to our pseudo-random number generator, mostly used for things like
    UDP port randomization and netfitler, amongst other things.

    In particular the taus88 generater is updated to taus113, and test
    cases are added.

    3) Support 64-bit rates in HTB and TBF schedulers, from Eric Dumazet
    and Yang Yingliang.

    4) Add support for new 577xx tigon3 chips to tg3 driver, from Nithin
    Sujir.

    5) Fix two fatal flaws in TCP dynamic right sizing, from Eric Dumazet,
    Neal Cardwell, and Yuchung Cheng.

    6) Allow IP_TOS and IP_TTL to be specified in sendmsg() ancillary
    control message data, much like other socket option attributes.
    From Francesco Fusco.

    7) Allow applications to specify a cap on the rate computed
    automatically by the kernel for pacing flows, via a new
    SO_MAX_PACING_RATE socket option. From Eric Dumazet.

    8) Make the initial autotuned send buffer sizing in TCP more closely
    reflect actual needs, from Eric Dumazet.

    9) Currently early socket demux only happens for TCP sockets, but we
    can do it for connected UDP sockets too. Implementation from Shawn
    Bohrer.

    10) Refactor inet socket demux with the goal of improving hash demux
    performance for listening sockets. With the main goals being able
    to use RCU lookups on even request sockets, and eliminating the
    listening lock contention. From Eric Dumazet.

    11) The bonding layer has many demuxes in it's fast path, and an RCU
    conversion was started back in 3.11, several changes here extend the
    RCU usage to even more locations. From Ding Tianhong and Wang
    Yufen, based upon suggestions by Nikolay Aleksandrov and Veaceslav
    Falico.

    12) Allow stackability of segmentation offloads to, in particular, allow
    segmentation offloading over tunnels. From Eric Dumazet.

    13) Significantly improve the handling of secret keys we input into the
    various hash functions in the inet hashtables, TCP fast open, as
    well as syncookies. From Hannes Frederic Sowa. The key fundamental
    operation is "net_get_random_once()" which uses static keys.

    Hannes even extended this to ipv4/ipv6 fragmentation handling and
    our generic flow dissector.

    14) The generic driver layer takes care now to set the driver data to
    NULL on device removal, so it's no longer necessary for drivers to
    explicitly set it to NULL any more. Many drivers have been cleaned
    up in this way, from Jingoo Han.

    15) Add a BPF based packet scheduler classifier, from Daniel Borkmann.

    16) Improve CRC32 interfaces and generic SKB checksum iterators so that
    SCTP's checksumming can more cleanly be handled. Also from Daniel
    Borkmann.

    17) Add a new PMTU discovery mode, IP_PMTUDISC_INTERFACE, which forces
    using the interface MTU value. This helps avoid PMTU attacks,
    particularly on DNS servers. From Hannes Frederic Sowa.

    18) Use generic XPS for transmit queue steering rather than internal
    (re-)implementation in virtio-net. From Jason Wang.

    * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1622 commits)
    random32: add test cases for taus113 implementation
    random32: upgrade taus88 generator to taus113 from errata paper
    random32: move rnd_state to linux/random.h
    random32: add prandom_reseed_late() and call when nonblocking pool becomes initialized
    random32: add periodic reseeding
    random32: fix off-by-one in seeding requirement
    PHY: Add RTL8201CP phy_driver to realtek
    xtsonic: add missing platform_set_drvdata() in xtsonic_probe()
    macmace: add missing platform_set_drvdata() in mace_probe()
    ethernet/arc/arc_emac: add missing platform_set_drvdata() in arc_emac_probe()
    ipv6: protect for_each_sk_fl_rcu in mem_check with rcu_read_lock_bh
    vlan: Implement vlan_dev_get_egress_qos_mask as an inline.
    ixgbe: add warning when max_vfs is out of range.
    igb: Update link modes display in ethtool
    netfilter: push reasm skb through instead of original frag skbs
    ip6_output: fragment outgoing reassembled skb properly
    MAINTAINERS: mv643xx_eth: take over maintainership from Lennart
    net_sched: tbf: support of 64bit rates
    ixgbe: deleting dfwd stations out of order can cause null ptr deref
    ixgbe: fix build err, num_rx_queues is only available with CONFIG_RPS
    ...

    Linus Torvalds
     
  • Pull cgroup changes from Tejun Heo:
    "Not too much activity this time around. css_id is finally killed and
    a minor update to device_cgroup"

    * 'for-3.13' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup:
    device_cgroup: remove can_attach
    cgroup: kill css_id
    memcg: stop using css id
    memcg: fail to create cgroup if the cgroup id is too big
    memcg: convert to use cgroup id
    memcg: convert to use cgroup_is_descendant()

    Linus Torvalds
     

06 Nov, 2013

3 commits

  • If the UID is specified by userspace when calling the KEYCTL_GET_PERSISTENT
    function and the process does not have the CAP_SETUID capability, then the
    function will return -EPERM if the current process's uid, suid, euid and fsuid
    all match the requested UID. This is incorrect.

    Fix it such that when a non-privileged caller requests a persistent keyring by
    a specific UID they can only request their own (ie. the specified UID matches
    either then process's UID or the process's EUID).

    This can be tested by logging in as the user and doing:

    keyctl get_persistent @p
    keyctl get_persistent @p `id -u`
    keyctl get_persistent @p 0

    The first two should successfully print the same key ID. The third should do
    the same if called by UID 0 or indicate Operation Not Permitted otherwise.

    Signed-off-by: David Howells
    Acked-by: Stephen Gallagher

    David Howells
     
  • Supress the stock memory allocation failure warnings for audit buffers
    since audit alreay takes care of memory allocation failure warnings, including
    rate-limiting, in audit_log_start().

    Signed-off-by: Richard Guy Briggs
    Signed-off-by: Eric Paris

    Richard Guy Briggs
     
  • We use the read check to get the feature set (like AUDIT_GET) and the
    write check to set the features (like AUDIT_SET).

    Signed-off-by: Eric Paris
    Signed-off-by: Richard Guy Briggs
    Signed-off-by: Eric Paris

    Eric Paris
     

01 Nov, 2013

2 commits

  • Require all keys added to the IMA keyring be signed by an
    existing trusted key on the system trusted keyring.

    Changelog:
    - define stub integrity_init_keyring() function (reported-by Fengguang Wu)
    - differentiate between regular and trusted keyring names.
    - replace printk with pr_info (D. Kasatkin)

    Signed-off-by: Mimi Zohar

    Mimi Zohar
     
  • This patch defines a new template called 'ima-sig', which includes
    the file signature in the template data, in addition to the file's
    digest and pathname.

    A template is composed of a set of fields. Associated with each
    field is an initialization and display function. This patch defines
    a new template field called 'sig', the initialization function
    ima_eventsig_init(), and the display function ima_show_template_sig().

    This patch modifies the .field_init() function definition to include
    the 'security.ima' extended attribute and length.

    Changelog:
    - remove unused code (Dmitry Kasatkin)
    - avoid calling ima_write_template_field_data() unnecesarily (Roberto Sassu)
    - rename DATA_FMT_SIG to DATA_FMT_HEX
    - cleanup ima_eventsig_init() based on Roberto's comments

    Signed-off-by: Mimi Zohar
    Signed-off-by: Dmitry Kasatkin
    Signed-off-by: Roberto Sassu

    Mimi Zohar
     

31 Oct, 2013

1 commit


30 Oct, 2013

9 commits

  • Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.

    Signed-off-by: Wei Yongjun
    Signed-off-by: David Howells

    Wei Yongjun
     
  • If a key is displaced from a keyring by a matching one, then four more bytes
    of quota are allocated to the keyring - despite the fact that the keyring does
    not change in size.

    Further, when a key is unlinked from a keyring, the four bytes of quota
    allocated the link isn't recovered and returned to the user's pool.

    The first can be tested by repeating:

    keyctl add big_key a fred @s
    cat /proc/key-users

    (Don't put it in a shell loop otherwise the garbage collector won't have time
    to clear the displaced keys, thus affecting the result).

    This was causing the kerberos keyring to run out of room fairly quickly.

    The second can be tested by:

    cat /proc/key-users
    a=`keyctl add user a a @s`
    cat /proc/key-users
    keyctl unlink $a
    sleep 1 # Give RCU a chance to delete the key
    cat /proc/key-users

    assuming no system activity that otherwise adds/removes keys, the amount of
    key data allocated should go up (say 40/20000 -> 47/20000) and then return to
    the original value at the end.

    Reported-by: Stephen Gallagher
    Signed-off-by: David Howells

    David Howells
     
  • key_reject_and_link() marking a key as negative and setting the error with
    which it was negated races with keyring searches and other things that read
    that error.

    The fix is to switch the order in which the assignments are done in
    key_reject_and_link() and to use memory barriers.

    Kudos to Dave Wysochanski and Scott Mayhew
    for tracking this down.

    This may be the cause of:

    BUG: unable to handle kernel NULL pointer dereference at 0000000000000070
    IP: [] wait_for_key_construction+0x31/0x80
    PGD c6b2c3067 PUD c59879067 PMD 0
    Oops: 0000 [#1] SMP
    last sysfs file: /sys/devices/system/cpu/cpu3/cache/index2/shared_cpu_map
    CPU 0
    Modules linked in: ...

    Pid: 13359, comm: amqzxma0 Not tainted 2.6.32-358.20.1.el6.x86_64 #1 IBM System x3650 M3 -[7945PSJ]-/00J6159
    RIP: 0010:[] wait_for_key_construction+0x31/0x80
    RSP: 0018:ffff880c6ab33758 EFLAGS: 00010246
    RAX: ffffffff81219080 RBX: 0000000000000000 RCX: 0000000000000002
    RDX: ffffffff81219060 RSI: 0000000000000000 RDI: 0000000000000000
    RBP: ffff880c6ab33768 R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000001 R11: 0000000000000000 R12: ffff880adfcbce40
    R13: ffffffffa03afb84 R14: ffff880adfcbce40 R15: ffff880adfcbce43
    FS: 00007f29b8042700(0000) GS:ffff880028200000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000000000000070 CR3: 0000000c613dc000 CR4: 00000000000007f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    Process amqzxma0 (pid: 13359, threadinfo ffff880c6ab32000, task ffff880c610deae0)
    Stack:
    ffff880adfcbce40 0000000000000000 ffff880c6ab337b8 ffffffff81219695
    0000000000000000 ffff880a000000d0 ffff880c6ab337a8 000000000000000f
    ffffffffa03afb93 000000000000000f ffff88186c7882c0 0000000000000014
    Call Trace:
    [] request_key+0x65/0xa0
    [] nfs_idmap_request_key+0xc5/0x170 [nfs]
    [] nfs_idmap_lookup_id+0x34/0x80 [nfs]
    [] nfs_map_group_to_gid+0x75/0xa0 [nfs]
    [] decode_getfattr_attrs+0xbdd/0xfb0 [nfs]
    [] ? __dequeue_entity+0x30/0x50
    [] ? __switch_to+0x26e/0x320
    [] decode_getfattr+0x83/0xe0 [nfs]
    [] ? nfs4_xdr_dec_getattr+0x0/0xa0 [nfs]
    [] nfs4_xdr_dec_getattr+0x8f/0xa0 [nfs]
    [] rpcauth_unwrap_resp+0x84/0xb0 [sunrpc]
    [] ? nfs4_xdr_dec_getattr+0x0/0xa0 [nfs]
    [] call_decode+0x1b3/0x800 [sunrpc]
    [] ? wake_bit_function+0x0/0x50
    [] ? call_decode+0x0/0x800 [sunrpc]
    [] __rpc_execute+0x77/0x350 [sunrpc]
    [] ? bit_waitqueue+0x17/0xd0
    [] rpc_execute+0x61/0xa0 [sunrpc]
    [] rpc_run_task+0x75/0x90 [sunrpc]
    [] rpc_call_sync+0x42/0x70 [sunrpc]
    [] _nfs4_call_sync+0x30/0x40 [nfs]
    [] _nfs4_proc_getattr+0xac/0xc0 [nfs]
    [] ? futex_wait+0x227/0x380
    [] nfs4_proc_getattr+0x56/0x80 [nfs]
    [] __nfs_revalidate_inode+0xe3/0x220 [nfs]
    [] nfs_revalidate_mapping+0x4e/0x170 [nfs]
    [] nfs_file_read+0x77/0x130 [nfs]
    [] do_sync_read+0xfa/0x140
    [] ? autoremove_wake_function+0x0/0x40
    [] ? apic_timer_interrupt+0xe/0x20
    [] ? common_interrupt+0xe/0x13
    [] ? selinux_file_permission+0xfb/0x150
    [] ? security_file_permission+0x16/0x20
    [] vfs_read+0xb5/0x1a0
    [] sys_read+0x51/0x90
    [] ? __audit_syscall_exit+0x265/0x290
    [] system_call_fastpath+0x16/0x1b

    Signed-off-by: David Howells
    cc: Dave Wysochanski
    cc: Scott Mayhew

    David Howells
     
  • Having the big_keys functionality as a module is very marginally useful.
    The userspace code that would use this functionality will get odd error
    messages from the keys layer if the module isn't loaded. The code itself
    is fairly small, so just have this as a boolean option and not a tristate.

    Signed-off-by: Josh Boyer
    Signed-off-by: David Howells

    Josh Boyer
     
  • Unless task == current ptrace_parent(task) is not safe even under
    rcu_read_lock() and most of the current users are not right.

    So may_change_ptraced_domain(task) looks wrong as well. However it
    is always called with task == current so the code is actually fine.
    Remove this argument to make this fact clear.

    Note: perhaps we should simply kill ptrace_parent(), it buys almost
    nothing. And it is obviously racy, perhaps this should be fixed.

    Signed-off-by: Oleg Nesterov
    Signed-off-by: John Johansen

    Oleg Nesterov
     
  • The reporting of the parent task info is a vestage from old versions of
    apparmor. The need for this information was removed by unique null-
    profiles before apparmor was upstreamed so remove this info from logging.

    Signed-off-by: John Johansen

    John Johansen
     
  • Now that aa_capabile no longer sets the task field it can be removed
    and the lsm_audit version of the field can be used.

    Signed-off-by: John Johansen

    John Johansen
     
  • Mediation is based off of the cred but auditing includes the current
    task which may not be related to the actual request.

    Signed-off-by: John Johansen

    John Johansen
     
  • James Morris
     

29 Oct, 2013

1 commit

  • When the ptrace security hooks were split the addition of
    a mode parameter was not taken advantage of in the Smack
    ptrace access check. This changes the access check from
    always looking for read and write access to using the
    passed mode. This will make use of /proc much happier.

    Targeted for git://git.gitorious.org/smack-next/kernel.git

    Signed-off-by: Casey Schaufler

    Casey Schaufler
     

27 Oct, 2013

6 commits

  • All files labeled with 'security.ima' hashes, are hashed using the
    same hash algorithm. Changing from one hash algorithm to another,
    requires relabeling the filesystem. This patch defines a new xattr
    type, which includes the hash algorithm, permitting different files
    to be hashed with different algorithms.

    Signed-off-by: Dmitry Kasatkin
    Signed-off-by: Mimi Zohar

    Dmitry Kasatkin
     
  • The IMA measurement list contains two hashes - a template data hash
    and a filedata hash. The template data hash is committed to the TPM,
    which is limited, by the TPM v1.2 specification, to 20 bytes. The
    filedata hash is defined as 20 bytes as well.

    Now that support for variable length measurement list templates was
    added, the filedata hash is not limited to 20 bytes. This patch adds
    Kconfig support for defining larger default filedata hash algorithms
    and replacing the builtin default with one specified on the kernel
    command line.

    contains a list of hash algorithms. The
    Kconfig default hash algorithm is a subset of this list, but any hash
    algorithm included in the list can be specified at boot, using the
    'ima_hash=' kernel command line option.

    Changelog v2:
    - update Kconfig

    Changelog:
    - support hashes that are configured
    - use generic HASH_ALGO_ definitions
    - add Kconfig support
    - hash_setup must be called only once (Dmitry)
    - removed trailing whitespaces (Roberto Sassu)

    Signed-off-by: Mimi Zohar
    Signed-off-by: Roberto Sassu

    Mimi Zohar
     
  • This patch allows users to specify from the kernel command line the
    template descriptor, among those defined, that will be used to generate
    and display measurement entries. If an user specifies a wrong template,
    IMA reverts to the template descriptor set in the kernel configuration.

    Signed-off-by: Roberto Sassu
    Signed-off-by: Mimi Zohar

    Roberto Sassu
     
  • This patch adds a Kconfig option to select the default IMA
    measurement list template. The 'ima' template limited the
    filedata hash to 20 bytes and the pathname to 255 charaters.
    The 'ima-ng' measurement list template permits larger hash
    digests and longer pathnames.

    Changelog:
    - keep 'select CRYPTO_HASH_INFO' in 'config IMA' section (Kconfig)
    (Roberto Sassu);
    - removed trailing whitespaces (Roberto Sassu).
    - Lindent fixes

    Signed-off-by: Mimi Zohar
    Signed-off-by: Roberto Sassu

    Mimi Zohar
     
  • The same hash algorithm should be used for calculating the file
    data hash for the IMA measurement list, as for appraising the file
    data integrity. (The appraise hash algorithm is stored in the
    'security.ima' extended attribute.) The exception is when the
    reference file data hash digest, stored in the extended attribute,
    is larger than the one supported by the template. In this case,
    the file data hash needs to be calculated twice, once for the
    measurement list and, again, for appraisal.

    Signed-off-by: Roberto Sassu
    Signed-off-by: Mimi Zohar

    Roberto Sassu
     
  • Different files might be signed based on different hash algorithms.
    This patch prefixes the audit log measurement hash with the hash
    algorithm.

    Changelog:
    - use generic HASH_ALGO defintions
    - use ':' as delimiter between the hash algorithm and the digest
    (Roberto Sassu)
    - always include the hash algorithm used when audit-logging a measurement

    Signed-off-by: Mimi Zohar
    Signed-off-by: Roberto Sassu
    Signed-off-by: Peter Moody

    Mimi Zohar
     

26 Oct, 2013

7 commits

  • This patch performs the switch to the new template mechanism by modifying
    the functions ima_alloc_init_template(), ima_measurements_show() and
    ima_ascii_measurements_show(). The old function ima_template_show() was
    removed as it is no longer needed. Also, if the template descriptor used
    to generate a measurement entry is not 'ima', the whole length of field
    data stored for an entry is provided before the data itself through the
    binary_runtime_measurement interface.

    Changelog:
    - unnecessary to use strncmp() (Mimi Zohar)
    - create new variable 'field' in ima_alloc_init_template() (Roberto Sassu)
    - use GFP_NOFS flag in ima_alloc_init_template() (Roberto Sassu)
    - new variable 'num_fields' in ima_store_template() (Roberto Sassu,
    proposed by Mimi Zohar)
    - rename ima_calc_buffer_hash/template_hash() to ima_calc_field_array_hash(),
    something more generic (Mimi, requested by Dmitry)
    - sparse error fix - Fengguang Wu
    - fix lindent warnings
    - always include the field length in the template data length
    - include the template field length variable size in the template data length
    - include both the template field data and field length in the template digest
    calculation. Simplifies verifying the template digest. (Mimi)

    Signed-off-by: Roberto Sassu
    Signed-off-by: Mimi Zohar

    Roberto Sassu
     
  • This patch adds support for the new template 'ima-ng', whose format
    is defined as 'd-ng|n-ng'. These new field definitions remove the
    size limitations of the original 'ima' template. Further, the 'd-ng'
    field prefixes the inode digest with the hash algorithim, when
    displaying the new larger digest sizes.

    Change log:
    - scripts/Lindent fixes - Mimi
    - "always true comparison" - reported by Fengguang Wu, resolved Dmitry
    - initialize hash_algo variable to HASH_ALGO__LAST
    - always prefix digest with hash algorithm - Mimi

    Signed-off-by: Roberto Sassu
    Signed-off-by: Mimi Zohar

    Roberto Sassu
     
  • This patch defines a library containing two initial template fields,
    inode digest (d) and file name (n), the 'ima' template descriptor,
    whose format is 'd|n', and two helper functions,
    ima_write_template_field_data() and ima_show_template_field_data().

    Changelog:
    - replace ima_eventname_init() parameter NULL checking with BUG_ON.
    (suggested by Mimi)
    - include "new template fields for inode digest (d) and file name (n)"
    definitions to fix a compiler warning. - Mimi
    - unnecessary to prefix static function names with 'ima_'. remove
    prefix to resolve Lindent formatting changes. - Mimi
    - abbreviated/removed inline comments - Mimi
    - always send the template field length - Mimi

    Signed-off-by: Roberto Sassu
    Signed-off-by: Mimi Zohar

    Roberto Sassu
     
  • The original 'ima' template is fixed length, containing the filedata hash
    and pathname. The filedata hash is limited to 20 bytes (md5/sha1). The
    pathname is a null terminated string, limited to 255 characters. To
    overcome these limitations and to add additional file metadata, it is
    necessary to extend the current version of IMA by defining additional
    templates.

    The main reason to introduce this feature is that, each time a new
    template is defined, the functions that generate and display the
    measurement list would include the code for handling a new format and,
    thus, would significantly grow over time.

    This patch set solves this problem by separating the template management
    from the remaining IMA code. The core of this solution is the definition
    of two new data structures: a template descriptor, to determine which
    information should be included in the measurement list, and a template
    field, to generate and display data of a given type.

    To define a new template field, developers define the field identifier
    and implement two functions, init() and show(), respectively to generate
    and display measurement entries. Initially, this patch set defines the
    following template fields (support for additional data types will be
    added later):
     - 'd': the digest of the event (i.e. the digest of a measured file),
            calculated with the SHA1 or MD5 hash algorithm;
     - 'n': the name of the event (i.e. the file name), with size up to
            255 bytes;
     - 'd-ng': the digest of the event, calculated with an arbitrary hash
               algorithm (field format: [:]digest, where the digest
               prefix is shown only if the hash algorithm is not SHA1 or MD5);
     - 'n-ng': the name of the event, without size limitations.

    Defining a new template descriptor requires specifying the template format,
    a string of field identifiers separated by the '|' character. This patch
    set defines the following template descriptors:
     - "ima": its format is 'd|n';
     - "ima-ng" (default): its format is 'd-ng|n-ng'

    Further details about the new template architecture can be found in
    Documentation/security/IMA-templates.txt.

    Changelog:
    - don't defer calling ima_init_template() - Mimi
    - don't define ima_lookup_template_desc() until used - Mimi
    - squashed with documentation patch - Mimi

    Signed-off-by: Roberto Sassu
    Signed-off-by: Mimi Zohar

    Roberto Sassu
     
  • Instead of allocating and initializing the template entry from multiple
    places (eg. boot aggregate, violation, and regular measurements), this
    patch defines a new function called ima_alloc_init_template(). The new
    function allocates and initializes the measurement entry with the inode
    digest and the filename.

    In respect to the current behavior, it truncates the file name passed
    in the 'filename' argument if the latter's size is greater than 255 bytes
    and the passed file descriptor is NULL.

    Changelog:
    - initialize 'hash' variable for non TPM case - Mimi
    - conform to expectation for 'iint' to be defined as a pointer. - Mimi
    - add missing 'file' dependency for recalculating file hash. - Mimi

    Signed-off-by: Roberto Sassu
    Signed-off-by: Mimi Zohar

    Roberto Sassu
     
  • Pass the filename argument to ima_add_template_entry() in order to
    eliminate a dependency on template specific data (third argument of
    integrity_audit_msg).

    This change is required because, with the new template management
    mechanism, the generation of a new measurement entry will be performed
    by new specific functions (introduced in next patches) and the current IMA
    code will not be aware anymore of how data is stored in the entry payload.

    Signed-off-by: Roberto Sassu
    Signed-off-by: Mimi Zohar

    Roberto Sassu
     
  • Pass the file descriptor instead of the inode to ima_add_violation(),
    to make the latter consistent with ima_store_measurement() in
    preparation for the new template architecture.

    Signed-off-by: Roberto Sassu
    Signed-off-by: Mimi Zohar

    Roberto Sassu