lkml.org 
[lkml]   [2018]   [Sep]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.18 155/235] evm: Dont deadlock if a crypto algorithm is unavailable
    Date
    4.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Matthew Garrett <mjg59@google.com>

    [ Upstream commit e2861fa71641c6414831d628a1f4f793b6562580 ]

    When EVM attempts to appraise a file signed with a crypto algorithm the
    kernel doesn't have support for, it will cause the kernel to trigger a
    module load. If the EVM policy includes appraisal of kernel modules this
    will in turn call back into EVM - since EVM is holding a lock until the
    crypto initialisation is complete, this triggers a deadlock. Add a
    CRYPTO_NOLOAD flag and skip module loading if it's set, and add that flag
    in the EVM case in order to fail gracefully with an error message
    instead of deadlocking.

    Signed-off-by: Matthew Garrett <mjg59@google.com>
    Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Mimi Zohar <zohar@linux.vnet.ibm.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    crypto/api.c | 2 +-
    include/linux/crypto.h | 5 +++++
    security/integrity/evm/evm_crypto.c | 3 ++-
    3 files changed, 8 insertions(+), 2 deletions(-)

    --- a/crypto/api.c
    +++ b/crypto/api.c
    @@ -229,7 +229,7 @@ static struct crypto_alg *crypto_larval_
    mask &= ~(CRYPTO_ALG_LARVAL | CRYPTO_ALG_DEAD);

    alg = crypto_alg_lookup(name, type, mask);
    - if (!alg) {
    + if (!alg && !(mask & CRYPTO_NOLOAD)) {
    request_module("crypto-%s", name);

    if (!((type ^ CRYPTO_ALG_NEED_FALLBACK) & mask &
    --- a/include/linux/crypto.h
    +++ b/include/linux/crypto.h
    @@ -113,6 +113,11 @@
    #define CRYPTO_ALG_OPTIONAL_KEY 0x00004000

    /*
    + * Don't trigger module loading
    + */
    +#define CRYPTO_NOLOAD 0x00008000
    +
    +/*
    * Transform masks and values (for crt_flags).
    */
    #define CRYPTO_TFM_NEED_KEY 0x00000001
    --- a/security/integrity/evm/evm_crypto.c
    +++ b/security/integrity/evm/evm_crypto.c
    @@ -97,7 +97,8 @@ static struct shash_desc *init_desc(char
    mutex_lock(&mutex);
    if (*tfm)
    goto out;
    - *tfm = crypto_alloc_shash(algo, 0, CRYPTO_ALG_ASYNC);
    + *tfm = crypto_alloc_shash(algo, 0,
    + CRYPTO_ALG_ASYNC | CRYPTO_NOLOAD);
    if (IS_ERR(*tfm)) {
    rc = PTR_ERR(*tfm);
    pr_err("Can not allocate %s (reason: %ld)\n", algo, rc);

    \
     
     \ /
      Last update: 2018-09-24 14:50    [W:4.110 / U:0.356 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site