Re: [PATCH v2] ipe: add errno field to IPE policy load auditing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Feb 27, 2025 at 2:46 PM Jasjiv Singh
<jasjivsingh@xxxxxxxxxxxxxxxxxxx> wrote:
>
> Thanks for reviewing it. Here's the example generated from real logs:
>
> AUDIT_IPE_POLICY_LOAD(1422):
> audit:  AUDIT1422 policy_name="Test_Policy" policy_version=0.0.1
> policy_digest =sha256:84EFBA8FA71E62AE0A537FAB962F8A2BD1053964C4
> 299DCA92BFFF4DB82E86D3 auid=1000 ses=3 lsm=ipe res=1 errno=0
>
> The above record shows a new policy has been successfully loaded into
> the kernel with the policy name, version, and hash with the errno=0.
>
> AUDIT_IPE_POLICY_LOAD(1422) with error:
>
> audit: AUDIT1422 policy_name=? policy_version=? policy_digest=?
> auid=1000 ses=3 lsm=ipe res=0 errno=-74
>
> The above record shows a policy load failure due to an invalid policy.
>
> I have updated the failure cases in new_policy() and update_policy(),
> which covers each case as well.
>
> Signed-off-by: Jasjiv Singh <jasjivsingh@xxxxxxxxxxxxxxxxxxx>

Please merge the old and new changes into one single patch. Also the
commit message is supposed to be used to describe the code change.

