19 Aug, 2020

1 commit

  • [ Upstream commit 9ff8a616dfab96a4fa0ddd36190907dc68886d9b ]

    Ask the LSM to free its audit rule rather than directly calling kfree().
    Both AppArmor and SELinux do additional work in their audit_rule_free()
    hooks. Fix memory leaks by allowing the LSMs to perform necessary work.

    Fixes: b16942455193 ("ima: use the lsm policy update notifier")
    Signed-off-by: Tyler Hicks
    Cc: Janne Karhunen
    Cc: Casey Schaufler
    Reviewed-by: Mimi Zohar
    Signed-off-by: Mimi Zohar
    Signed-off-by: Sasha Levin

    Tyler Hicks
     

11 Aug, 2020

1 commit

  • commit 311aa6aafea446c2f954cc19d66425bfed8c4b0b upstream.

    The IMA_APPRAISE_BOOTPARAM config allows enabling different "ima_appraise="
    modes - log, fix, enforce - at run time, but not when IMA architecture
    specific policies are enabled.  This prevents properly labeling the
    filesystem on systems where secure boot is supported, but not enabled on the
    platform.  Only when secure boot is actually enabled should these IMA
    appraise modes be disabled.

    This patch removes the compile time dependency and makes it a runtime
    decision, based on the secure boot state of that platform.

    Test results as follows:

    -> x86-64 with secure boot enabled

    [ 0.015637] Kernel command line: ima_policy=appraise_tcb ima_appraise=fix
    [ 0.015668] ima: Secure boot enabled: ignoring ima_appraise=fix boot parameter option

    -> powerpc with secure boot disabled

    [ 0.000000] Kernel command line: ima_policy=appraise_tcb ima_appraise=fix
    [ 0.000000] Secure boot mode disabled

    -> Running the system without secure boot and with both options set:

    CONFIG_IMA_APPRAISE_BOOTPARAM=y
    CONFIG_IMA_ARCH_POLICY=y

    Audit prompts "missing-hash" but still allow execution and, consequently,
    filesystem labeling:

    type=INTEGRITY_DATA msg=audit(07/09/2020 12:30:27.778:1691) : pid=4976
    uid=root auid=root ses=2
    subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 op=appraise_data
    cause=missing-hash comm=bash name=/usr/bin/evmctl dev="dm-0" ino=493150
    res=no

    Cc: stable@vger.kernel.org
    Fixes: d958083a8f64 ("x86/ima: define arch_get_ima_policy() for x86")
    Signed-off-by: Bruno Meneguele
    Cc: stable@vger.kernel.org # 5.0
    Signed-off-by: Mimi Zohar
    Signed-off-by: Greg Kroah-Hartman

    Bruno Meneguele
     

22 Jun, 2020

9 commits

  • [ Upstream commit b59fda449cf07f2db3be3a67142e6c000f5e8d79 ]

    After adding the new add_rule() function in commit c52657d93b05
    ("ima: refactor ima_init_policy()"), all appraisal flags are added to the
    temp_ima_appraise variable. Revert to the previous behavior instead of
    removing build_ima_appraise, to benefit from the protection offered by
    __ro_after_init.

    The mentioned commit introduced a bug, as it makes all the flags
    modifiable, while build_ima_appraise flags can be protected with
    __ro_after_init.

    Cc: stable@vger.kernel.org # 5.0.x
    Fixes: c52657d93b05 ("ima: refactor ima_init_policy()")
    Co-developed-by: Roberto Sassu
    Signed-off-by: Roberto Sassu
    Signed-off-by: Krzysztof Struczynski
    Signed-off-by: Mimi Zohar
    Signed-off-by: Sasha Levin

    Krzysztof Struczynski
     
  • [ Upstream commit 6ee28442a465ab4c4be45e3b15015af24b1ba906 ]

    Function ima_appraise_flag() returns the flag to be set in
    temp_ima_appraise depending on the hook identifier passed as an argument.
    It is not necessary to set the flag again for the POLICY_CHECK hook.

    Signed-off-by: Krzysztof Struczynski
    Signed-off-by: Mimi Zohar
    Signed-off-by: Sasha Levin

    Krzysztof Struczynski
     
  • commit 0c4395fb2aa77341269ea619c5419ea48171883f upstream.

    Don't immediately return if the signature is portable and security.ima is
    not present. Just set error so that memory allocated is freed before
    returning from evm_calc_hmac_or_hash().

    Fixes: 50b977481fce9 ("EVM: Add support for portable signature format")
    Signed-off-by: Roberto Sassu
    Cc: stable@vger.kernel.org
    Signed-off-by: Mimi Zohar
    Signed-off-by: Greg Kroah-Hartman

    Roberto Sassu
     
  • commit 8b8c704d913b0fe490af370631a4200e26334ec0 upstream.

    Commit 6cc7c266e5b4 ("ima: Call ima_calc_boot_aggregate() in
    ima_eventdigest_init()") added a call to ima_calc_boot_aggregate() so that
    the digest can be recalculated for the boot_aggregate measurement entry if
    the 'd' template field has been requested. For the 'd' field, only SHA1 and
    MD5 digests are accepted.

    Given that ima_eventdigest_init() does not have the __init annotation, all
    functions called should not have it. This patch removes __init from
    ima_pcrread().

    Cc: stable@vger.kernel.org
    Fixes: 6cc7c266e5b4 ("ima: Call ima_calc_boot_aggregate() in ima_eventdigest_init()")
    Reported-by: Linus Torvalds
    Signed-off-by: Roberto Sassu
    Signed-off-by: Linus Torvalds
    Signed-off-by: Greg Kroah-Hartman

    Roberto Sassu
     
  • commit 6cc7c266e5b47d3cd2b5bb7fd3aac4e6bb2dd1d2 upstream.

    If the template field 'd' is chosen and the digest to be added to the
    measurement entry was not calculated with SHA1 or MD5, it is
    recalculated with SHA1, by using the passed file descriptor. However, this
    cannot be done for boot_aggregate, because there is no file descriptor.

    This patch adds a call to ima_calc_boot_aggregate() in
    ima_eventdigest_init(), so that the digest can be recalculated also for the
    boot_aggregate entry.

    Cc: stable@vger.kernel.org # 3.13.x
    Fixes: 3ce1217d6cd5d ("ima: define template fields library and new helpers")
    Reported-by: Takashi Iwai
    Signed-off-by: Roberto Sassu
    Signed-off-by: Mimi Zohar
    Signed-off-by: Greg Kroah-Hartman

    Roberto Sassu
     
  • commit 067a436b1b0aafa593344fddd711a755a58afb3b upstream.

    This patch prevents the following oops:

    [ 10.771813] BUG: kernel NULL pointer dereference, address: 0000000000000
    [...]
    [ 10.779790] RIP: 0010:ima_match_policy+0xf7/0xb80
    [...]
    [ 10.798576] Call Trace:
    [ 10.798993] ? ima_lsm_policy_change+0x2b0/0x2b0
    [ 10.799753] ? inode_init_owner+0x1a0/0x1a0
    [ 10.800484] ? _raw_spin_lock+0x7a/0xd0
    [ 10.801592] ima_must_appraise.part.0+0xb6/0xf0
    [ 10.802313] ? ima_fix_xattr.isra.0+0xd0/0xd0
    [ 10.803167] ima_must_appraise+0x4f/0x70
    [ 10.804004] ima_post_path_mknod+0x2e/0x80
    [ 10.804800] do_mknodat+0x396/0x3c0

    It occurs when there is a failure during IMA initialization, and
    ima_init_policy() is not called. IMA hooks still call ima_match_policy()
    but ima_rules is NULL. This patch prevents the crash by directly assigning
    the ima_default_policy pointer to ima_rules when ima_rules is defined. This
    wouldn't alter the existing behavior, as ima_rules is always set at the end
    of ima_init_policy().

    Cc: stable@vger.kernel.org # 3.7.x
    Fixes: 07f6a79415d7d ("ima: add appraise action keywords and default rules")
    Reported-by: Takashi Iwai
    Signed-off-by: Roberto Sassu
    Signed-off-by: Mimi Zohar
    Signed-off-by: Greg Kroah-Hartman

    Roberto Sassu
     
  • commit e144d6b265415ddbdc54b3f17f4f95133effa5a8 upstream.

    Evaluate error in init_ima() before register_blocking_lsm_notifier() and
    return if not zero.

    Cc: stable@vger.kernel.org # 5.3.x
    Fixes: b16942455193 ("ima: use the lsm policy update notifier")
    Signed-off-by: Roberto Sassu
    Reviewed-by: James Morris
    Signed-off-by: Mimi Zohar
    Signed-off-by: Greg Kroah-Hartman

    Roberto Sassu
     
  • commit 6f1a1d103b48b1533a9c804e7a069e2c8e937ce7 upstream.

    boot_aggregate is the first entry of IMA measurement list. Its purpose is
    to link pre-boot measurements to IMA measurements. As IMA was designed to
    work with a TPM 1.2, the SHA1 PCR bank was always selected even if a
    TPM 2.0 with support for stronger hash algorithms is available.

    This patch first tries to find a PCR bank with the IMA default hash
    algorithm. If it does not find it, it selects the SHA256 PCR bank for
    TPM 2.0 and SHA1 for TPM 1.2. Ultimately, it selects SHA1 also for TPM 2.0
    if the SHA256 PCR bank is not found.

    If none of the PCR banks above can be found, boot_aggregate file digest is
    filled with zeros, as for TPM bypass, making it impossible to perform a
    remote attestation of the system.

    Cc: stable@vger.kernel.org # 5.1.x
    Fixes: 879b589210a9 ("tpm: retrieve digest size of unknown algorithms with PCR read")
    Reported-by: Jerry Snitselaar
    Suggested-by: James Bottomley
    Signed-off-by: Roberto Sassu
    Signed-off-by: Mimi Zohar
    Signed-off-by: Greg Kroah-Hartman

    Roberto Sassu
     
  • commit 1129d31b55d509f15e72dc68e4b5c3a4d7b4da8d upstream.

    Function hash_long() accepts unsigned long, while currently only one byte
    is passed from ima_hash_key(), which calculates a key for ima_htable.

    Given that hashing the digest does not give clear benefits compared to
    using the digest itself, remove hash_long() and return the modulus
    calculated on the first two bytes of the digest with the number of slots.
    Also reduce the depth of the hash table by doubling the number of slots.

    Cc: stable@vger.kernel.org
    Fixes: 3323eec921ef ("integrity: IMA as an integrity service provider")
    Co-developed-by: Roberto Sassu
    Signed-off-by: Roberto Sassu
    Signed-off-by: Krzysztof Struczynski
    Acked-by: David.Laight@aculab.com (big endian system concerns)
    Signed-off-by: Mimi Zohar
    Signed-off-by: Greg Kroah-Hartman

    Krzysztof Struczynski
     

07 Jun, 2020

1 commit

  • [ Upstream commit 770f60586d2af0590be263f55fd079226313922c ]

    This patch fixes the following warning and few other instances of
    traversal of evm_config_xattrnames list:

    [ 32.848432] =============================
    [ 32.848707] WARNING: suspicious RCU usage
    [ 32.848966] 5.7.0-rc1-00006-ga8d5875ce5f0b #1 Not tainted
    [ 32.849308] -----------------------------
    [ 32.849567] security/integrity/evm/evm_main.c:231 RCU-list traversed in non-reader section!!

    Since entries are only added to the list and never deleted, use
    list_for_each_entry_lockless() instead of list_for_each_entry_rcu for
    traversing the list. Also, add a relevant comment in evm_secfs.c to
    indicate this fact.

    Reported-by: kernel test robot
    Suggested-by: Paul E. McKenney
    Signed-off-by: Madhuparna Bhowmik
    Acked-by: Paul E. McKenney (RCU viewpoint)
    Signed-off-by: Mimi Zohar
    Signed-off-by: Sasha Levin

    Madhuparna Bhowmik
     

27 May, 2020

4 commits

  • [ Upstream commit 8433856947217ebb5697a8ff9c4c9cad4639a2cf ]

    The IS_ERR_OR_NULL() function has two conditions and if we got really
    unlucky we could hit a race where "ptr" started as an error pointer and
    then was set to NULL. Both conditions would be false even though the
    pointer at the end was NULL.

    This patch fixes the problem by ensuring that "*tfm" can only be NULL
    or valid. I have introduced a "tmp_tfm" variable to make that work. I
    also reversed a condition and pulled the code in one tab.

    Reported-by: Roberto Sassu
    Fixes: 53de3b080d5e ("evm: Check also if *tfm is an error pointer in init_desc()")
    Signed-off-by: Dan Carpenter
    Acked-by: Roberto Sassu
    Acked-by: Krzysztof Struczynski
    Signed-off-by: Mimi Zohar
    Signed-off-by: Sasha Levin

    Dan Carpenter
     
  • [ Upstream commit 2e3a34e9f409ebe83d1af7cd2f49fca7af97dfac ]

    This patch fixes the return value of ima_write_policy() when a new policy
    is directly passed to IMA and the current policy requires appraisal of the
    file containing the policy. Currently, if appraisal is not in ENFORCE mode,
    ima_write_policy() returns 0 and leads user space applications to an
    endless loop. Fix this issue by denying the operation regardless of the
    appraisal mode.

    Cc: stable@vger.kernel.org # 4.10.x
    Fixes: 19f8a84713edc ("ima: measure and appraise the IMA policy itself")
    Signed-off-by: Roberto Sassu
    Reviewed-by: Krzysztof Struczynski
    Signed-off-by: Mimi Zohar
    Signed-off-by: Sasha Levin

    Roberto Sassu
     
  • [ Upstream commit 53de3b080d5eae31d0de219617155dcc34e7d698 ]

    This patch avoids a kernel panic due to accessing an error pointer set by
    crypto_alloc_shash(). It occurs especially when there are many files that
    require an unsupported algorithm, as it would increase the likelihood of
    the following race condition:

    Task A: *tfm = crypto_alloc_shash()
    Signed-off-by: Krzysztof Struczynski
    Signed-off-by: Roberto Sassu
    Signed-off-by: Mimi Zohar
    Signed-off-by: Sasha Levin

    Roberto Sassu
     
  • [ Upstream commit 0014cc04e8ec077dc482f00c87dfd949cfe2b98f ]

    Commit a408e4a86b36 ("ima: open a new file instance if no read
    permissions") tries to create a new file descriptor to calculate a file
    digest if the file has not been opened with O_RDONLY flag. However, if a
    new file descriptor cannot be obtained, it sets the FMODE_READ flag to
    file->f_flags instead of file->f_mode.

    This patch fixes this issue by replacing f_flags with f_mode as it was
    before that commit.

    Cc: stable@vger.kernel.org # 4.20.x
    Fixes: a408e4a86b36 ("ima: open a new file instance if no read permissions")
    Signed-off-by: Roberto Sassu
    Reviewed-by: Goldwyn Rodrigues
    Signed-off-by: Mimi Zohar
    Signed-off-by: Sasha Levin

    Roberto Sassu
     

12 Mar, 2020

1 commit

  • [ Upstream commit 3be54d558c75562e42bc83d665df024bd79d399b ]

    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
    Signed-off-by: Sasha Levin

    Javier Martinez Canillas
     

05 Mar, 2020

1 commit

  • commit 483ec26eed42bf050931d9a5c5f9f0b5f2ad5f3b upstream.

    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
    Signed-off-by: Greg Kroah-Hartman

    Janne Karhunen
     

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
     

01 Aug, 2019

1 commit

  • IMA policy rules are walked sequentially. Depending on the ordering of
    the policy rules, the "template" field might be defined in one rule, but
    will be replaced by subsequent, applicable rules, even if the rule does
    not explicitly define the "template" field.

    This patch initializes the "template" once and only replaces the
    "template", when explicitly defined.

    Fixes: 19453ce0bcfb ("IMA: support for per policy rule template formats")
    Signed-off-by: Mimi Zohar

    Mimi Zohar
     

11 Jul, 2019

1 commit

  • …el/git/dhowells/linux-fs"

    This reverts merge 0f75ef6a9cff49ff612f7ce0578bced9d0b38325 (and thus
    effectively commits

    7a1ade847596 ("keys: Provide KEYCTL_GRANT_PERMISSION")
    2e12256b9a76 ("keys: Replace uid/gid/perm permissions checking with an ACL")

    that the merge brought in).

    It turns out that it breaks booting with an encrypted volume, and Eric
    biggers reports that it also breaks the fscrypt tests [1] and loading of
    in-kernel X.509 certificates [2].

    The root cause of all the breakage is likely the same, but David Howells
    is off email so rather than try to work it out it's getting reverted in
    order to not impact the rest of the merge window.

    [1] https://lore.kernel.org/lkml/20190710011559.GA7973@sol.localdomain/
    [2] https://lore.kernel.org/lkml/20190710013225.GB7973@sol.localdomain/

    Link: https://lore.kernel.org/lkml/CAHk-=wjxoeMJfeBahnWH=9zShKp2bsVy527vo3_y8HfOdhwAAw@mail.gmail.com/
    Reported-by: Eric Biggers <ebiggers@kernel.org>
    Cc: David Howells <dhowells@redhat.com>
    Cc: James Morris <jmorris@namei.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

    Linus Torvalds
     

09 Jul, 2019

3 commits

  • Pull integrity updates from Mimi Zohar:
    "Bug fixes, code clean up, and new features:

    - IMA policy rules can be defined in terms of LSM labels, making the
    IMA policy dependent on LSM policy label changes, in particular LSM
    label deletions. The new environment, in which IMA-appraisal is
    being used, frequently updates the LSM policy and permits LSM label
    deletions.

    - Prevent an mmap'ed shared file opened for write from also being
    mmap'ed execute. In the long term, making this and other similar
    changes at the VFS layer would be preferable.

    - The IMA per policy rule template format support is needed for a
    couple of new/proposed features (eg. kexec boot command line
    measurement, appended signatures, and VFS provided file hashes).

    - Other than the "boot-aggregate" record in the IMA measuremeent
    list, all other measurements are of file data. Measuring and
    storing the kexec boot command line in the IMA measurement list is
    the first buffer based measurement included in the measurement
    list"

    * 'next-integrity' of git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity:
    integrity: Introduce struct evm_xattr
    ima: Update MAX_TEMPLATE_NAME_LEN to fit largest reasonable definition
    KEXEC: Call ima_kexec_cmdline to measure the boot command line args
    IMA: Define a new template field buf
    IMA: Define a new hook to measure the kexec boot command line arguments
    IMA: support for per policy rule template formats
    integrity: Fix __integrity_init_keyring() section mismatch
    ima: Use designated initializers for struct ima_event_data
    ima: use the lsm policy update notifier
    LSM: switch to blocking policy update notifiers
    x86/ima: fix the Kconfig dependency for IMA_ARCH_POLICY
    ima: Make arch_policy_entry static
    ima: prevent a file already mmap'ed write to be mmap'ed execute
    x86/ima: check EFI SetupMode too

    Linus Torvalds
     
  • Pull keyring ACL support from David Howells:
    "This changes the permissions model used by keys and keyrings to be
    based on an internal ACL by the following means:

    - Replace the permissions mask internally with an ACL that contains a
    list of ACEs, each with a specific subject with a permissions mask.
    Potted default ACLs are available for new keys and keyrings.

    ACE subjects can be macroised to indicate the UID and GID specified
    on the key (which remain). Future commits will be able to add
    additional subject types, such as specific UIDs or domain
    tags/namespaces.

    Also split a number of permissions to give finer control. Examples
    include splitting the revocation permit from the change-attributes
    permit, thereby allowing someone to be granted permission to revoke
    a key without allowing them to change the owner; also the ability
    to join a keyring is split from the ability to link to it, thereby
    stopping a process accessing a keyring by joining it and thus
    acquiring use of possessor permits.

    - Provide a keyctl to allow the granting or denial of one or more
    permits to a specific subject. Direct access to the ACL is not
    granted, and the ACL cannot be viewed"

    * tag 'keys-acl-20190703' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs:
    keys: Provide KEYCTL_GRANT_PERMISSION
    keys: Replace uid/gid/perm permissions checking with an ACL

    Linus Torvalds
     
  • …/git/dhowells/linux-fs

    Pull keyring namespacing from David Howells:
    "These patches help make keys and keyrings more namespace aware.

    Firstly some miscellaneous patches to make the process easier:

    - Simplify key index_key handling so that the word-sized chunks
    assoc_array requires don't have to be shifted about, making it
    easier to add more bits into the key.

    - Cache the hash value in the key so that we don't have to calculate
    on every key we examine during a search (it involves a bunch of
    multiplications).

    - Allow keying_search() to search non-recursively.

    Then the main patches:

    - Make it so that keyring names are per-user_namespace from the point
    of view of KEYCTL_JOIN_SESSION_KEYRING so that they're not
    accessible cross-user_namespace.

    keyctl_capabilities() shows KEYCTL_CAPS1_NS_KEYRING_NAME for this.

    - Move the user and user-session keyrings to the user_namespace
    rather than the user_struct. This prevents them propagating
    directly across user_namespaces boundaries (ie. the KEY_SPEC_*
    flags will only pick from the current user_namespace).

    - Make it possible to include the target namespace in which the key
    shall operate in the index_key. This will allow the possibility of
    multiple keys with the same description, but different target
    domains to be held in the same keyring.

    keyctl_capabilities() shows KEYCTL_CAPS1_NS_KEY_TAG for this.

    - Make it so that keys are implicitly invalidated by removal of a
    domain tag, causing them to be garbage collected.

    - Institute a network namespace domain tag that allows keys to be
    differentiated by the network namespace in which they operate. New
    keys that are of a type marked 'KEY_TYPE_NET_DOMAIN' are assigned
    the network domain in force when they are created.

    - Make it so that the desired network namespace can be handed down
    into the request_key() mechanism. This allows AFS, NFS, etc. to
    request keys specific to the network namespace of the superblock.

    This also means that the keys in the DNS record cache are
    thenceforth namespaced, provided network filesystems pass the
    appropriate network namespace down into dns_query().

    For DNS, AFS and NFS are good, whilst CIFS and Ceph are not. Other
    cache keyrings, such as idmapper keyrings, also need to set the
    domain tag - for which they need access to the network namespace of
    the superblock"

    * tag 'keys-namespace-20190627' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs:
    keys: Pass the network namespace into request_key mechanism
    keys: Network namespace domain tag
    keys: Garbage collect keys for which the domain has been removed
    keys: Include target namespace in match criteria
    keys: Move the user and user-session keyrings to the user_namespace
    keys: Namespace keyring names
    keys: Add a 'recurse' flag for keyring searches
    keys: Cache the hash value to avoid lots of recalculation
    keys: Simplify key description management

    Linus Torvalds