18 Feb, 2020

2 commits

  • sm3 has been supported by the ima hash algorithm, but it is not
    yet in the Kconfig configuration list. After adding, both ima and tpm2
    can support sm3 well.

    Signed-off-by: Tianjia Zhang
    Signed-off-by: Mimi Zohar

    Tianjia Zhang
     
  • If CONFIG_LOAD_UEFI_KEYS is enabled, the kernel attempts to load the certs
    from the db, dbx and MokListRT EFI variables into the appropriate keyrings.

    But it just assumes that the variables will be present and prints an error
    if the certs can't be loaded, even when is possible that the variables may
    not exist. For example the MokListRT variable will only be present if shim
    is used.

    So only print an error message about failing to get the certs list from an
    EFI variable if this is found. Otherwise these printed errors just pollute
    the kernel log ring buffer with confusing messages like the following:

    [ 5.427251] Couldn't get size: 0x800000000000000e
    [ 5.427261] MODSIGN: Couldn't get UEFI db list
    [ 5.428012] Couldn't get size: 0x800000000000000e
    [ 5.428023] Couldn't get UEFI MokListRT

    Reported-by: Hans de Goede
    Signed-off-by: Javier Martinez Canillas
    Tested-by: Hans de Goede
    Acked-by: Ard Biesheuvel
    Signed-off-by: Mimi Zohar

    Javier Martinez Canillas
     

29 Jan, 2020

1 commit

  • Pull IMA updates from Mimi Zohar:
    "Two new features - measuring certificates and querying IMA for a file
    hash - and three bug fixes:

    - Measuring certificates is like the rest of IMA, based on policy,
    but requires loading a custom policy. Certificates loaded onto a
    keyring, for example during early boot, before a custom policy has
    been loaded, are queued and only processed after loading the custom
    policy.

    - IMA calculates and caches files hashes. Other kernel subsystems,
    and possibly kernel modules, are interested in accessing these
    cached file hashes.

    The bug fixes prevent classifying a file short read (e.g. shutdown) as
    an invalid file signature, add a missing blank when displaying the
    securityfs policy rules containing LSM labels, and, lastly, fix the
    handling of the IMA policy information for unknown LSM labels"

    * 'next-integrity' of git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity:
    IMA: Defined delayed workqueue to free the queued keys
    IMA: Call workqueue functions to measure queued keys
    IMA: Define workqueue for early boot key measurements
    IMA: pre-allocate buffer to hold keyrings string
    ima: ima/lsm policy rule loading logic bug fixes
    ima: add the ability to query the cached hash of a given file
    ima: Add a space after printing LSM rules for readability
    IMA: fix measuring asymmetric keys Kconfig
    IMA: Read keyrings= option from the IMA policy
    IMA: Add support to limit measuring keys
    KEYS: Call the IMA hook to measure keys
    IMA: Define an IMA hook to measure keys
    IMA: Add KEY_CHECK func to measure keys
    IMA: Check IMA policy flag
    ima: avoid appraise error for hash calc interrupt

    Linus Torvalds
     

23 Jan, 2020

