userspace checking in passwd command

KaiGai Kohei kaigai at ak.jp.nec.com
Thu Oct 4 11:18:15 UTC 2007


Dan,

Now, I'm tracking the userspace extensions in passwd command
to port them into busybox.

check_selinux_access() is defined as an extension of passwd,
and it enables to confirm passwd:{passwd} permission when
root (uid==0) executes this commans.
However, there is a condition to bypass this checking.
I cannot make sure the meaning of the condition.

See the following implementation of the function.
---------------------------
    48  int
    49  check_selinux_access(const char *change_user, int change_uid, unsigned int access)
    50  {
    51          int status = -1;
    52          security_context_t user_context;
    53          const char *user;
    54
    55          if (security_getenforce() == 0) {
    56                  status = 0;
    57          } else {
    58                  if (getprevcon(&user_context) == 0) {
    59                          context_t c;
    60                          c = context_new(user_context);
    61                          user = context_user_get(c);
    62                          if (change_uid != 0 && strcmp(change_user, user) == 0) {
    63                                  status = 0;
    64                          } else {
    65                                  struct av_decision avd;
    66                                  int retval;
    67                                  retval = security_compute_av(user_context,
    68                                                               user_context,
    69                                                               SECCLASS_PASSWD,
    70                                                               access,
    71                                                               &avd);
    72                                  if ((retval == 0) &&
    73                                      ((access & avd.allowed) == access)) {
    74                                          status = 0;
    75                                  }
    76                          }
    77                          context_free(c);
    78                          freecon(user_context);
    79                  }
    80          }
    81          return status;
    82  }
---------------------------
In line 62, it compares the target uid and username, then checking
passwd:{passwd} is skipped when UID is non-privileged user and username
matched with user field in its security context.

Could you tell me the reason why such a checking is applied.
If it is not necessary, I think we can use checkPasswdAccess() instead.

Thanks,
-- 
OSS Platform Development Division, NEC
KaiGai Kohei <kaigai at ak.jp.nec.com>




More information about the fedora-selinux-list mailing list