linux/kernel/cred.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/* Task credentials management - see Documentation/security/credentials.rst
   3 *
   4 * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved.
   5 * Written by David Howells (dhowells@redhat.com)
   6 */
   7#include <linux/export.h>
   8#include <linux/cred.h>
   9#include <linux/slab.h>
  10#include <linux/sched.h>
  11#include <linux/sched/coredump.h>
  12#include <linux/key.h>
  13#include <linux/keyctl.h>
  14#include <linux/init_task.h>
  15#include <linux/security.h>
  16#include <linux/binfmts.h>
  17#include <linux/cn_proc.h>
  18#include <linux/uidgid.h>
  19
  20#if 0
  21#define kdebug(FMT, ...)                                                \
  22        printk("[%-5.5s%5u] " FMT "\n",                                 \
  23               current->comm, current->pid, ##__VA_ARGS__)
  24#else
  25#define kdebug(FMT, ...)                                                \
  26do {                                                                    \
  27        if (0)                                                          \
  28                no_printk("[%-5.5s%5u] " FMT "\n",                      \
  29                          current->comm, current->pid, ##__VA_ARGS__);  \
  30} while (0)
  31#endif
  32
  33static struct kmem_cache *cred_jar;
  34
  35/* init to 2 - one for init_task, one to ensure it is never freed */
  36static struct group_info init_groups = { .usage = ATOMIC_INIT(2) };
  37
  38/*
  39 * The initial credentials for the initial task
  40 */
  41struct cred init_cred = {
  42        .usage                  = ATOMIC_INIT(4),
  43#ifdef CONFIG_DEBUG_CREDENTIALS
  44        .subscribers            = ATOMIC_INIT(2),
  45        .magic                  = CRED_MAGIC,
  46#endif
  47        .uid                    = GLOBAL_ROOT_UID,
  48        .gid                    = GLOBAL_ROOT_GID,
  49        .suid                   = GLOBAL_ROOT_UID,
  50        .sgid                   = GLOBAL_ROOT_GID,
  51        .euid                   = GLOBAL_ROOT_UID,
  52        .egid                   = GLOBAL_ROOT_GID,
  53        .fsuid                  = GLOBAL_ROOT_UID,
  54        .fsgid                  = GLOBAL_ROOT_GID,
  55        .securebits             = SECUREBITS_DEFAULT,
  56        .cap_inheritable        = CAP_EMPTY_SET,
  57        .cap_permitted          = CAP_FULL_SET,
  58        .cap_effective          = CAP_FULL_SET,
  59        .cap_bset               = CAP_FULL_SET,
  60        .user                   = INIT_USER,
  61        .user_ns                = &init_user_ns,
  62        .group_info             = &init_groups,
  63        .ucounts                = &init_ucounts,
  64};
  65
  66static inline void set_cred_subscribers(struct cred *cred, int n)
  67{
  68#ifdef CONFIG_DEBUG_CREDENTIALS
  69        atomic_set(&cred->subscribers, n);
  70#endif
  71}
  72
  73static inline int read_cred_subscribers(const struct cred *cred)
  74{
  75#ifdef CONFIG_DEBUG_CREDENTIALS
  76        return atomic_read(&cred->subscribers);
  77#else
  78        return 0;
  79#endif
  80}
  81
  82static inline void alter_cred_subscribers(const struct cred *_cred, int n)
  83{
  84#ifdef CONFIG_DEBUG_CREDENTIALS
  85        struct cred *cred = (struct cred *) _cred;
  86
  87        atomic_add(n, &cred->subscribers);
  88#endif
  89}
  90
  91/*
  92 * The RCU callback to actually dispose of a set of credentials
  93 */
  94static void put_cred_rcu(struct rcu_head *rcu)
  95{
  96        struct cred *cred = container_of(rcu, struct cred, rcu);
  97
  98        kdebug("put_cred_rcu(%p)", cred);
  99
 100#ifdef CONFIG_DEBUG_CREDENTIALS
 101        if (cred->magic != CRED_MAGIC_DEAD ||
 102            atomic_read(&cred->usage) != 0 ||
 103            read_cred_subscribers(cred) != 0)
 104                panic("CRED: put_cred_rcu() sees %p with"
 105                      " mag %x, put %p, usage %d, subscr %d\n",
 106                      cred, cred->magic, cred->put_addr,
 107                      atomic_read(&cred->usage),
 108                      read_cred_subscribers(cred));
 109#else
 110        if (atomic_read(&cred->usage) != 0)
 111                panic("CRED: put_cred_rcu() sees %p with usage %d\n",
 112                      cred, atomic_read(&cred->usage));
 113#endif
 114
 115        security_cred_free(cred);
 116        key_put(cred->session_keyring);
 117        key_put(cred->process_keyring);
 118        key_put(cred->thread_keyring);
 119        key_put(cred->request_key_auth);
 120        if (cred->group_info)
 121                put_group_info(cred->group_info);
 122        free_uid(cred->user);
 123        if (cred->ucounts)
 124                put_ucounts(cred->ucounts);
 125        put_user_ns(cred->user_ns);
 126        kmem_cache_free(cred_jar, cred);
 127}
 128
 129/**
 130 * __put_cred - Destroy a set of credentials
 131 * @cred: The record to release
 132 *
 133 * Destroy a set of credentials on which no references remain.
 134 */
 135void __put_cred(struct cred *cred)
 136{
 137        kdebug("__put_cred(%p{%d,%d})", cred,
 138               atomic_read(&cred->usage),
 139               read_cred_subscribers(cred));
 140
 141        BUG_ON(atomic_read(&cred->usage) != 0);
 142#ifdef CONFIG_DEBUG_CREDENTIALS
 143        BUG_ON(read_cred_subscribers(cred) != 0);
 144        cred->magic = CRED_MAGIC_DEAD;
 145        cred->put_addr = __builtin_return_address(0);
 146#endif
 147        BUG_ON(cred == current->cred);
 148        BUG_ON(cred == current->real_cred);
 149
 150        if (cred->non_rcu)
 151                put_cred_rcu(&cred->rcu);
 152        else
 153                call_rcu(&cred->rcu, put_cred_rcu);
 154}
 155EXPORT_SYMBOL(__put_cred);
 156
 157/*
 158 * Clean up a task's credentials when it exits
 159 */
 160void exit_creds(struct task_struct *tsk)
 161{
 162        struct cred *cred;
 163
 164        kdebug("exit_creds(%u,%p,%p,{%d,%d})", tsk->pid, tsk->real_cred, tsk->cred,
 165               atomic_read(&tsk->cred->usage),
 166               read_cred_subscribers(tsk->cred));
 167
 168        cred = (struct cred *) tsk->real_cred;
 169        tsk->real_cred = NULL;
 170        validate_creds(cred);
 171        alter_cred_subscribers(cred, -1);
 172        put_cred(cred);
 173
 174        cred = (struct cred *) tsk->cred;
 175        tsk->cred = NULL;
 176        validate_creds(cred);
 177        alter_cred_subscribers(cred, -1);
 178        put_cred(cred);
 179
 180#ifdef CONFIG_KEYS_REQUEST_CACHE
 181        key_put(tsk->cached_requested_key);
 182        tsk->cached_requested_key = NULL;
 183#endif
 184}
 185
 186/**
 187 * get_task_cred - Get another task's objective credentials
 188 * @task: The task to query
 189 *
 190 * Get the objective credentials of a task, pinning them so that they can't go
 191 * away.  Accessing a task's credentials directly is not permitted.
 192 *
 193 * The caller must also make sure task doesn't get deleted, either by holding a
 194 * ref on task or by holding tasklist_lock to prevent it from being unlinked.
 195 */
 196const struct cred *get_task_cred(struct task_struct *task)
 197{
 198        const struct cred *cred;
 199
 200        rcu_read_lock();
 201
 202        do {
 203                cred = __task_cred((task));
 204                BUG_ON(!cred);
 205        } while (!get_cred_rcu(cred));
 206
 207        rcu_read_unlock();
 208        return cred;
 209}
 210EXPORT_SYMBOL(get_task_cred);
 211
 212/*
 213 * Allocate blank credentials, such that the credentials can be filled in at a
 214 * later date without risk of ENOMEM.
 215 */
 216struct cred *cred_alloc_blank(void)
 217{
 218        struct cred *new;
 219
 220        new = kmem_cache_zalloc(cred_jar, GFP_KERNEL);
 221        if (!new)
 222                return NULL;
 223
 224        atomic_set(&new->usage, 1);
 225#ifdef CONFIG_DEBUG_CREDENTIALS
 226        new->magic = CRED_MAGIC;
 227#endif
 228        new->ucounts = get_ucounts(&init_ucounts);
 229
 230        if (security_cred_alloc_blank(new, GFP_KERNEL_ACCOUNT) < 0)
 231                goto error;
 232
 233        return new;
 234
 235error:
 236        abort_creds(new);
 237        return NULL;
 238}
 239
 240/**
 241 * prepare_creds - Prepare a new set of credentials for modification
 242 *
 243 * Prepare a new set of task credentials for modification.  A task's creds
 244 * shouldn't generally be modified directly, therefore this function is used to
 245 * prepare a new copy, which the caller then modifies and then commits by
 246 * calling commit_creds().
 247 *
 248 * Preparation involves making a copy of the objective creds for modification.
 249 *
 250 * Returns a pointer to the new creds-to-be if successful, NULL otherwise.
 251 *
 252 * Call commit_creds() or abort_creds() to clean up.
 253 */
 254struct cred *prepare_creds(void)
 255{
 256        struct task_struct *task = current;
 257        const struct cred *old;
 258        struct cred *new;
 259
 260        validate_process_creds();
 261
 262        new = kmem_cache_alloc(cred_jar, GFP_KERNEL);
 263        if (!new)
 264                return NULL;
 265
 266        kdebug("prepare_creds() alloc %p", new);
 267
 268        old = task->cred;
 269        memcpy(new, old, sizeof(struct cred));
 270
 271        new->non_rcu = 0;
 272        atomic_set(&new->usage, 1);
 273        set_cred_subscribers(new, 0);
 274        get_group_info(new->group_info);
 275        get_uid(new->user);
 276        get_user_ns(new->user_ns);
 277
 278#ifdef CONFIG_KEYS
 279        key_get(new->session_keyring);
 280        key_get(new->process_keyring);
 281        key_get(new->thread_keyring);
 282        key_get(new->request_key_auth);
 283#endif
 284
 285#ifdef CONFIG_SECURITY
 286        new->security = NULL;
 287#endif
 288
 289        new->ucounts = get_ucounts(new->ucounts);
 290        if (!new->ucounts)
 291                goto error;
 292
 293        if (security_prepare_creds(new, old, GFP_KERNEL_ACCOUNT) < 0)
 294                goto error;
 295
 296        validate_creds(new);
 297        return new;
 298
 299error:
 300        abort_creds(new);
 301        return NULL;
 302}
 303EXPORT_SYMBOL(prepare_creds);
 304
 305/*
 306 * Prepare credentials for current to perform an execve()
 307 * - The caller must hold ->cred_guard_mutex
 308 */
 309struct cred *prepare_exec_creds(void)
 310{
 311        struct cred *new;
 312
 313        new = prepare_creds();
 314        if (!new)
 315                return new;
 316
 317#ifdef CONFIG_KEYS
 318        /* newly exec'd tasks don't get a thread keyring */
 319        key_put(new->thread_keyring);
 320        new->thread_keyring = NULL;
 321
 322        /* inherit the session keyring; new process keyring */
 323        key_put(new->process_keyring);
 324        new->process_keyring = NULL;
 325#endif
 326
 327        new->suid = new->fsuid = new->euid;
 328        new->sgid = new->fsgid = new->egid;
 329
 330        return new;
 331}
 332
 333/*
 334 * Copy credentials for the new process created by fork()
 335 *
 336 * We share if we can, but under some circumstances we have to generate a new
 337 * set.
 338 *
 339 * The new process gets the current process's subjective credentials as its
 340 * objective and subjective credentials
 341 */
 342int copy_creds(struct task_struct *p, unsigned long clone_flags)
 343{
 344        struct cred *new;
 345        int ret;
 346
 347#ifdef CONFIG_KEYS_REQUEST_CACHE
 348        p->cached_requested_key = NULL;
 349#endif
 350
 351        if (
 352#ifdef CONFIG_KEYS
 353                !p->cred->thread_keyring &&
 354#endif
 355                clone_flags & CLONE_THREAD
 356            ) {
 357                p->real_cred = get_cred(p->cred);
 358                get_cred(p->cred);
 359                alter_cred_subscribers(p->cred, 2);
 360                kdebug("share_creds(%p{%d,%d})",
 361                       p->cred, atomic_read(&p->cred->usage),
 362                       read_cred_subscribers(p->cred));
 363                inc_rlimit_ucounts(task_ucounts(p), UCOUNT_RLIMIT_NPROC, 1);
 364                return 0;
 365        }
 366
 367        new = prepare_creds();
 368        if (!new)
 369                return -ENOMEM;
 370
 371        if (clone_flags & CLONE_NEWUSER) {
 372                ret = create_user_ns(new);
 373                if (ret < 0)
 374                        goto error_put;
 375                ret = set_cred_ucounts(new);
 376                if (ret < 0)
 377                        goto error_put;
 378        }
 379
 380#ifdef CONFIG_KEYS
 381        /* new threads get their own thread keyrings if their parent already
 382         * had one */
 383        if (new->thread_keyring) {
 384                key_put(new->thread_keyring);
 385                new->thread_keyring = NULL;
 386                if (clone_flags & CLONE_THREAD)
 387                        install_thread_keyring_to_cred(new);
 388        }
 389
 390        /* The process keyring is only shared between the threads in a process;
 391         * anything outside of those threads doesn't inherit.
 392         */
 393        if (!(clone_flags & CLONE_THREAD)) {
 394                key_put(new->process_keyring);
 395                new->process_keyring = NULL;
 396        }
 397#endif
 398
 399        p->cred = p->real_cred = get_cred(new);
 400        inc_rlimit_ucounts(task_ucounts(p), UCOUNT_RLIMIT_NPROC, 1);
 401        alter_cred_subscribers(new, 2);
 402        validate_creds(new);
 403        return 0;
 404
 405error_put:
 406        put_cred(new);
 407        return ret;
 408}
 409
 410static bool cred_cap_issubset(const struct cred *set, const struct cred *subset)
 411{
 412        const struct user_namespace *set_ns = set->user_ns;
 413        const struct user_namespace *subset_ns = subset->user_ns;
 414
 415        /* If the two credentials are in the same user namespace see if
 416         * the capabilities of subset are a subset of set.
 417         */
 418        if (set_ns == subset_ns)
 419                return cap_issubset(subset->cap_permitted, set->cap_permitted);
 420
 421        /* The credentials are in a different user namespaces
 422         * therefore one is a subset of the other only if a set is an
 423         * ancestor of subset and set->euid is owner of subset or one
 424         * of subsets ancestors.
 425         */
 426        for (;subset_ns != &init_user_ns; subset_ns = subset_ns->parent) {
 427                if ((set_ns == subset_ns->parent)  &&
 428                    uid_eq(subset_ns->owner, set->euid))
 429                        return true;
 430        }
 431
 432        return false;
 433}
 434
 435/**
 436 * commit_creds - Install new credentials upon the current task
 437 * @new: The credentials to be assigned
 438 *
 439 * Install a new set of credentials to the current task, using RCU to replace
 440 * the old set.  Both the objective and the subjective credentials pointers are
 441 * updated.  This function may not be called if the subjective credentials are
 442 * in an overridden state.
 443 *
 444 * This function eats the caller's reference to the new credentials.
 445 *
 446 * Always returns 0 thus allowing this function to be tail-called at the end
 447 * of, say, sys_setgid().
 448 */
 449int commit_creds(struct cred *new)
 450{
 451        struct task_struct *task = current;
 452        const struct cred *old = task->real_cred;
 453
 454        kdebug("commit_creds(%p{%d,%d})", new,
 455               atomic_read(&new->usage),
 456               read_cred_subscribers(new));
 457
 458        BUG_ON(task->cred != old);
 459#ifdef CONFIG_DEBUG_CREDENTIALS
 460        BUG_ON(read_cred_subscribers(old) < 2);
 461        validate_creds(old);
 462        validate_creds(new);
 463#endif
 464        BUG_ON(atomic_read(&new->usage) < 1);
 465
 466        get_cred(new); /* we will require a ref for the subj creds too */
 467
 468        /* dumpability changes */
 469        if (!uid_eq(old->euid, new->euid) ||
 470            !gid_eq(old->egid, new->egid) ||
 471            !uid_eq(old->fsuid, new->fsuid) ||
 472            !gid_eq(old->fsgid, new->fsgid) ||
 473            !cred_cap_issubset(old, new)) {
 474                if (task->mm)
 475                        set_dumpable(task->mm, suid_dumpable);
 476                task->pdeath_signal = 0;
 477                /*
 478                 * If a task drops privileges and becomes nondumpable,
 479                 * the dumpability change must become visible before
 480                 * the credential change; otherwise, a __ptrace_may_access()
 481                 * racing with this change may be able to attach to a task it
 482                 * shouldn't be able to attach to (as if the task had dropped
 483                 * privileges without becoming nondumpable).
 484                 * Pairs with a read barrier in __ptrace_may_access().
 485                 */
 486                smp_wmb();
 487        }
 488
 489        /* alter the thread keyring */
 490        if (!uid_eq(new->fsuid, old->fsuid))
 491                key_fsuid_changed(new);
 492        if (!gid_eq(new->fsgid, old->fsgid))
 493                key_fsgid_changed(new);
 494
 495        /* do it
 496         * RLIMIT_NPROC limits on user->processes have already been checked
 497         * in set_user().
 498         */
 499        alter_cred_subscribers(new, 2);
 500        if (new->user != old->user || new->user_ns != old->user_ns)
 501                inc_rlimit_ucounts(new->ucounts, UCOUNT_RLIMIT_NPROC, 1);
 502        rcu_assign_pointer(task->real_cred, new);
 503        rcu_assign_pointer(task->cred, new);
 504        if (new->user != old->user)
 505                dec_rlimit_ucounts(old->ucounts, UCOUNT_RLIMIT_NPROC, 1);
 506        alter_cred_subscribers(old, -2);
 507
 508        /* send notifications */
 509        if (!uid_eq(new->uid,   old->uid)  ||
 510            !uid_eq(new->euid,  old->euid) ||
 511            !uid_eq(new->suid,  old->suid) ||
 512            !uid_eq(new->fsuid, old->fsuid))
 513                proc_id_connector(task, PROC_EVENT_UID);
 514
 515        if (!gid_eq(new->gid,   old->gid)  ||
 516            !gid_eq(new->egid,  old->egid) ||
 517            !gid_eq(new->sgid,  old->sgid) ||
 518            !gid_eq(new->fsgid, old->fsgid))
 519                proc_id_connector(task, PROC_EVENT_GID);
 520
 521        /* release the old obj and subj refs both */
 522        put_cred(old);
 523        put_cred(old);
 524        return 0;
 525}
 526EXPORT_SYMBOL(commit_creds);
 527
 528/**
 529 * abort_creds - Discard a set of credentials and unlock the current task
 530 * @new: The credentials that were going to be applied
 531 *
 532 * Discard a set of credentials that were under construction and unlock the
 533 * current task.
 534 */
 535void abort_creds(struct cred *new)
 536{
 537        kdebug("abort_creds(%p{%d,%d})", new,
 538               atomic_read(&new->usage),
 539               read_cred_subscribers(new));
 540
 541#ifdef CONFIG_DEBUG_CREDENTIALS
 542        BUG_ON(read_cred_subscribers(new) != 0);
 543#endif
 544        BUG_ON(atomic_read(&new->usage) < 1);
 545        put_cred(new);
 546}
 547EXPORT_SYMBOL(abort_creds);
 548
 549/**
 550 * override_creds - Override the current process's subjective credentials
 551 * @new: The credentials to be assigned
 552 *
 553 * Install a set of temporary override subjective credentials on the current
 554 * process, returning the old set for later reversion.
 555 */
 556const struct cred *override_creds(const struct cred *new)
 557{
 558        const struct cred *old = current->cred;
 559
 560        kdebug("override_creds(%p{%d,%d})", new,
 561               atomic_read(&new->usage),
 562               read_cred_subscribers(new));
 563
 564        validate_creds(old);
 565        validate_creds(new);
 566
 567        /*
 568         * NOTE! This uses 'get_new_cred()' rather than 'get_cred()'.
 569         *
 570         * That means that we do not clear the 'non_rcu' flag, since
 571         * we are only installing the cred into the thread-synchronous
 572         * '->cred' pointer, not the '->real_cred' pointer that is
 573         * visible to other threads under RCU.
 574         *
 575         * Also note that we did validate_creds() manually, not depending
 576         * on the validation in 'get_cred()'.
 577         */
 578        get_new_cred((struct cred *)new);
 579        alter_cred_subscribers(new, 1);
 580        rcu_assign_pointer(current->cred, new);
 581        alter_cred_subscribers(old, -1);
 582
 583        kdebug("override_creds() = %p{%d,%d}", old,
 584               atomic_read(&old->usage),
 585               read_cred_subscribers(old));
 586        return old;
 587}
 588EXPORT_SYMBOL(override_creds);
 589
 590/**
 591 * revert_creds - Revert a temporary subjective credentials override
 592 * @old: The credentials to be restored
 593 *
 594 * Revert a temporary set of override subjective credentials to an old set,
 595 * discarding the override set.
 596 */
 597void revert_creds(const struct cred *old)
 598{
 599        const struct cred *override = current->cred;
 600
 601        kdebug("revert_creds(%p{%d,%d})", old,
 602               atomic_read(&old->usage),
 603               read_cred_subscribers(old));
 604
 605        validate_creds(old);
 606        validate_creds(override);
 607        alter_cred_subscribers(old, 1);
 608        rcu_assign_pointer(current->cred, old);
 609        alter_cred_subscribers(override, -1);
 610        put_cred(override);
 611}
 612EXPORT_SYMBOL(revert_creds);
 613
 614/**
 615 * cred_fscmp - Compare two credentials with respect to filesystem access.
 616 * @a: The first credential
 617 * @b: The second credential
 618 *
 619 * cred_cmp() will return zero if both credentials have the same
 620 * fsuid, fsgid, and supplementary groups.  That is, if they will both
 621 * provide the same access to files based on mode/uid/gid.
 622 * If the credentials are different, then either -1 or 1 will
 623 * be returned depending on whether @a comes before or after @b
 624 * respectively in an arbitrary, but stable, ordering of credentials.
 625 *
 626 * Return: -1, 0, or 1 depending on comparison
 627 */
 628int cred_fscmp(const struct cred *a, const struct cred *b)
 629{
 630        struct group_info *ga, *gb;
 631        int g;
 632
 633        if (a == b)
 634                return 0;
 635        if (uid_lt(a->fsuid, b->fsuid))
 636                return -1;
 637        if (uid_gt(a->fsuid, b->fsuid))
 638                return 1;
 639
 640        if (gid_lt(a->fsgid, b->fsgid))
 641                return -1;
 642        if (gid_gt(a->fsgid, b->fsgid))
 643                return 1;
 644
 645        ga = a->group_info;
 646        gb = b->group_info;
 647        if (ga == gb)
 648                return 0;
 649        if (ga == NULL)
 650                return -1;
 651        if (gb == NULL)
 652                return 1;
 653        if (ga->ngroups < gb->ngroups)
 654                return -1;
 655        if (ga->ngroups > gb->ngroups)
 656                return 1;
 657
 658        for (g = 0; g < ga->ngroups; g++) {
 659                if (gid_lt(ga->gid[g], gb->gid[g]))
 660                        return -1;
 661                if (gid_gt(ga->gid[g], gb->gid[g]))
 662                        return 1;
 663        }
 664        return 0;
 665}
 666EXPORT_SYMBOL(cred_fscmp);
 667
 668int set_cred_ucounts(struct cred *new)
 669{
 670        struct task_struct *task = current;
 671        const struct cred *old = task->real_cred;
 672        struct ucounts *old_ucounts = new->ucounts;
 673
 674        if (new->user == old->user && new->user_ns == old->user_ns)
 675                return 0;
 676
 677        /*
 678         * This optimization is needed because alloc_ucounts() uses locks
 679         * for table lookups.
 680         */
 681        if (old_ucounts && old_ucounts->ns == new->user_ns && uid_eq(old_ucounts->uid, new->euid))
 682                return 0;
 683
 684        if (!(new->ucounts = alloc_ucounts(new->user_ns, new->euid)))
 685                return -EAGAIN;
 686
 687        if (old_ucounts)
 688                put_ucounts(old_ucounts);
 689
 690        return 0;
 691}
 692
 693/*
 694 * initialise the credentials stuff
 695 */
 696void __init cred_init(void)
 697{
 698        /* allocate a slab in which we can store credentials */
 699        cred_jar = kmem_cache_create("cred_jar", sizeof(struct cred), 0,
 700                        SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_ACCOUNT, NULL);
 701}
 702
 703/**
 704 * prepare_kernel_cred - Prepare a set of credentials for a kernel service
 705 * @daemon: A userspace daemon to be used as a reference
 706 *
 707 * Prepare a set of credentials for a kernel service.  This can then be used to
 708 * override a task's own credentials so that work can be done on behalf of that
 709 * task that requires a different subjective context.
 710 *
 711 * @daemon is used to provide a base for the security record, but can be NULL.
 712 * If @daemon is supplied, then the security data will be derived from that;
 713 * otherwise they'll be set to 0 and no groups, full capabilities and no keys.
 714 *
 715 * The caller may change these controls afterwards if desired.
 716 *
 717 * Returns the new credentials or NULL if out of memory.
 718 */
 719struct cred *prepare_kernel_cred(struct task_struct *daemon)
 720{
 721        const struct cred *old;
 722        struct cred *new;
 723
 724        new = kmem_cache_alloc(cred_jar, GFP_KERNEL);
 725        if (!new)
 726                return NULL;
 727
 728        kdebug("prepare_kernel_cred() alloc %p", new);
 729
 730        if (daemon)
 731                old = get_task_cred(daemon);
 732        else
 733                old = get_cred(&init_cred);
 734
 735        validate_creds(old);
 736
 737        *new = *old;
 738        new->non_rcu = 0;
 739        atomic_set(&new->usage, 1);
 740        set_cred_subscribers(new, 0);
 741        get_uid(new->user);
 742        get_user_ns(new->user_ns);
 743        get_group_info(new->group_info);
 744
 745#ifdef CONFIG_KEYS
 746        new->session_keyring = NULL;
 747        new->process_keyring = NULL;
 748        new->thread_keyring = NULL;
 749        new->request_key_auth = NULL;
 750        new->jit_keyring = KEY_REQKEY_DEFL_THREAD_KEYRING;
 751#endif
 752
 753#ifdef CONFIG_SECURITY
 754        new->security = NULL;
 755#endif
 756        new->ucounts = get_ucounts(new->ucounts);
 757        if (!new->ucounts)
 758                goto error;
 759
 760        if (security_prepare_creds(new, old, GFP_KERNEL_ACCOUNT) < 0)
 761                goto error;
 762
 763        put_cred(old);
 764        validate_creds(new);
 765        return new;
 766
 767error:
 768        put_cred(new);
 769        put_cred(old);
 770        return NULL;
 771}
 772EXPORT_SYMBOL(prepare_kernel_cred);
 773
 774/**
 775 * set_security_override - Set the security ID in a set of credentials
 776 * @new: The credentials to alter
 777 * @secid: The LSM security ID to set
 778 *
 779 * Set the LSM security ID in a set of credentials so that the subjective
 780 * security is overridden when an alternative set of credentials is used.
 781 */
 782int set_security_override(struct cred *new, u32 secid)
 783{
 784        return security_kernel_act_as(new, secid);
 785}
 786EXPORT_SYMBOL(set_security_override);
 787
 788/**
 789 * set_security_override_from_ctx - Set the security ID in a set of credentials
 790 * @new: The credentials to alter
 791 * @secctx: The LSM security context to generate the security ID from.
 792 *
 793 * Set the LSM security ID in a set of credentials so that the subjective
 794 * security is overridden when an alternative set of credentials is used.  The
 795 * security ID is specified in string form as a security context to be
 796 * interpreted by the LSM.
 797 */
 798int set_security_override_from_ctx(struct cred *new, const char *secctx)
 799{
 800        u32 secid;
 801        int ret;
 802
 803        ret = security_secctx_to_secid(secctx, strlen(secctx), &secid);
 804        if (ret < 0)
 805                return ret;
 806
 807        return set_security_override(new, secid);
 808}
 809EXPORT_SYMBOL(set_security_override_from_ctx);
 810
 811/**
 812 * set_create_files_as - Set the LSM file create context in a set of credentials
 813 * @new: The credentials to alter
 814 * @inode: The inode to take the context from
 815 *
 816 * Change the LSM file creation context in a set of credentials to be the same
 817 * as the object context of the specified inode, so that the new inodes have
 818 * the same MAC context as that inode.
 819 */
 820int set_create_files_as(struct cred *new, struct inode *inode)
 821{
 822        if (!uid_valid(inode->i_uid) || !gid_valid(inode->i_gid))
 823                return -EINVAL;
 824        new->fsuid = inode->i_uid;
 825        new->fsgid = inode->i_gid;
 826        return security_kernel_create_files_as(new, inode);
 827}
 828EXPORT_SYMBOL(set_create_files_as);
 829
 830#ifdef CONFIG_DEBUG_CREDENTIALS
 831
 832bool creds_are_invalid(const struct cred *cred)
 833{
 834        if (cred->magic != CRED_MAGIC)
 835                return true;
 836        return false;
 837}
 838EXPORT_SYMBOL(creds_are_invalid);
 839
 840/*
 841 * dump invalid credentials
 842 */
 843static void dump_invalid_creds(const struct cred *cred, const char *label,
 844                               const struct task_struct *tsk)
 845{
 846        printk(KERN_ERR "CRED: %s credentials: %p %s%s%s\n",
 847               label, cred,
 848               cred == &init_cred ? "[init]" : "",
 849               cred == tsk->real_cred ? "[real]" : "",
 850               cred == tsk->cred ? "[eff]" : "");
 851        printk(KERN_ERR "CRED: ->magic=%x, put_addr=%p\n",
 852               cred->magic, cred->put_addr);
 853        printk(KERN_ERR "CRED: ->usage=%d, subscr=%d\n",
 854               atomic_read(&cred->usage),
 855               read_cred_subscribers(cred));
 856        printk(KERN_ERR "CRED: ->*uid = { %d,%d,%d,%d }\n",
 857                from_kuid_munged(&init_user_ns, cred->uid),
 858                from_kuid_munged(&init_user_ns, cred->euid),
 859                from_kuid_munged(&init_user_ns, cred->suid),
 860                from_kuid_munged(&init_user_ns, cred->fsuid));
 861        printk(KERN_ERR "CRED: ->*gid = { %d,%d,%d,%d }\n",
 862                from_kgid_munged(&init_user_ns, cred->gid),
 863                from_kgid_munged(&init_user_ns, cred->egid),
 864                from_kgid_munged(&init_user_ns, cred->sgid),
 865                from_kgid_munged(&init_user_ns, cred->fsgid));
 866#ifdef CONFIG_SECURITY
 867        printk(KERN_ERR "CRED: ->security is %p\n", cred->security);
 868        if ((unsigned long) cred->security >= PAGE_SIZE &&
 869            (((unsigned long) cred->security & 0xffffff00) !=
 870             (POISON_FREE << 24 | POISON_FREE << 16 | POISON_FREE << 8)))
 871                printk(KERN_ERR "CRED: ->security {%x, %x}\n",
 872                       ((u32*)cred->security)[0],
 873                       ((u32*)cred->security)[1]);
 874#endif
 875}
 876
 877/*
 878 * report use of invalid credentials
 879 */
 880void __invalid_creds(const struct cred *cred, const char *file, unsigned line)
 881{
 882        printk(KERN_ERR "CRED: Invalid credentials\n");
 883        printk(KERN_ERR "CRED: At %s:%u\n", file, line);
 884        dump_invalid_creds(cred, "Specified", current);
 885        BUG();
 886}
 887EXPORT_SYMBOL(__invalid_creds);
 888
 889/*
 890 * check the credentials on a process
 891 */
 892void __validate_process_creds(struct task_struct *tsk,
 893                              const char *file, unsigned line)
 894{
 895        if (tsk->cred == tsk->real_cred) {
 896                if (unlikely(read_cred_subscribers(tsk->cred) < 2 ||
 897                             creds_are_invalid(tsk->cred)))
 898                        goto invalid_creds;
 899        } else {
 900                if (unlikely(read_cred_subscribers(tsk->real_cred) < 1 ||
 901                             read_cred_subscribers(tsk->cred) < 1 ||
 902                             creds_are_invalid(tsk->real_cred) ||
 903                             creds_are_invalid(tsk->cred)))
 904                        goto invalid_creds;
 905        }
 906        return;
 907
 908invalid_creds:
 909        printk(KERN_ERR "CRED: Invalid process credentials\n");
 910        printk(KERN_ERR "CRED: At %s:%u\n", file, line);
 911
 912        dump_invalid_creds(tsk->real_cred, "Real", tsk);
 913        if (tsk->cred != tsk->real_cred)
 914                dump_invalid_creds(tsk->cred, "Effective", tsk);
 915        else
 916                printk(KERN_ERR "CRED: Effective creds == Real creds\n");
 917        BUG();
 918}
 919EXPORT_SYMBOL(__validate_process_creds);
 920
 921/*
 922 * check creds for do_exit()
 923 */
 924void validate_creds_for_do_exit(struct task_struct *tsk)
 925{
 926        kdebug("validate_creds_for_do_exit(%p,%p{%d,%d})",
 927               tsk->real_cred, tsk->cred,
 928               atomic_read(&tsk->cred->usage),
 929               read_cred_subscribers(tsk->cred));
 930
 931        __validate_process_creds(tsk, __FILE__, __LINE__);
 932}
 933
 934#endif /* CONFIG_DEBUG_CREDENTIALS */
 935