7 commits

  • Keys queued for measurement should be freed if a custom IMA policy
    was not loaded. Otherwise, the keys will remain queued forever
    consuming kernel memory.

    This patch defines a delayed workqueue to handle the above scenario.
    The workqueue handler is setup to execute 5 minutes after IMA
    initialization is completed.

    If a custom IMA policy is loaded before the workqueue handler is
    scheduled to execute, the workqueue task is cancelled and any queued keys
    are processed for measurement. But if a custom policy was not loaded then
    the queued keys are just freed when the delayed workqueue handler is run.

    Signed-off-by: Lakshmi Ramasubramanian
    Reported-by: kernel test robot # sleeping
    function called from invalid context
    Reported-by: kbuild test robot # redefinition of
    ima_init_key_queue() function.
    Signed-off-by: Mimi Zohar

    Lakshmi Ramasubramanian
     
  • Measuring keys requires a custom IMA policy to be loaded. Keys should
    be queued for measurement if a custom IMA policy is not yet loaded.
    Keys queued for measurement, if any, should be processed when a custom
    policy is loaded.

    This patch updates the IMA hook function ima_post_key_create_or_update()
    to queue the key if a custom IMA policy has not yet been loaded. And,
    ima_update_policy() function, which is called when a custom IMA policy
    is loaded, is updated to process queued keys.

    Signed-off-by: Lakshmi Ramasubramanian
    Signed-off-by: Mimi Zohar

    Lakshmi Ramasubramanian
     
  • Measuring keys requires a custom IMA policy to be loaded. Keys created
    or updated before a custom IMA policy is loaded should be queued and
    will be processed after a custom policy is loaded.

    This patch defines a workqueue for queuing keys when a custom IMA policy
    has not yet been loaded. An intermediate Kconfig boolean option namely
    IMA_QUEUE_EARLY_BOOT_KEYS is used to declare the workqueue functions.

    A flag namely ima_process_keys is used to check if the key should be
    queued or should be processed immediately.

    Signed-off-by: Lakshmi Ramasubramanian
    Signed-off-by: Mimi Zohar

    Lakshmi Ramasubramanian
     
  • ima_match_keyring() is called while holding rcu read lock. Since this
    function executes in atomic context, it should not call any function
    that can sleep (such as kstrdup()).

    This patch pre-allocates a buffer to hold the keyrings string read from
    the IMA policy and uses that to match the given keyring.

    Signed-off-by: Lakshmi Ramasubramanian
    Fixes: e9085e0ad38a ("IMA: Add support to limit measuring keys")
    Signed-off-by: Mimi Zohar

    Lakshmi Ramasubramanian
     
  • Keep the ima policy rules around from the beginning even if they appear
    invalid at the time of loading, as they may become active after an lsm
    policy load. However, loading a custom IMA policy with unknown LSM
    labels is only safe after we have transitioned from the "built-in"
    policy rules to a custom IMA policy.

    Patch also fixes the rule re-use during the lsm policy reload and makes
    some prints a bit more human readable.

    Changelog:
    v4:
    - Do not allow the initial policy load refer to non-existing lsm rules.
    v3:
    - Fix too wide policy rule matching for non-initialized LSMs
    v2:
    - Fix log prints

    Fixes: b16942455193 ("ima: use the lsm policy update notifier")
    Cc: Casey Schaufler
    Reported-by: Mimi Zohar
    Signed-off-by: Janne Karhunen
    Signed-off-by: Konsta Karsisto
    Signed-off-by: Mimi Zohar

    Janne Karhunen
     
  • This allows other parts of the kernel (perhaps a stacked LSM allowing
    system monitoring, eg. the proposed KRSI LSM [1]) to retrieve the hash
    of a given file from IMA if it's present in the iint cache.

    It's true that the existence of the hash means that it's also in the
    audit logs or in /sys/kernel/security/ima/ascii_runtime_measurements,
    but it can be difficult to pull that information out for every
    subsequent exec. This is especially true if a given host has been up
    for a long time and the file was first measured a long time ago.

    It should be kept in mind that this function gives access to cached
    entries which can be removed, for instance on security_inode_free().

    This is based on Peter Moody's patch:
    https://sourceforge.net/p/linux-ima/mailman/message/33036180/

    [1] https://lkml.org/lkml/2019/9/10/393

    Signed-off-by: Florent Revest
    Reviewed-by: KP Singh
    Signed-off-by: Mimi Zohar

    Florent Revest
     
  • When reading ima_policy from securityfs, there is a missing
    space between output string of LSM rules and the remaining
    rules.

    Signed-off-by: Clay Chang
    Signed-off-by: Mimi Zohar

    Clay Chang
     

10 Jan, 2020

1 commit

  • As a result of the asymmetric public keys subtype Kconfig option being
    defined as tristate, with the existing IMA Makefile, ima_asymmetric_keys.c
    could be built as a kernel module. To prevent this from happening, this
    patch defines and uses an intermediate Kconfig boolean option named
    IMA_MEASURE_ASYMMETRIC_KEYS.

    Signed-off-by: Lakshmi Ramasubramanian
    Suggested-by: James.Bottomley
    Cc: David Howells
    Cc: Jarkko Sakkinen
    Reported-by: kbuild test robot # ima_asymmetric_keys.c
    is built as a kernel module.
    Fixes: 88e70da170e8 ("IMA: Define an IMA hook to measure keys")
    Fixes: cb1aa3823c92 ("KEYS: Call the IMA hook to measure keys")
    [zohar@linux.ibm.com: updated patch description]
    Signed-off-by: Mimi Zohar

    Lakshmi Ramasubramanian
     

12 Dec, 2019

6 commits

  • Read "keyrings=" option, if specified in the IMA policy, and store in
    the list of IMA rules when the configured IMA policy is read.

    This patch defines a new policy token enum namely Opt_keyrings
    and an option flag IMA_KEYRINGS for reading "keyrings=" option
    from the IMA policy.

    Updated ima_parse_rule() to parse "keyrings=" option in the policy.
    Updated ima_policy_show() to display "keyrings=" option.

    The following example illustrates how key measurement can be verified.

    Sample "key" measurement rule in the IMA policy:

    measure func=KEY_CHECK uid=0 keyrings=.ima|.evm template=ima-buf

    Display "key" measurement in the IMA measurement list:

    cat /sys/kernel/security/ima/ascii_runtime_measurements

    10 faf3...e702 ima-buf sha256:27c915b8ddb9fae7214cf0a8a7043cc3eeeaa7539bcb136f8427067b5f6c3b7b .ima 308202863082...4aee

    Verify "key" measurement data for a key added to ".ima" keyring:

    cat /sys/kernel/security/integrity/ima/ascii_runtime_measurements | grep -m 1 "\.ima" | cut -d' ' -f 6 | xxd -r -p |tee ima-cert.der | sha256sum | cut -d' ' -f 1

    The output of the above command should match the template hash
    of the first "key" measurement entry in the IMA measurement list for
    the key added to ".ima" keyring.

    The file namely "ima-cert.der" generated by the above command
    should be a valid x509 certificate (in DER format) and should match
    the one that was used to import the key to the ".ima" keyring.
    The certificate file can be verified using openssl tool.

    Signed-off-by: Lakshmi Ramasubramanian
    Signed-off-by: Mimi Zohar

    Lakshmi Ramasubramanian
     
  • Limit measuring keys to those keys being loaded onto a given set of
    keyrings only and when the user id (uid) matches if uid is specified
    in the policy.

    This patch defines a new IMA policy option namely "keyrings=" that
    can be used to specify a set of keyrings. If this option is specified
    in the policy for "measure func=KEY_CHECK" then only the keys
    loaded onto a keyring given in the "keyrings=" option are measured.

    If uid is specified in the policy then the key is measured only if
    the current user id matches the one specified in the policy.

    Added a new parameter namely "keyring" (name of the keyring) to
    process_buffer_measurement(). The keyring name is passed to
    ima_get_action() to determine the required action.
    ima_match_rules() is updated to check keyring in the policy, if
    specified, for KEY_CHECK function.

    Signed-off-by: Lakshmi Ramasubramanian
    Signed-off-by: Mimi Zohar

    Lakshmi Ramasubramanian
     
  • Measure asymmetric keys used for verifying file signatures,
    certificates, etc.

    This patch defines a new IMA hook namely ima_post_key_create_or_update()
    to measure the payload used to create a new asymmetric key or
    update an existing asymmetric key.

    Asymmetric key structure is defined only when
    CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE is defined. Since the IMA hook
    measures asymmetric keys, the IMA hook is defined in a new file namely
    ima_asymmetric_keys.c which is built only if
    CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE is defined.

    Signed-off-by: Lakshmi Ramasubramanian
    Signed-off-by: Mimi Zohar

    Lakshmi Ramasubramanian
     
  • Measure keys loaded onto any keyring.

    This patch defines a new IMA policy func namely KEY_CHECK to
    measure keys. Updated ima_match_rules() to check for KEY_CHECK
    and ima_parse_rule() to handle KEY_CHECK.

    Signed-off-by: Lakshmi Ramasubramanian
    Signed-off-by: Mimi Zohar

    Lakshmi Ramasubramanian
     
  • process_buffer_measurement() may be called prior to IMA being
    initialized (for instance, when the IMA hook is called when
    a key is added to the .builtin_trusted_keys keyring), which
    would result in a kernel panic.

    This patch adds the check in process_buffer_measurement()
    to return immediately if IMA is not initialized yet.

    Signed-off-by: Lakshmi Ramasubramanian
    Signed-off-by: Mimi Zohar

    Lakshmi Ramasubramanian
     
  • The integrity_kernel_read() call in ima_calc_file_hash_tfm() can return
    a value of 0 before all bytes of the file are read. A value of 0 would
    normally indicate an EOF. This has been observed if a user process is
    causing a file appraisal and is terminated with a SIGTERM signal. The
    most common occurrence of seeing the problem is if a shutdown or systemd
    reload is initiated while files are being appraised.

    The problem is similar to commit (ima: always return
    negative code for error) that fixed the problem in
    ima_calc_file_hash_atfm().

    Suggested-by: Mimi Zohar
    Signed-off-by: Patrick Callaghan
    Reviewed-by: Sascha Hauer
    Signed-off-by: Mimi Zohar

    Patrick Callaghan
     