> ---
>  Documentation/admin-guide/LSM/ipe.rst |  2 ++
>  security/ipe/audit.c                  | 10 ++++------
>  security/ipe/fs.c                     | 17 ++++++++++++-----
>  security/ipe/policy.c                 |  4 +---
>  security/ipe/policy_fs.c              | 24 +++++++++++++++++++-----
>  5 files changed, 38 insertions(+), 19 deletions(-)
>
> diff --git a/Documentation/admin-guide/LSM/ipe.rst b/Documentation/admin-guide/LSM/ipe.rst
> index 2143165f48c9..5dbf54471fab 100644
> --- a/Documentation/admin-guide/LSM/ipe.rst
> +++ b/Documentation/admin-guide/LSM/ipe.rst
> @@ -453,6 +453,8 @@ Field descriptions:
>  | errno          | integer    | No        | The result of the policy error as follows:        |
>  |                |            |           |                                                   |
>  |                |            |           | +  0: no error                                    |
> +|                |            |           | +  -EPERM: Insufficient permission                |
> +|                |            |           | +  -EEXIST: Same name policy already deployed     |
>  |                |            |           | +  -EBADMSG: policy is invalid                    |
>  |                |            |           | +  -ENOMEM: out of memory (OOM)                   |
>  |                |            |           | +  -ERANGE: policy version number overflow        |
> diff --git a/security/ipe/audit.c b/security/ipe/audit.c
> index f810f7004498..8df307bb2bab 100644
> --- a/security/ipe/audit.c
> +++ b/security/ipe/audit.c
> @@ -21,7 +21,7 @@
>
>  #define AUDIT_POLICY_LOAD_FMT "policy_name=\"%s\" policy_version=%hu.%hu.%hu "\
>                               "policy_digest=" IPE_AUDIT_HASH_ALG ":"
> -#define AUDIT_POLICY_LOAD_NULL_FMT "policy_name=? policy_version=? "\
> +#define AUDIT_POLICY_LOAD_FAIL_FMT "policy_name=? policy_version=? "\
>                                    "policy_digest=?"
>  #define AUDIT_OLD_ACTIVE_POLICY_FMT "old_active_pol_name=\"%s\" "\
>                                     "old_active_pol_version=%hu.%hu.%hu "\
> @@ -255,9 +255,8 @@ void ipe_audit_policy_activation(const struct ipe_policy *const op,
>   */
>  void ipe_audit_policy_load(const struct ipe_policy *const p)
>  {
> -       int res = 0;
> -       int err = 0;
>         struct audit_buffer *ab;
> +       int err = 0;
>
>         ab = audit_log_start(audit_context(), GFP_KERNEL,
>                              AUDIT_IPE_POLICY_LOAD);
> @@ -266,15 +265,14 @@ void ipe_audit_policy_load(const struct ipe_policy *const p)
>
>         if (!IS_ERR(p)) {
>                 audit_policy(ab, AUDIT_POLICY_LOAD_FMT, p);
> -               res = 1;
>         } else {
> -               audit_log_format(ab, AUDIT_POLICY_LOAD_NULL_FMT);
> +               audit_log_format(ab, AUDIT_POLICY_LOAD_FAIL_FMT);
>                 err = PTR_ERR(p);
>         }
>
>         audit_log_format(ab, " auid=%u ses=%u lsm=ipe res=%d errno=%d",
>                          from_kuid(&init_user_ns, audit_get_loginuid(current)),
> -                        audit_get_sessionid(current), res, err);
> +                        audit_get_sessionid(current), !err, err);
>
>         audit_log_end(ab);
>  }
> diff --git a/security/ipe/fs.c b/security/ipe/fs.c
> index 5b6d19fb844a..40805b13ee2c 100644
> --- a/security/ipe/fs.c
> +++ b/security/ipe/fs.c
> @@ -141,12 +141,16 @@ static ssize_t new_policy(struct file *f, const char __user *data,
>         char *copy = NULL;
>         int rc = 0;
>
> -       if (!file_ns_capable(f, &init_user_ns, CAP_MAC_ADMIN))
> -               return -EPERM;
> +       if (!file_ns_capable(f, &init_user_ns, CAP_MAC_ADMIN)) {
> +               rc = -EPERM;
> +               goto out;
> +       }
>
>         copy = memdup_user_nul(data, len);
> -       if (IS_ERR(copy))
> -               return PTR_ERR(copy);
> +       if (IS_ERR(copy)) {
> +               rc = PTR_ERR(copy);
> +               goto out;
> +       }
>
>         p = ipe_new_policy(NULL, 0, copy, len);
>         if (IS_ERR(p)) {
> @@ -161,8 +165,11 @@ static ssize_t new_policy(struct file *f, const char __user *data,
>         ipe_audit_policy_load(p);
>
>  out:
> -       if (rc < 0)
> +       if (rc < 0) {
>                 ipe_free_policy(p);

> +               p = ERR_PTR(rc);
> +               ipe_audit_policy_load(p);

How about ipe_audit_policy_load(ERR_PTR(rc));

> +       }
>         kfree(copy);
>         return (rc < 0) ? rc : len;
>  }
> diff --git a/security/ipe/policy.c b/security/ipe/policy.c
> index 0f616e9fbe61..b628f696e32b 100644
> --- a/security/ipe/policy.c
> +++ b/security/ipe/policy.c
> @@ -202,9 +202,7 @@ struct ipe_policy *ipe_new_policy(const char *text, size_t textlen,
>         return new;
>  err:
>         ipe_free_policy(new);
> -       new = ERR_PTR(rc);
> -       ipe_audit_policy_load(new);
> -       return new;
> +       return ERR_PTR(rc);
>  }
>
>  /**
> diff --git a/security/ipe/policy_fs.c b/security/ipe/policy_fs.c
> index 3bcd8cbd09df..74f4e7288331 100644
> --- a/security/ipe/policy_fs.c
> +++ b/security/ipe/policy_fs.c
> @@ -12,6 +12,7 @@
>  #include "policy.h"
>  #include "eval.h"
>  #include "fs.h"
> +#include "audit.h"
>
>  #define MAX_VERSION_SIZE ARRAY_SIZE("65535.65535.65535")
>
> @@ -288,25 +289,38 @@ static ssize_t getactive(struct file *f, char __user *data,
>  static ssize_t update_policy(struct file *f, const char __user *data,
>                              size_t len, loff_t *offset)
>  {
> +       const struct ipe_policy *p = NULL;

This var can be avoided.

>         struct inode *root = NULL;
>         char *copy = NULL;
>         int rc = 0;
>
> -       if (!file_ns_capable(f, &init_user_ns, CAP_MAC_ADMIN))
> -               return -EPERM;
> +       if (!file_ns_capable(f, &init_user_ns, CAP_MAC_ADMIN)) {
> +               rc = -EPERM;
> +               goto out;
> +       }
>
>         copy = memdup_user(data, len);
> -       if (IS_ERR(copy))
> -               return PTR_ERR(copy);
> +       if (IS_ERR(copy)) {
> +               rc = PTR_ERR(copy);
> +               goto out;
> +       }
>
>         root = d_inode(f->f_path.dentry->d_parent);
>         inode_lock(root);
>         rc = ipe_update_policy(root, NULL, 0, copy, len);
> +       if (rc < 0) {
> +               inode_unlock(root);
> +               goto out;
> +       }

This part seems unnecessary.

>         inode_unlock(root);
>
> +out:
>         kfree(copy);
> -       if (rc)
> +       if (rc) {
> +               p = ERR_PTR(rc);
> +               ipe_audit_policy_load(p);

p can be avoided, see the above comments.

Also please update function documentation if it has a significant change.

-Fan





[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux