[lkml]   [2021]   [Apr]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[PATCH v5 01/12] evm: Execute evm_inode_init_security() only when an HMAC key is loaded
    evm_inode_init_security() requires an HMAC key to calculate the HMAC on
    initial xattrs provided by LSMs. However, it checks generically whether a
    key has been loaded, including also public keys, which is not correct as
    public keys are not suitable to calculate the HMAC.

    Originally, support for signature verification was introduced to verify a
    possibly immutable initial ram disk, when no new files are created, and to
    switch to HMAC for the root filesystem. By that time, an HMAC key should
    have been loaded and usable to calculate HMACs for new files.

    More recently support for requiring an HMAC key was removed from the
    kernel, so that signature verification can be used alone. Since this is a
    legitimate use case, evm_inode_init_security() should not return an error
    when no HMAC key has been loaded.

    This patch fixes this problem by replacing the evm_key_loaded() check with
    a check of the EVM_INIT_HMAC flag in evm_initialized.

    Cc: # 4.5.x
    Fixes: 26ddabfe96b ("evm: enable EVM when X509 certificate is loaded")
    Signed-off-by: Roberto Sassu <>
    Reviewed-by: Mimi Zohar <>
    security/integrity/evm/evm_main.c | 5 +++--
    1 file changed, 3 insertions(+), 2 deletions(-)

    diff --git a/security/integrity/evm/evm_main.c b/security/integrity/evm/evm_main.c
    index 0de367aaa2d3..7ac5204c8d1f 100644
    --- a/security/integrity/evm/evm_main.c
    +++ b/security/integrity/evm/evm_main.c
    @@ -521,7 +521,7 @@ void evm_inode_post_setattr(struct dentry *dentry, int ia_valid)

    - * evm_inode_init_security - initializes security.evm
    + * evm_inode_init_security - initializes security.evm HMAC value
    int evm_inode_init_security(struct inode *inode,
    const struct xattr *lsm_xattr,
    @@ -530,7 +530,8 @@ int evm_inode_init_security(struct inode *inode,
    struct evm_xattr *xattr_data;
    int rc;

    - if (!evm_key_loaded() || !evm_protected_xattr(lsm_xattr->name))
    + if (!(evm_initialized & EVM_INIT_HMAC) ||
    + !evm_protected_xattr(lsm_xattr->name))
    return 0;

    xattr_data = kzalloc(sizeof(*xattr_data), GFP_NOFS);
     \ /
      Last update: 2021-04-07 12:53    [W:2.067 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site