10 Dec, 2019

1 commit

  • Replace all the occurrences of FIELD_SIZEOF() with sizeof_field() except
    at places where these are defined. Later patches will remove the unused
    definition of FIELD_SIZEOF().

    This patch is generated using following script:

    EXCLUDE_FILES="include/linux/stddef.h|include/linux/kernel.h"

    git grep -l -e "\bFIELD_SIZEOF\b" | while read file;
    do

    if [[ "$file" =~ $EXCLUDE_FILES ]]; then
    continue
    fi
    sed -i -e 's/\bFIELD_SIZEOF\b/sizeof_field/g' $file;
    done

    Signed-off-by: Pankaj Bharadiya
    Link: https://lore.kernel.org/r/20190924105839.110713-3-pankaj.laxminarayan.bharadiya@intel.com
    Co-developed-by: Kees Cook
    Signed-off-by: Kees Cook
    Acked-by: David Miller # for net

    Pankaj Bharadiya
     

29 Nov, 2019

1 commit

  • commit ad723674d675 ("x86/efi: move common keyring handler functions
    to new file") leave this unused.

    Fixes: ad723674d675 ("x86/efi: move common keyring handler functions to new file")
    Reported-by: Hulk Robot
    Signed-off-by: YueHaibing
    Link: https://lore.kernel.org/r/20191115130830.13320-1-yuehaibing@huawei.com

    YueHaibing
     

12 Nov, 2019

4 commits

  • The keys used to verify the Host OS kernel are managed by firmware as
    secure variables. This patch loads the verification keys into the
    .platform keyring and revocation hashes into .blacklist keyring. This
    enables verification and loading of the kernels signed by the boot
    time keys which are trusted by firmware.

    Signed-off-by: Nayna Jain
    Reviewed-by: Mimi Zohar
    Signed-off-by: Eric Richter
    [mpe: Search by compatible in load_powerpc_certs(), not using format]
    Signed-off-by: Michael Ellerman
    Link: https://lore.kernel.org/r/1573441836-3632-5-git-send-email-nayna@linux.ibm.com

    Nayna Jain
     
  • The handlers to add the keys to the .platform keyring and blacklisted
    hashes to the .blacklist keyring is common for both the uefi and powerpc
    mechanisms of loading the keys/hashes from the firmware.

    This patch moves the common code from load_uefi.c to keyring_handler.c

    Signed-off-by: Nayna Jain
    Acked-by: Mimi Zohar
    Signed-off-by: Eric Richter
    Signed-off-by: Michael Ellerman
    Link: https://lore.kernel.org/r/1573441836-3632-4-git-send-email-nayna@linux.ibm.com

    Nayna Jain
     
  • Asymmetric private keys are used to sign multiple files. The kernel
    currently supports checking against blacklisted keys. However, if the
    public key is blacklisted, any file signed by the blacklisted key will
    automatically fail signature verification. Blacklisting the public key
    is not fine enough granularity, as we might want to only blacklist a
    particular file.

    This patch adds support for checking against the blacklisted hash of
    the file, without the appended signature, based on the IMA policy. It
    defines a new policy option "appraise_flag=check_blacklist".

    In addition to the blacklisted binary hashes stored in the firmware
    "dbx" variable, the Linux kernel may be configured to load blacklisted
    binary hashes onto the .blacklist keyring as well. The following
    example shows how to blacklist a specific kernel module hash.

    $ sha256sum kernel/kheaders.ko
    77fa889b35a05338ec52e51591c1b89d4c8d1c99a21251d7c22b1a8642a6bad3
    kernel/kheaders.ko

    $ grep BLACKLIST .config
    CONFIG_SYSTEM_BLACKLIST_KEYRING=y
    CONFIG_SYSTEM_BLACKLIST_HASH_LIST="blacklist-hash-list"

    $ cat certs/blacklist-hash-list
    "bin:77fa889b35a05338ec52e51591c1b89d4c8d1c99a21251d7c22b1a8642a6bad3"

    Update the IMA custom measurement and appraisal policy
    rules (/etc/ima-policy):

    measure func=MODULE_CHECK template=ima-modsig
    appraise func=MODULE_CHECK appraise_flag=check_blacklist
    appraise_type=imasig|modsig

    After building, installing, and rebooting the kernel:

    545660333 ---lswrv 0 0 \_ blacklist:
    bin:77fa889b35a05338ec52e51591c1b89d4c8d1c99a21251d7c22b1a8642a6bad3

    measure func=MODULE_CHECK template=ima-modsig
    appraise func=MODULE_CHECK appraise_flag=check_blacklist
    appraise_type=imasig|modsig

    modprobe: ERROR: could not insert 'kheaders': Permission denied

    10 0c9834db5a0182c1fb0cdc5d3adcf11a11fd83dd ima-sig
    sha256:3bc6ed4f0b4d6e31bc1dbc9ef844605abc7afdc6d81a57d77a1ec9407997c40
    2 /usr/lib/modules/5.4.0-rc3+/kernel/kernel/kheaders.ko

    10 82aad2bcc3fa8ed94762356b5c14838f3bcfa6a0 ima-modsig
    sha256:3bc6ed4f0b4d6e31bc1dbc9ef844605abc7afdc6d81a57d77a1ec9407997c40
    2 /usr/lib/modules/5.4.0rc3+/kernel/kernel/kheaders.ko sha256:77fa889b3
    5a05338ec52e51591c1b89d4c8d1c99a21251d7c22b1a8642a6bad3
    3082029a06092a864886f70d010702a082028b30820287020101310d300b0609608648
    016503040201300b06092a864886f70d01070131820264....

    10 25b72217cc1152b44b134ce2cd68f12dfb71acb3 ima-buf
    sha256:8b58427fedcf8f4b20bc8dc007f2e232bf7285d7b93a66476321f9c2a3aa132
    b blacklisted-hash
    77fa889b35a05338ec52e51591c1b89d4c8d1c99a21251d7c22b1a8642a6bad3

    Signed-off-by: Nayna Jain
    [zohar@linux.ibm.com: updated patch description]
    Signed-off-by: Mimi Zohar
    Signed-off-by: Michael Ellerman
    Link: https://lore.kernel.org/r/1572492694-6520-8-git-send-email-zohar@linux.ibm.com

    Nayna Jain
     
  • process_buffer_measurement() is limited to measuring the kexec boot
    command line. This patch makes process_buffer_measurement() more
    generic, allowing it to measure other types of buffer data (e.g.
    blacklisted binary hashes or key hashes).

    process_buffer_measurement() may be called directly from an IMA hook
    or as an auxiliary measurement record. In both cases the buffer
    measurement is based on policy. This patch modifies the function to
    conditionally retrieve the policy defined PCR and template for the IMA
    hook case.

    Signed-off-by: Nayna Jain
    [zohar@linux.ibm.com: added comment in process_buffer_measurement()]
    Signed-off-by: Mimi Zohar
    Signed-off-by: Michael Ellerman
    Link: https://lore.kernel.org/r/1572492694-6520-6-git-send-email-zohar@linux.ibm.com

    Nayna Jain
     

05 Oct, 2019

2 commits

  • The ima/ and evm/ sub-directories contain built-in objects, so
    obj-$(CONFIG_...) is the correct way to descend into them.

    subdir-$(CONFIG_...) is redundant.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     
  • I guess commit 15ea0e1e3e18 ("efi: Import certificates from UEFI Secure
    Boot") attempted to add -fshort-wchar for building load_uefi.o, but it
    has never worked as intended.

    load_uefi.o is created in the platform_certs/ sub-directory. If you
    really want to add -fshort-wchar, the correct code is:

    $(obj)/platform_certs/load_uefi.o: KBUILD_CFLAGS += -fshort-wchar

    But, you do not need to fix it.

    Commit 8c97023cf051 ("Kbuild: use -fshort-wchar globally") had already
    added -fshort-wchar globally. This code was unneeded in the first place.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     

28 Sep, 2019

1 commit

  • Pull kernel lockdown mode from James Morris:
    "This is the latest iteration of the kernel lockdown patchset, from
    Matthew Garrett, David Howells and others.

    From the original description:

    This patchset introduces an optional kernel lockdown feature,
    intended to strengthen the boundary between UID 0 and the kernel.
    When enabled, various pieces of kernel functionality are restricted.
    Applications that rely on low-level access to either hardware or the
    kernel may cease working as a result - therefore this should not be
    enabled without appropriate evaluation beforehand.

    The majority of mainstream distributions have been carrying variants
    of this patchset for many years now, so there's value in providing a
    doesn't meet every distribution requirement, but gets us much closer
    to not requiring external patches.

    There are two major changes since this was last proposed for mainline:

    - Separating lockdown from EFI secure boot. Background discussion is
    covered here: https://lwn.net/Articles/751061/

    - Implementation as an LSM, with a default stackable lockdown LSM
    module. This allows the lockdown feature to be policy-driven,
    rather than encoding an implicit policy within the mechanism.

    The new locked_down LSM hook is provided to allow LSMs to make a
    policy decision around whether kernel functionality that would allow
    tampering with or examining the runtime state of the kernel should be
    permitted.

    The included lockdown LSM provides an implementation with a simple
    policy intended for general purpose use. This policy provides a coarse
    level of granularity, controllable via the kernel command line:

    lockdown={integrity|confidentiality}

    Enable the kernel lockdown feature. If set to integrity, kernel features
    that allow userland to modify the running kernel are disabled. If set to
    confidentiality, kernel features that allow userland to extract
    confidential information from the kernel are also disabled.

    This may also be controlled via /sys/kernel/security/lockdown and
    overriden by kernel configuration.

    New or existing LSMs may implement finer-grained controls of the
    lockdown features. Refer to the lockdown_reason documentation in
    include/linux/security.h for details.

    The lockdown feature has had signficant design feedback and review
    across many subsystems. This code has been in linux-next for some
    weeks, with a few fixes applied along the way.

    Stephen Rothwell noted that commit 9d1f8be5cf42 ("bpf: Restrict bpf
    when kernel lockdown is in confidentiality mode") is missing a
    Signed-off-by from its author. Matthew responded that he is providing
    this under category (c) of the DCO"

    * 'next-lockdown' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security: (31 commits)
    kexec: Fix file verification on S390
    security: constify some arrays in lockdown LSM
    lockdown: Print current->comm in restriction messages
    efi: Restrict efivar_ssdt_load when the kernel is locked down
    tracefs: Restrict tracefs when the kernel is locked down
    debugfs: Restrict debugfs when the kernel is locked down
    kexec: Allow kexec_file() with appropriate IMA policy when locked down
    lockdown: Lock down perf when in confidentiality mode
    bpf: Restrict bpf when kernel lockdown is in confidentiality mode
    lockdown: Lock down tracing and perf kprobes when in confidentiality mode
    lockdown: Lock down /proc/kcore
    x86/mmiotrace: Lock down the testmmiotrace module
    lockdown: Lock down module params that specify hardware parameters (eg. ioport)
    lockdown: Lock down TIOCSSERIAL
    lockdown: Prohibit PCMCIA CIS storage when the kernel is locked down
    acpi: Disable ACPI table override if the kernel is locked down
    acpi: Ignore acpi_rsdp kernel param when the kernel has been locked down
    ACPI: Limit access to custom_method when the kernel is locked down
    x86/msr: Restrict MSR access when the kernel is locked down
    x86: Lock down IO port access when the kernel is locked down
    ...

    Linus Torvalds
     

30 Aug, 2019

2 commits

  • One of the more common cases of allocation size calculations is finding
    the size of a structure that has a zero-sized array at the end, along
    with memory for some number of elements for that array. For example:

    struct ima_template_entry {
    ...
    struct ima_field_data template_data[0]; /* template related data */
    };

    instance = kzalloc(sizeof(struct ima_template_entry) + count * sizeof(struct ima_field_data), GFP_NOFS);

    Instead of leaving these open-coded and prone to type mistakes, we can
    now use the new struct_size() helper:

    instance = kzalloc(struct_size(instance, entry, count), GFP_NOFS);

    This code was detected with the help of Coccinelle.

    Signed-off-by: Gustavo A. R. Silva
    Signed-off-by: Mimi Zohar

    Gustavo A. R. Silva
     
  • One of the more common cases of allocation size calculations is finding
    the size of a structure that has a zero-sized array at the end, along
    with memory for some number of elements for that array. For example:

    struct foo {
    int stuff;
    struct boo entry[];
    };

    instance = kzalloc(sizeof(struct foo) + count * sizeof(struct boo), GFP_KERNEL);

    Instead of leaving these open-coded and prone to type mistakes, we can
    now use the new struct_size() helper:

    instance = kzalloc(struct_size(instance, entry, count), GFP_KERNEL);

    This code was detected with the help of Coccinelle.

    Signed-off-by: Gustavo A. R. Silva
    Signed-off-by: Mimi Zohar

    Gustavo A. R. Silva
     

29 Aug, 2019

1 commit

  • If we can't parse the PKCS7 in the appended modsig, we will free the modsig
    structure and then access one of its members to determine the error value.

    Fixes: 39b07096364a ("ima: Implement support for module-style appended signatures")
    Reported-by: kbuild test robot
    Reported-by: Julia Lawall
    Reported-by: Dan Carpenter
    Signed-off-by: Thiago Jung Bauermann
    Reviewed-by: Gustavo A. R. Silva
    Signed-off-by: Mimi Zohar

    Thiago Jung Bauermann
     

20 Aug, 2019

2 commits

  • Systems in lockdown mode should block the kexec of untrusted kernels.
    For x86 and ARM we can ensure that a kernel is trustworthy by validating
    a PE signature, but this isn't possible on other architectures. On those
    platforms we can use IMA digital signatures instead. Add a function to
    determine whether IMA has or will verify signatures for a given event type,
    and if so permit kexec_file() even if the kernel is otherwise locked down.
    This is restricted to cases where CONFIG_INTEGRITY_TRUSTED_KEYRING is set
    in order to prevent an attacker from loading additional keys at runtime.

    Signed-off-by: Matthew Garrett
    Acked-by: Mimi Zohar
    Cc: Dmitry Kasatkin
    Cc: linux-integrity@vger.kernel.org
    Signed-off-by: James Morris

    Matthew Garrett
     
  • This is a preparatory patch for kexec_file_load() lockdown. A locked down
    kernel needs to prevent unsigned kernel images from being loaded with
    kexec_file_load(). Currently, the only way to force the signature
    verification is compiling with KEXEC_VERIFY_SIG. This prevents loading
    usigned images even when the kernel is not locked down at runtime.

    This patch splits KEXEC_VERIFY_SIG into KEXEC_SIG and KEXEC_SIG_FORCE.
    Analogous to the MODULE_SIG and MODULE_SIG_FORCE for modules, KEXEC_SIG
    turns on the signature verification but allows unsigned images to be
    loaded. KEXEC_SIG_FORCE disallows images without a valid signature.

    Signed-off-by: Jiri Bohac
    Signed-off-by: David Howells
    Signed-off-by: Matthew Garrett
    cc: kexec@lists.infradead.org
    Signed-off-by: James Morris

    Jiri Bohac
     

06 Aug, 2019

9 commits

  • integrity_kernel_read() can fail in which case we forward to call
    ahash_request_free() on a currently running request. We have to wait
    for its completion before we can free the request.

    This was observed by interrupting a "find / -type f -xdev -print0 | xargs -0
    cat 1>/dev/null" with ctrl-c on an IMA enabled filesystem.

    Signed-off-by: Sascha Hauer
    Signed-off-by: Mimi Zohar

    Sascha Hauer
     
  • integrity_kernel_read() returns the number of bytes read. If this is
    a short read then this positive value is returned from
    ima_calc_file_hash_atfm(). Currently this is only indirectly called from
    ima_calc_file_hash() and this function only tests for the return value
    being zero or nonzero and also doesn't forward the return value.
    Nevertheless there's no point in returning a positive value as an error,
    so translate a short read into -EINVAL.

    Signed-off-by: Sascha Hauer
    Signed-off-by: Mimi Zohar

    Sascha Hauer
     
  • If the IMA template contains the "modsig" or "d-modsig" field, then the
    modsig should be added to the measurement list when the file is appraised.

    And that is what normally happens, but if a measurement rule caused a file
    containing a modsig to be measured before a different rule causes it to be
    appraised, the resulting measurement entry will not contain the modsig
    because it is only fetched during appraisal. When the appraisal rule
    triggers, it won't store a new measurement containing the modsig because
    the file was already measured.

    We need to detect that situation and store an additional measurement with
    the modsig. This is done by adding an IMA_MEASURE action flag if we read a
    modsig and the IMA template contains a modsig field.

    Suggested-by: Mimi Zohar
    Signed-off-by: Thiago Jung Bauermann
    Signed-off-by: Mimi Zohar

    Thiago Jung Bauermann
     
  • Define new "d-modsig" template field which holds the digest that is
    expected to match the one contained in the modsig, and also new "modsig"
    template field which holds the appended file signature.

    Add a new "ima-modsig" defined template descriptor with the new fields as
    well as the ones from the "ima-sig" descriptor.

    Change ima_store_measurement() to accept a struct modsig * argument so that
    it can be passed along to the templates via struct ima_event_data.

    Suggested-by: Mimi Zohar
    Signed-off-by: Thiago Jung Bauermann
    Signed-off-by: Mimi Zohar

    Thiago Jung Bauermann
     
  • Obtain the modsig and calculate its corresponding hash in
    ima_collect_measurement().

    Signed-off-by: Thiago Jung Bauermann
    Signed-off-by: Mimi Zohar

    Thiago Jung Bauermann
     
  • Implement the appraise_type=imasig|modsig option, allowing IMA to read and
    verify modsig signatures.

    In case a file has both an xattr signature and an appended modsig, IMA will
    only use the appended signature if the key used by the xattr signature
    isn't present in the IMA or platform keyring.

    Because modsig verification needs to convert from an integrity keyring id
    to the keyring itself, add an integrity_keyring_from_id() function in
    digsig.c so that integrity_modsig_verify() can use it.

    Signed-off-by: Thiago Jung Bauermann
    Signed-off-by: Mimi Zohar

    Thiago Jung Bauermann
     
  • Verify xattr signature in a separate function so that the logic in
    ima_appraise_measurement() remains clear when it gains the ability to also
    verify an appended module signature.

    The code in the switch statement is unchanged except for having to
    dereference the status and cause variables (since they're now pointers),
    and fixing the style of a block comment to appease checkpatch.

    Suggested-by: Mimi Zohar
    Signed-off-by: Thiago Jung Bauermann
    Signed-off-by: Mimi Zohar

    Thiago Jung Bauermann
     
  • Introduce the modsig keyword to the IMA policy syntax to specify that
    a given hook should expect the file to have the IMA signature appended
    to it. Here is how it can be used in a rule:

    appraise func=KEXEC_KERNEL_CHECK appraise_type=imasig|modsig

    With this rule, IMA will accept either a signature stored in the extended
    attribute or an appended signature.

    For now, the rule above will behave exactly the same as if
    appraise_type=imasig was specified. The actual modsig implementation
    will be introduced separately.

    Suggested-by: Mimi Zohar
    Signed-off-by: Thiago Jung Bauermann
    Signed-off-by: Mimi Zohar

    Thiago Jung Bauermann
     
  • This avoids a dependency cycle in soon-to-be-introduced
    CONFIG_IMA_APPRAISE_MODSIG: it will select CONFIG_MODULE_SIG_FORMAT
    which in turn selects CONFIG_KEYS. Kconfig then complains that
    CONFIG_INTEGRITY_SIGNATURE depends on CONFIG_KEYS.

    Signed-off-by: Thiago Jung Bauermann
    Signed-off-by: Mimi Zohar

    Thiago Jung Bauermann