security/integrity: Harden against malformed xattrs
In general the handling of IMA/EVM xattrs is good, but I found a few locations where either the xattr size or the value of the type field in the xattr are not checked. Add a few simple checks to these locations to prevent malformed or malicious xattrs from causing problems. Signed-off-by: Seth Forshee <seth.forshee@canonical.com> Signed-off-by: Mimi Zohar <zohar@linux.vnet.ibm.com>
This commit is contained in:
@@ -51,7 +51,7 @@ static bool init_keyring __initdata;
|
|||||||
int integrity_digsig_verify(const unsigned int id, const char *sig, int siglen,
|
int integrity_digsig_verify(const unsigned int id, const char *sig, int siglen,
|
||||||
const char *digest, int digestlen)
|
const char *digest, int digestlen)
|
||||||
{
|
{
|
||||||
if (id >= INTEGRITY_KEYRING_MAX)
|
if (id >= INTEGRITY_KEYRING_MAX || siglen < 2)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (!keyring[id]) {
|
if (!keyring[id]) {
|
||||||
|
|||||||
@@ -145,6 +145,10 @@ static enum integrity_status evm_verify_hmac(struct dentry *dentry,
|
|||||||
/* check value type */
|
/* check value type */
|
||||||
switch (xattr_data->type) {
|
switch (xattr_data->type) {
|
||||||
case EVM_XATTR_HMAC:
|
case EVM_XATTR_HMAC:
|
||||||
|
if (xattr_len != sizeof(struct evm_ima_xattr_data)) {
|
||||||
|
evm_status = INTEGRITY_FAIL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
rc = evm_calc_hmac(dentry, xattr_name, xattr_value,
|
rc = evm_calc_hmac(dentry, xattr_name, xattr_value,
|
||||||
xattr_value_len, calc.digest);
|
xattr_value_len, calc.digest);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
|||||||
@@ -130,6 +130,7 @@ enum hash_algo ima_get_hash_algo(struct evm_ima_xattr_data *xattr_value,
|
|||||||
int xattr_len)
|
int xattr_len)
|
||||||
{
|
{
|
||||||
struct signature_v2_hdr *sig;
|
struct signature_v2_hdr *sig;
|
||||||
|
enum hash_algo ret;
|
||||||
|
|
||||||
if (!xattr_value || xattr_len < 2)
|
if (!xattr_value || xattr_len < 2)
|
||||||
/* return default hash algo */
|
/* return default hash algo */
|
||||||
@@ -143,7 +144,9 @@ enum hash_algo ima_get_hash_algo(struct evm_ima_xattr_data *xattr_value,
|
|||||||
return sig->hash_algo;
|
return sig->hash_algo;
|
||||||
break;
|
break;
|
||||||
case IMA_XATTR_DIGEST_NG:
|
case IMA_XATTR_DIGEST_NG:
|
||||||
return xattr_value->digest[0];
|
ret = xattr_value->digest[0];
|
||||||
|
if (ret < HASH_ALGO__LAST)
|
||||||
|
return ret;
|
||||||
break;
|
break;
|
||||||
case IMA_XATTR_DIGEST:
|
case IMA_XATTR_DIGEST:
|
||||||
/* this is for backward compatibility */
|
/* this is for backward compatibility */
|
||||||
|
|||||||
Reference in New Issue
Block a user