linux/security/apparmor/lsm.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * AppArmor security module
   4 *
   5 * This file contains AppArmor LSM hooks.
   6 *
   7 * Copyright (C) 1998-2008 Novell/SUSE
   8 * Copyright 2009-2010 Canonical Ltd.
   9 */
  10
  11#include <linux/lsm_hooks.h>
  12#include <linux/moduleparam.h>
  13#include <linux/mm.h>
  14#include <linux/mman.h>
  15#include <linux/mount.h>
  16#include <linux/namei.h>
  17#include <linux/ptrace.h>
  18#include <linux/ctype.h>
  19#include <linux/sysctl.h>
  20#include <linux/audit.h>
  21#include <linux/user_namespace.h>
  22#include <linux/netfilter_ipv4.h>
  23#include <linux/netfilter_ipv6.h>
  24#include <net/sock.h>
  25#include <uapi/linux/mount.h>
  26
  27#include "include/apparmor.h"
  28#include "include/apparmorfs.h"
  29#include "include/audit.h"
  30#include "include/capability.h"
  31#include "include/cred.h"
  32#include "include/file.h"
  33#include "include/ipc.h"
  34#include "include/net.h"
  35#include "include/path.h"
  36#include "include/label.h"
  37#include "include/policy.h"
  38#include "include/policy_ns.h"
  39#include "include/procattr.h"
  40#include "include/mount.h"
  41#include "include/secid.h"
  42
  43/* Flag indicating whether initialization completed */
  44int apparmor_initialized;
  45
  46DEFINE_PER_CPU(struct aa_buffers, aa_buffers);
  47
  48
  49/*
  50 * LSM hook functions
  51 */
  52
  53/*
  54 * put the associated labels
  55 */
  56static void apparmor_cred_free(struct cred *cred)
  57{
  58        aa_put_label(cred_label(cred));
  59        set_cred_label(cred, NULL);
  60}
  61
  62/*
  63 * allocate the apparmor part of blank credentials
  64 */
  65static int apparmor_cred_alloc_blank(struct cred *cred, gfp_t gfp)
  66{
  67        set_cred_label(cred, NULL);
  68        return 0;
  69}
  70
  71/*
  72 * prepare new cred label for modification by prepare_cred block
  73 */
  74static int apparmor_cred_prepare(struct cred *new, const struct cred *old,
  75                                 gfp_t gfp)
  76{
  77        set_cred_label(new, aa_get_newest_label(cred_label(old)));
  78        return 0;
  79}
  80
  81/*
  82 * transfer the apparmor data to a blank set of creds
  83 */
  84static void apparmor_cred_transfer(struct cred *new, const struct cred *old)
  85{
  86        set_cred_label(new, aa_get_newest_label(cred_label(old)));
  87}
  88
  89static void apparmor_task_free(struct task_struct *task)
  90{
  91
  92        aa_free_task_ctx(task_ctx(task));
  93}
  94
  95static int apparmor_task_alloc(struct task_struct *task,
  96                               unsigned long clone_flags)
  97{
  98        struct aa_task_ctx *new = task_ctx(task);
  99
 100        aa_dup_task_ctx(new, task_ctx(current));
 101
 102        return 0;
 103}
 104
 105static int apparmor_ptrace_access_check(struct task_struct *child,
 106                                        unsigned int mode)
 107{
 108        struct aa_label *tracer, *tracee;
 109        int error;
 110
 111        tracer = __begin_current_label_crit_section();
 112        tracee = aa_get_task_label(child);
 113        error = aa_may_ptrace(tracer, tracee,
 114                        (mode & PTRACE_MODE_READ) ? AA_PTRACE_READ
 115                                                  : AA_PTRACE_TRACE);
 116        aa_put_label(tracee);
 117        __end_current_label_crit_section(tracer);
 118
 119        return error;
 120}
 121
 122static int apparmor_ptrace_traceme(struct task_struct *parent)
 123{
 124        struct aa_label *tracer, *tracee;
 125        int error;
 126
 127        tracee = __begin_current_label_crit_section();
 128        tracer = aa_get_task_label(parent);
 129        error = aa_may_ptrace(tracer, tracee, AA_PTRACE_TRACE);
 130        aa_put_label(tracer);
 131        __end_current_label_crit_section(tracee);
 132
 133        return error;
 134}
 135
 136/* Derived from security/commoncap.c:cap_capget */
 137static int apparmor_capget(struct task_struct *target, kernel_cap_t *effective,
 138                           kernel_cap_t *inheritable, kernel_cap_t *permitted)
 139{
 140        struct aa_label *label;
 141        const struct cred *cred;
 142
 143        rcu_read_lock();
 144        cred = __task_cred(target);
 145        label = aa_get_newest_cred_label(cred);
 146
 147        /*
 148         * cap_capget is stacked ahead of this and will
 149         * initialize effective and permitted.
 150         */
 151        if (!unconfined(label)) {
 152                struct aa_profile *profile;
 153                struct label_it i;
 154
 155                label_for_each_confined(i, label, profile) {
 156                        if (COMPLAIN_MODE(profile))
 157                                continue;
 158                        *effective = cap_intersect(*effective,
 159                                                   profile->caps.allow);
 160                        *permitted = cap_intersect(*permitted,
 161                                                   profile->caps.allow);
 162                }
 163        }
 164        rcu_read_unlock();
 165        aa_put_label(label);
 166
 167        return 0;
 168}
 169
 170static int apparmor_capable(const struct cred *cred, struct user_namespace *ns,
 171                            int cap, unsigned int opts)
 172{
 173        struct aa_label *label;
 174        int error = 0;
 175
 176        label = aa_get_newest_cred_label(cred);
 177        if (!unconfined(label))
 178                error = aa_capable(label, cap, opts);
 179        aa_put_label(label);
 180
 181        return error;
 182}
 183
 184/**
 185 * common_perm - basic common permission check wrapper fn for paths
 186 * @op: operation being checked
 187 * @path: path to check permission of  (NOT NULL)
 188 * @mask: requested permissions mask
 189 * @cond: conditional info for the permission request  (NOT NULL)
 190 *
 191 * Returns: %0 else error code if error or permission denied
 192 */
 193static int common_perm(const char *op, const struct path *path, u32 mask,
 194                       struct path_cond *cond)
 195{
 196        struct aa_label *label;
 197        int error = 0;
 198
 199        label = __begin_current_label_crit_section();
 200        if (!unconfined(label))
 201                error = aa_path_perm(op, label, path, 0, mask, cond);
 202        __end_current_label_crit_section(label);
 203
 204        return error;
 205}
 206
 207/**
 208 * common_perm_cond - common permission wrapper around inode cond
 209 * @op: operation being checked
 210 * @path: location to check (NOT NULL)
 211 * @mask: requested permissions mask
 212 *
 213 * Returns: %0 else error code if error or permission denied
 214 */
 215static int common_perm_cond(const char *op, const struct path *path, u32 mask)
 216{
 217        struct path_cond cond = { d_backing_inode(path->dentry)->i_uid,
 218                                  d_backing_inode(path->dentry)->i_mode
 219        };
 220
 221        if (!path_mediated_fs(path->dentry))
 222                return 0;
 223
 224        return common_perm(op, path, mask, &cond);
 225}
 226
 227/**
 228 * common_perm_dir_dentry - common permission wrapper when path is dir, dentry
 229 * @op: operation being checked
 230 * @dir: directory of the dentry  (NOT NULL)
 231 * @dentry: dentry to check  (NOT NULL)
 232 * @mask: requested permissions mask
 233 * @cond: conditional info for the permission request  (NOT NULL)
 234 *
 235 * Returns: %0 else error code if error or permission denied
 236 */
 237static int common_perm_dir_dentry(const char *op, const struct path *dir,
 238                                  struct dentry *dentry, u32 mask,
 239                                  struct path_cond *cond)
 240{
 241        struct path path = { .mnt = dir->mnt, .dentry = dentry };
 242
 243        return common_perm(op, &path, mask, cond);
 244}
 245
 246/**
 247 * common_perm_rm - common permission wrapper for operations doing rm
 248 * @op: operation being checked
 249 * @dir: directory that the dentry is in  (NOT NULL)
 250 * @dentry: dentry being rm'd  (NOT NULL)
 251 * @mask: requested permission mask
 252 *
 253 * Returns: %0 else error code if error or permission denied
 254 */
 255static int common_perm_rm(const char *op, const struct path *dir,
 256                          struct dentry *dentry, u32 mask)
 257{
 258        struct inode *inode = d_backing_inode(dentry);
 259        struct path_cond cond = { };
 260
 261        if (!inode || !path_mediated_fs(dentry))
 262                return 0;
 263
 264        cond.uid = inode->i_uid;
 265        cond.mode = inode->i_mode;
 266
 267        return common_perm_dir_dentry(op, dir, dentry, mask, &cond);
 268}
 269
 270/**
 271 * common_perm_create - common permission wrapper for operations doing create
 272 * @op: operation being checked
 273 * @dir: directory that dentry will be created in  (NOT NULL)
 274 * @dentry: dentry to create   (NOT NULL)
 275 * @mask: request permission mask
 276 * @mode: created file mode
 277 *
 278 * Returns: %0 else error code if error or permission denied
 279 */
 280static int common_perm_create(const char *op, const struct path *dir,
 281                              struct dentry *dentry, u32 mask, umode_t mode)
 282{
 283        struct path_cond cond = { current_fsuid(), mode };
 284
 285        if (!path_mediated_fs(dir->dentry))
 286                return 0;
 287
 288        return common_perm_dir_dentry(op, dir, dentry, mask, &cond);
 289}
 290
 291static int apparmor_path_unlink(const struct path *dir, struct dentry *dentry)
 292{
 293        return common_perm_rm(OP_UNLINK, dir, dentry, AA_MAY_DELETE);
 294}
 295
 296static int apparmor_path_mkdir(const struct path *dir, struct dentry *dentry,
 297                               umode_t mode)
 298{
 299        return common_perm_create(OP_MKDIR, dir, dentry, AA_MAY_CREATE,
 300                                  S_IFDIR);
 301}
 302
 303static int apparmor_path_rmdir(const struct path *dir, struct dentry *dentry)
 304{
 305        return common_perm_rm(OP_RMDIR, dir, dentry, AA_MAY_DELETE);
 306}
 307
 308static int apparmor_path_mknod(const struct path *dir, struct dentry *dentry,
 309                               umode_t mode, unsigned int dev)
 310{
 311        return common_perm_create(OP_MKNOD, dir, dentry, AA_MAY_CREATE, mode);
 312}
 313
 314static int apparmor_path_truncate(const struct path *path)
 315{
 316        return common_perm_cond(OP_TRUNC, path, MAY_WRITE | AA_MAY_SETATTR);
 317}
 318
 319static int apparmor_path_symlink(const struct path *dir, struct dentry *dentry,
 320                                 const char *old_name)
 321{
 322        return common_perm_create(OP_SYMLINK, dir, dentry, AA_MAY_CREATE,
 323                                  S_IFLNK);
 324}
 325
 326static int apparmor_path_link(struct dentry *old_dentry, const struct path *new_dir,
 327                              struct dentry *new_dentry)
 328{
 329        struct aa_label *label;
 330        int error = 0;
 331
 332        if (!path_mediated_fs(old_dentry))
 333                return 0;
 334
 335        label = begin_current_label_crit_section();
 336        if (!unconfined(label))
 337                error = aa_path_link(label, old_dentry, new_dir, new_dentry);
 338        end_current_label_crit_section(label);
 339
 340        return error;
 341}
 342
 343static int apparmor_path_rename(const struct path *old_dir, struct dentry *old_dentry,
 344                                const struct path *new_dir, struct dentry *new_dentry)
 345{
 346        struct aa_label *label;
 347        int error = 0;
 348
 349        if (!path_mediated_fs(old_dentry))
 350                return 0;
 351
 352        label = begin_current_label_crit_section();
 353        if (!unconfined(label)) {
 354                struct path old_path = { .mnt = old_dir->mnt,
 355                                         .dentry = old_dentry };
 356                struct path new_path = { .mnt = new_dir->mnt,
 357                                         .dentry = new_dentry };
 358                struct path_cond cond = { d_backing_inode(old_dentry)->i_uid,
 359                                          d_backing_inode(old_dentry)->i_mode
 360                };
 361
 362                error = aa_path_perm(OP_RENAME_SRC, label, &old_path, 0,
 363                                     MAY_READ | AA_MAY_GETATTR | MAY_WRITE |
 364                                     AA_MAY_SETATTR | AA_MAY_DELETE,
 365                                     &cond);
 366                if (!error)
 367                        error = aa_path_perm(OP_RENAME_DEST, label, &new_path,
 368                                             0, MAY_WRITE | AA_MAY_SETATTR |
 369                                             AA_MAY_CREATE, &cond);
 370
 371        }
 372        end_current_label_crit_section(label);
 373
 374        return error;
 375}
 376
 377static int apparmor_path_chmod(const struct path *path, umode_t mode)
 378{
 379        return common_perm_cond(OP_CHMOD, path, AA_MAY_CHMOD);
 380}
 381
 382static int apparmor_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
 383{
 384        return common_perm_cond(OP_CHOWN, path, AA_MAY_CHOWN);
 385}
 386
 387static int apparmor_inode_getattr(const struct path *path)
 388{
 389        return common_perm_cond(OP_GETATTR, path, AA_MAY_GETATTR);
 390}
 391
 392static int apparmor_file_open(struct file *file)
 393{
 394        struct aa_file_ctx *fctx = file_ctx(file);
 395        struct aa_label *label;
 396        int error = 0;
 397
 398        if (!path_mediated_fs(file->f_path.dentry))
 399                return 0;
 400
 401        /* If in exec, permission is handled by bprm hooks.
 402         * Cache permissions granted by the previous exec check, with
 403         * implicit read and executable mmap which are required to
 404         * actually execute the image.
 405         */
 406        if (current->in_execve) {
 407                fctx->allow = MAY_EXEC | MAY_READ | AA_EXEC_MMAP;
 408                return 0;
 409        }
 410
 411        label = aa_get_newest_cred_label(file->f_cred);
 412        if (!unconfined(label)) {
 413                struct inode *inode = file_inode(file);
 414                struct path_cond cond = { inode->i_uid, inode->i_mode };
 415
 416                error = aa_path_perm(OP_OPEN, label, &file->f_path, 0,
 417                                     aa_map_file_to_perms(file), &cond);
 418                /* todo cache full allowed permissions set and state */
 419                fctx->allow = aa_map_file_to_perms(file);
 420        }
 421        aa_put_label(label);
 422
 423        return error;
 424}
 425
 426static int apparmor_file_alloc_security(struct file *file)
 427{
 428        struct aa_file_ctx *ctx = file_ctx(file);
 429        struct aa_label *label = begin_current_label_crit_section();
 430
 431        spin_lock_init(&ctx->lock);
 432        rcu_assign_pointer(ctx->label, aa_get_label(label));
 433        end_current_label_crit_section(label);
 434        return 0;
 435}
 436
 437static void apparmor_file_free_security(struct file *file)
 438{
 439        struct aa_file_ctx *ctx = file_ctx(file);
 440
 441        if (ctx)
 442                aa_put_label(rcu_access_pointer(ctx->label));
 443}
 444
 445static int common_file_perm(const char *op, struct file *file, u32 mask)
 446{
 447        struct aa_label *label;
 448        int error = 0;
 449
 450        /* don't reaudit files closed during inheritance */
 451        if (file->f_path.dentry == aa_null.dentry)
 452                return -EACCES;
 453
 454        label = __begin_current_label_crit_section();
 455        error = aa_file_perm(op, label, file, mask);
 456        __end_current_label_crit_section(label);
 457
 458        return error;
 459}
 460
 461static int apparmor_file_receive(struct file *file)
 462{
 463        return common_file_perm(OP_FRECEIVE, file, aa_map_file_to_perms(file));
 464}
 465
 466static int apparmor_file_permission(struct file *file, int mask)
 467{
 468        return common_file_perm(OP_FPERM, file, mask);
 469}
 470
 471static int apparmor_file_lock(struct file *file, unsigned int cmd)
 472{
 473        u32 mask = AA_MAY_LOCK;
 474
 475        if (cmd == F_WRLCK)
 476                mask |= MAY_WRITE;
 477
 478        return common_file_perm(OP_FLOCK, file, mask);
 479}
 480
 481static int common_mmap(const char *op, struct file *file, unsigned long prot,
 482                       unsigned long flags)
 483{
 484        int mask = 0;
 485
 486        if (!file || !file_ctx(file))
 487                return 0;
 488
 489        if (prot & PROT_READ)
 490                mask |= MAY_READ;
 491        /*
 492         * Private mappings don't require write perms since they don't
 493         * write back to the files
 494         */
 495        if ((prot & PROT_WRITE) && !(flags & MAP_PRIVATE))
 496                mask |= MAY_WRITE;
 497        if (prot & PROT_EXEC)
 498                mask |= AA_EXEC_MMAP;
 499
 500        return common_file_perm(op, file, mask);
 501}
 502
 503static int apparmor_mmap_file(struct file *file, unsigned long reqprot,
 504                              unsigned long prot, unsigned long flags)
 505{
 506        return common_mmap(OP_FMMAP, file, prot, flags);
 507}
 508
 509static int apparmor_file_mprotect(struct vm_area_struct *vma,
 510                                  unsigned long reqprot, unsigned long prot)
 511{
 512        return common_mmap(OP_FMPROT, vma->vm_file, prot,
 513                           !(vma->vm_flags & VM_SHARED) ? MAP_PRIVATE : 0);
 514}
 515
 516static int apparmor_sb_mount(const char *dev_name, const struct path *path,
 517                             const char *type, unsigned long flags, void *data)
 518{
 519        struct aa_label *label;
 520        int error = 0;
 521
 522        /* Discard magic */
 523        if ((flags & MS_MGC_MSK) == MS_MGC_VAL)
 524                flags &= ~MS_MGC_MSK;
 525
 526        flags &= ~AA_MS_IGNORE_MASK;
 527
 528        label = __begin_current_label_crit_section();
 529        if (!unconfined(label)) {
 530                if (flags & MS_REMOUNT)
 531                        error = aa_remount(label, path, flags, data);
 532                else if (flags & MS_BIND)
 533                        error = aa_bind_mount(label, path, dev_name, flags);
 534                else if (flags & (MS_SHARED | MS_PRIVATE | MS_SLAVE |
 535                                  MS_UNBINDABLE))
 536                        error = aa_mount_change_type(label, path, flags);
 537                else if (flags & MS_MOVE)
 538                        error = aa_move_mount(label, path, dev_name);
 539                else
 540                        error = aa_new_mount(label, dev_name, path, type,
 541                                             flags, data);
 542        }
 543        __end_current_label_crit_section(label);
 544
 545        return error;
 546}
 547
 548static int apparmor_sb_umount(struct vfsmount *mnt, int flags)
 549{
 550        struct aa_label *label;
 551        int error = 0;
 552
 553        label = __begin_current_label_crit_section();
 554        if (!unconfined(label))
 555                error = aa_umount(label, mnt, flags);
 556        __end_current_label_crit_section(label);
 557
 558        return error;
 559}
 560
 561static int apparmor_sb_pivotroot(const struct path *old_path,
 562                                 const struct path *new_path)
 563{
 564        struct aa_label *label;
 565        int error = 0;
 566
 567        label = aa_get_current_label();
 568        if (!unconfined(label))
 569                error = aa_pivotroot(label, old_path, new_path);
 570        aa_put_label(label);
 571
 572        return error;
 573}
 574
 575static int apparmor_getprocattr(struct task_struct *task, char *name,
 576                                char **value)
 577{
 578        int error = -ENOENT;
 579        /* released below */
 580        const struct cred *cred = get_task_cred(task);
 581        struct aa_task_ctx *ctx = task_ctx(current);
 582        struct aa_label *label = NULL;
 583
 584        if (strcmp(name, "current") == 0)
 585                label = aa_get_newest_label(cred_label(cred));
 586        else if (strcmp(name, "prev") == 0  && ctx->previous)
 587                label = aa_get_newest_label(ctx->previous);
 588        else if (strcmp(name, "exec") == 0 && ctx->onexec)
 589                label = aa_get_newest_label(ctx->onexec);
 590        else
 591                error = -EINVAL;
 592
 593        if (label)
 594                error = aa_getprocattr(label, value);
 595
 596        aa_put_label(label);
 597        put_cred(cred);
 598
 599        return error;
 600}
 601
 602static int apparmor_setprocattr(const char *name, void *value,
 603                                size_t size)
 604{
 605        char *command, *largs = NULL, *args = value;
 606        size_t arg_size;
 607        int error;
 608        DEFINE_AUDIT_DATA(sa, LSM_AUDIT_DATA_NONE, OP_SETPROCATTR);
 609
 610        if (size == 0)
 611                return -EINVAL;
 612
 613        /* AppArmor requires that the buffer must be null terminated atm */
 614        if (args[size - 1] != '\0') {
 615                /* null terminate */
 616                largs = args = kmalloc(size + 1, GFP_KERNEL);
 617                if (!args)
 618                        return -ENOMEM;
 619                memcpy(args, value, size);
 620                args[size] = '\0';
 621        }
 622
 623        error = -EINVAL;
 624        args = strim(args);
 625        command = strsep(&args, " ");
 626        if (!args)
 627                goto out;
 628        args = skip_spaces(args);
 629        if (!*args)
 630                goto out;
 631
 632        arg_size = size - (args - (largs ? largs : (char *) value));
 633        if (strcmp(name, "current") == 0) {
 634                if (strcmp(command, "changehat") == 0) {
 635                        error = aa_setprocattr_changehat(args, arg_size,
 636                                                         AA_CHANGE_NOFLAGS);
 637                } else if (strcmp(command, "permhat") == 0) {
 638                        error = aa_setprocattr_changehat(args, arg_size,
 639                                                         AA_CHANGE_TEST);
 640                } else if (strcmp(command, "changeprofile") == 0) {
 641                        error = aa_change_profile(args, AA_CHANGE_NOFLAGS);
 642                } else if (strcmp(command, "permprofile") == 0) {
 643                        error = aa_change_profile(args, AA_CHANGE_TEST);
 644                } else if (strcmp(command, "stack") == 0) {
 645                        error = aa_change_profile(args, AA_CHANGE_STACK);
 646                } else
 647                        goto fail;
 648        } else if (strcmp(name, "exec") == 0) {
 649                if (strcmp(command, "exec") == 0)
 650                        error = aa_change_profile(args, AA_CHANGE_ONEXEC);
 651                else if (strcmp(command, "stack") == 0)
 652                        error = aa_change_profile(args, (AA_CHANGE_ONEXEC |
 653                                                         AA_CHANGE_STACK));
 654                else
 655                        goto fail;
 656        } else
 657                /* only support the "current" and "exec" process attributes */
 658                goto fail;
 659
 660        if (!error)
 661                error = size;
 662out:
 663        kfree(largs);
 664        return error;
 665
 666fail:
 667        aad(&sa)->label = begin_current_label_crit_section();
 668        aad(&sa)->info = name;
 669        aad(&sa)->error = error = -EINVAL;
 670        aa_audit_msg(AUDIT_APPARMOR_DENIED, &sa, NULL);
 671        end_current_label_crit_section(aad(&sa)->label);
 672        goto out;
 673}
 674
 675/**
 676 * apparmor_bprm_committing_creds - do task cleanup on committing new creds
 677 * @bprm: binprm for the exec  (NOT NULL)
 678 */
 679static void apparmor_bprm_committing_creds(struct linux_binprm *bprm)
 680{
 681        struct aa_label *label = aa_current_raw_label();
 682        struct aa_label *new_label = cred_label(bprm->cred);
 683
 684        /* bail out if unconfined or not changing profile */
 685        if ((new_label->proxy == label->proxy) ||
 686            (unconfined(new_label)))
 687                return;
 688
 689        aa_inherit_files(bprm->cred, current->files);
 690
 691        current->pdeath_signal = 0;
 692
 693        /* reset soft limits and set hard limits for the new label */
 694        __aa_transition_rlimits(label, new_label);
 695}
 696
 697/**
 698 * apparmor_bprm_committed_cred - do cleanup after new creds committed
 699 * @bprm: binprm for the exec  (NOT NULL)
 700 */
 701static void apparmor_bprm_committed_creds(struct linux_binprm *bprm)
 702{
 703        /* clear out temporary/transitional state from the context */
 704        aa_clear_task_ctx_trans(task_ctx(current));
 705
 706        return;
 707}
 708
 709static void apparmor_task_getsecid(struct task_struct *p, u32 *secid)
 710{
 711        struct aa_label *label = aa_get_task_label(p);
 712        *secid = label->secid;
 713        aa_put_label(label);
 714}
 715
 716static int apparmor_task_setrlimit(struct task_struct *task,
 717                unsigned int resource, struct rlimit *new_rlim)
 718{
 719        struct aa_label *label = __begin_current_label_crit_section();
 720        int error = 0;
 721
 722        if (!unconfined(label))
 723                error = aa_task_setrlimit(label, task, resource, new_rlim);
 724        __end_current_label_crit_section(label);
 725
 726        return error;
 727}
 728
 729static int apparmor_task_kill(struct task_struct *target, struct kernel_siginfo *info,
 730                              int sig, const struct cred *cred)
 731{
 732        struct aa_label *cl, *tl;
 733        int error;
 734
 735        if (cred) {
 736                /*
 737                 * Dealing with USB IO specific behavior
 738                 */
 739                cl = aa_get_newest_cred_label(cred);
 740                tl = aa_get_task_label(target);
 741                error = aa_may_signal(cl, tl, sig);
 742                aa_put_label(cl);
 743                aa_put_label(tl);
 744                return error;
 745        }
 746
 747        cl = __begin_current_label_crit_section();
 748        tl = aa_get_task_label(target);
 749        error = aa_may_signal(cl, tl, sig);
 750        aa_put_label(tl);
 751        __end_current_label_crit_section(cl);
 752
 753        return error;
 754}
 755
 756/**
 757 * apparmor_sk_alloc_security - allocate and attach the sk_security field
 758 */
 759static int apparmor_sk_alloc_security(struct sock *sk, int family, gfp_t flags)
 760{
 761        struct aa_sk_ctx *ctx;
 762
 763        ctx = kzalloc(sizeof(*ctx), flags);
 764        if (!ctx)
 765                return -ENOMEM;
 766
 767        SK_CTX(sk) = ctx;
 768
 769        return 0;
 770}
 771
 772/**
 773 * apparmor_sk_free_security - free the sk_security field
 774 */
 775static void apparmor_sk_free_security(struct sock *sk)
 776{
 777        struct aa_sk_ctx *ctx = SK_CTX(sk);
 778
 779        SK_CTX(sk) = NULL;
 780        aa_put_label(ctx->label);
 781        aa_put_label(ctx->peer);
 782        kfree(ctx);
 783}
 784
 785/**
 786 * apparmor_clone_security - clone the sk_security field
 787 */
 788static void apparmor_sk_clone_security(const struct sock *sk,
 789                                       struct sock *newsk)
 790{
 791        struct aa_sk_ctx *ctx = SK_CTX(sk);
 792        struct aa_sk_ctx *new = SK_CTX(newsk);
 793
 794        new->label = aa_get_label(ctx->label);
 795        new->peer = aa_get_label(ctx->peer);
 796}
 797
 798/**
 799 * apparmor_socket_create - check perms before creating a new socket
 800 */
 801static int apparmor_socket_create(int family, int type, int protocol, int kern)
 802{
 803        struct aa_label *label;
 804        int error = 0;
 805
 806        AA_BUG(in_interrupt());
 807
 808        label = begin_current_label_crit_section();
 809        if (!(kern || unconfined(label)))
 810                error = af_select(family,
 811                                  create_perm(label, family, type, protocol),
 812                                  aa_af_perm(label, OP_CREATE, AA_MAY_CREATE,
 813                                             family, type, protocol));
 814        end_current_label_crit_section(label);
 815
 816        return error;
 817}
 818
 819/**
 820 * apparmor_socket_post_create - setup the per-socket security struct
 821 *
 822 * Note:
 823 * -   kernel sockets currently labeled unconfined but we may want to
 824 *     move to a special kernel label
 825 * -   socket may not have sk here if created with sock_create_lite or
 826 *     sock_alloc. These should be accept cases which will be handled in
 827 *     sock_graft.
 828 */
 829static int apparmor_socket_post_create(struct socket *sock, int family,
 830                                       int type, int protocol, int kern)
 831{
 832        struct aa_label *label;
 833
 834        if (kern) {
 835                struct aa_ns *ns = aa_get_current_ns();
 836
 837                label = aa_get_label(ns_unconfined(ns));
 838                aa_put_ns(ns);
 839        } else
 840                label = aa_get_current_label();
 841
 842        if (sock->sk) {
 843                struct aa_sk_ctx *ctx = SK_CTX(sock->sk);
 844
 845                aa_put_label(ctx->label);
 846                ctx->label = aa_get_label(label);
 847        }
 848        aa_put_label(label);
 849
 850        return 0;
 851}
 852
 853/**
 854 * apparmor_socket_bind - check perms before bind addr to socket
 855 */
 856static int apparmor_socket_bind(struct socket *sock,
 857                                struct sockaddr *address, int addrlen)
 858{
 859        AA_BUG(!sock);
 860        AA_BUG(!sock->sk);
 861        AA_BUG(!address);
 862        AA_BUG(in_interrupt());
 863
 864        return af_select(sock->sk->sk_family,
 865                         bind_perm(sock, address, addrlen),
 866                         aa_sk_perm(OP_BIND, AA_MAY_BIND, sock->sk));
 867}
 868
 869/**
 870 * apparmor_socket_connect - check perms before connecting @sock to @address
 871 */
 872static int apparmor_socket_connect(struct socket *sock,
 873                                   struct sockaddr *address, int addrlen)
 874{
 875        AA_BUG(!sock);
 876        AA_BUG(!sock->sk);
 877        AA_BUG(!address);
 878        AA_BUG(in_interrupt());
 879
 880        return af_select(sock->sk->sk_family,
 881                         connect_perm(sock, address, addrlen),
 882                         aa_sk_perm(OP_CONNECT, AA_MAY_CONNECT, sock->sk));
 883}
 884
 885/**
 886 * apparmor_socket_list - check perms before allowing listen
 887 */
 888static int apparmor_socket_listen(struct socket *sock, int backlog)
 889{
 890        AA_BUG(!sock);
 891        AA_BUG(!sock->sk);
 892        AA_BUG(in_interrupt());
 893
 894        return af_select(sock->sk->sk_family,
 895                         listen_perm(sock, backlog),
 896                         aa_sk_perm(OP_LISTEN, AA_MAY_LISTEN, sock->sk));
 897}
 898
 899/**
 900 * apparmor_socket_accept - check perms before accepting a new connection.
 901 *
 902 * Note: while @newsock is created and has some information, the accept
 903 *       has not been done.
 904 */
 905static int apparmor_socket_accept(struct socket *sock, struct socket *newsock)
 906{
 907        AA_BUG(!sock);
 908        AA_BUG(!sock->sk);
 909        AA_BUG(!newsock);
 910        AA_BUG(in_interrupt());
 911
 912        return af_select(sock->sk->sk_family,
 913                         accept_perm(sock, newsock),
 914                         aa_sk_perm(OP_ACCEPT, AA_MAY_ACCEPT, sock->sk));
 915}
 916
 917static int aa_sock_msg_perm(const char *op, u32 request, struct socket *sock,
 918                            struct msghdr *msg, int size)
 919{
 920        AA_BUG(!sock);
 921        AA_BUG(!sock->sk);
 922        AA_BUG(!msg);
 923        AA_BUG(in_interrupt());
 924
 925        return af_select(sock->sk->sk_family,
 926                         msg_perm(op, request, sock, msg, size),
 927                         aa_sk_perm(op, request, sock->sk));
 928}
 929
 930/**
 931 * apparmor_socket_sendmsg - check perms before sending msg to another socket
 932 */
 933static int apparmor_socket_sendmsg(struct socket *sock,
 934                                   struct msghdr *msg, int size)
 935{
 936        return aa_sock_msg_perm(OP_SENDMSG, AA_MAY_SEND, sock, msg, size);
 937}
 938
 939/**
 940 * apparmor_socket_recvmsg - check perms before receiving a message
 941 */
 942static int apparmor_socket_recvmsg(struct socket *sock,
 943                                   struct msghdr *msg, int size, int flags)
 944{
 945        return aa_sock_msg_perm(OP_RECVMSG, AA_MAY_RECEIVE, sock, msg, size);
 946}
 947
 948/* revaliation, get/set attr, shutdown */
 949static int aa_sock_perm(const char *op, u32 request, struct socket *sock)
 950{
 951        AA_BUG(!sock);
 952        AA_BUG(!sock->sk);
 953        AA_BUG(in_interrupt());
 954
 955        return af_select(sock->sk->sk_family,
 956                         sock_perm(op, request, sock),
 957                         aa_sk_perm(op, request, sock->sk));
 958}
 959
 960/**
 961 * apparmor_socket_getsockname - check perms before getting the local address
 962 */
 963static int apparmor_socket_getsockname(struct socket *sock)
 964{
 965        return aa_sock_perm(OP_GETSOCKNAME, AA_MAY_GETATTR, sock);
 966}
 967
 968/**
 969 * apparmor_socket_getpeername - check perms before getting remote address
 970 */
 971static int apparmor_socket_getpeername(struct socket *sock)
 972{
 973        return aa_sock_perm(OP_GETPEERNAME, AA_MAY_GETATTR, sock);
 974}
 975
 976/* revaliation, get/set attr, opt */
 977static int aa_sock_opt_perm(const char *op, u32 request, struct socket *sock,
 978                            int level, int optname)
 979{
 980        AA_BUG(!sock);
 981        AA_BUG(!sock->sk);
 982        AA_BUG(in_interrupt());
 983
 984        return af_select(sock->sk->sk_family,
 985                         opt_perm(op, request, sock, level, optname),
 986                         aa_sk_perm(op, request, sock->sk));
 987}
 988
 989/**
 990 * apparmor_getsockopt - check perms before getting socket options
 991 */
 992static int apparmor_socket_getsockopt(struct socket *sock, int level,
 993                                      int optname)
 994{
 995        return aa_sock_opt_perm(OP_GETSOCKOPT, AA_MAY_GETOPT, sock,
 996                                level, optname);
 997}
 998
 999/**
1000 * apparmor_setsockopt - check perms before setting socket options
1001 */
1002static int apparmor_socket_setsockopt(struct socket *sock, int level,
1003                                      int optname)
1004{
1005        return aa_sock_opt_perm(OP_SETSOCKOPT, AA_MAY_SETOPT, sock,
1006                                level, optname);
1007}
1008
1009/**
1010 * apparmor_socket_shutdown - check perms before shutting down @sock conn
1011 */
1012static int apparmor_socket_shutdown(struct socket *sock, int how)
1013{
1014        return aa_sock_perm(OP_SHUTDOWN, AA_MAY_SHUTDOWN, sock);
1015}
1016
1017#ifdef CONFIG_NETWORK_SECMARK
1018/**
1019 * apparmor_socket_sock_recv_skb - check perms before associating skb to sk
1020 *
1021 * Note: can not sleep may be called with locks held
1022 *
1023 * dont want protocol specific in __skb_recv_datagram()
1024 * to deny an incoming connection  socket_sock_rcv_skb()
1025 */
1026static int apparmor_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
1027{
1028        struct aa_sk_ctx *ctx = SK_CTX(sk);
1029
1030        if (!skb->secmark)
1031                return 0;
1032
1033        return apparmor_secmark_check(ctx->label, OP_RECVMSG, AA_MAY_RECEIVE,
1034                                      skb->secmark, sk);
1035}
1036#endif
1037
1038
1039static struct aa_label *sk_peer_label(struct sock *sk)
1040{
1041        struct aa_sk_ctx *ctx = SK_CTX(sk);
1042
1043        if (ctx->peer)
1044                return ctx->peer;
1045
1046        return ERR_PTR(-ENOPROTOOPT);
1047}
1048
1049/**
1050 * apparmor_socket_getpeersec_stream - get security context of peer
1051 *
1052 * Note: for tcp only valid if using ipsec or cipso on lan
1053 */
1054static int apparmor_socket_getpeersec_stream(struct socket *sock,
1055                                             char __user *optval,
1056                                             int __user *optlen,
1057                                             unsigned int len)
1058{
1059        char *name;
1060        int slen, error = 0;
1061        struct aa_label *label;
1062        struct aa_label *peer;
1063
1064        label = begin_current_label_crit_section();
1065        peer = sk_peer_label(sock->sk);
1066        if (IS_ERR(peer)) {
1067                error = PTR_ERR(peer);
1068                goto done;
1069        }
1070        slen = aa_label_asxprint(&name, labels_ns(label), peer,
1071                                 FLAG_SHOW_MODE | FLAG_VIEW_SUBNS |
1072                                 FLAG_HIDDEN_UNCONFINED, GFP_KERNEL);
1073        /* don't include terminating \0 in slen, it breaks some apps */
1074        if (slen < 0) {
1075                error = -ENOMEM;
1076        } else {
1077                if (slen > len) {
1078                        error = -ERANGE;
1079                } else if (copy_to_user(optval, name, slen)) {
1080                        error = -EFAULT;
1081                        goto out;
1082                }
1083                if (put_user(slen, optlen))
1084                        error = -EFAULT;
1085out:
1086                kfree(name);
1087
1088        }
1089
1090done:
1091        end_current_label_crit_section(label);
1092
1093        return error;
1094}
1095
1096/**
1097 * apparmor_socket_getpeersec_dgram - get security label of packet
1098 * @sock: the peer socket
1099 * @skb: packet data
1100 * @secid: pointer to where to put the secid of the packet
1101 *
1102 * Sets the netlabel socket state on sk from parent
1103 */
1104static int apparmor_socket_getpeersec_dgram(struct socket *sock,
1105                                            struct sk_buff *skb, u32 *secid)
1106
1107{
1108        /* TODO: requires secid support */
1109        return -ENOPROTOOPT;
1110}
1111
1112/**
1113 * apparmor_sock_graft - Initialize newly created socket
1114 * @sk: child sock
1115 * @parent: parent socket
1116 *
1117 * Note: could set off of SOCK_CTX(parent) but need to track inode and we can
1118 *       just set sk security information off of current creating process label
1119 *       Labeling of sk for accept case - probably should be sock based
1120 *       instead of task, because of the case where an implicitly labeled
1121 *       socket is shared by different tasks.
1122 */
1123static void apparmor_sock_graft(struct sock *sk, struct socket *parent)
1124{
1125        struct aa_sk_ctx *ctx = SK_CTX(sk);
1126
1127        if (!ctx->label)
1128                ctx->label = aa_get_current_label();
1129}
1130
1131#ifdef CONFIG_NETWORK_SECMARK
1132static int apparmor_inet_conn_request(struct sock *sk, struct sk_buff *skb,
1133                                      struct request_sock *req)
1134{
1135        struct aa_sk_ctx *ctx = SK_CTX(sk);
1136
1137        if (!skb->secmark)
1138                return 0;
1139
1140        return apparmor_secmark_check(ctx->label, OP_CONNECT, AA_MAY_CONNECT,
1141                                      skb->secmark, sk);
1142}
1143#endif
1144
1145/*
1146 * The cred blob is a pointer to, not an instance of, an aa_task_ctx.
1147 */
1148struct lsm_blob_sizes apparmor_blob_sizes __lsm_ro_after_init = {
1149        .lbs_cred = sizeof(struct aa_task_ctx *),
1150        .lbs_file = sizeof(struct aa_file_ctx),
1151        .lbs_task = sizeof(struct aa_task_ctx),
1152};
1153
1154static struct security_hook_list apparmor_hooks[] __lsm_ro_after_init = {
1155        LSM_HOOK_INIT(ptrace_access_check, apparmor_ptrace_access_check),
1156        LSM_HOOK_INIT(ptrace_traceme, apparmor_ptrace_traceme),
1157        LSM_HOOK_INIT(capget, apparmor_capget),
1158        LSM_HOOK_INIT(capable, apparmor_capable),
1159
1160        LSM_HOOK_INIT(sb_mount, apparmor_sb_mount),
1161        LSM_HOOK_INIT(sb_umount, apparmor_sb_umount),
1162        LSM_HOOK_INIT(sb_pivotroot, apparmor_sb_pivotroot),
1163
1164        LSM_HOOK_INIT(path_link, apparmor_path_link),
1165        LSM_HOOK_INIT(path_unlink, apparmor_path_unlink),
1166        LSM_HOOK_INIT(path_symlink, apparmor_path_symlink),
1167        LSM_HOOK_INIT(path_mkdir, apparmor_path_mkdir),
1168        LSM_HOOK_INIT(path_rmdir, apparmor_path_rmdir),
1169        LSM_HOOK_INIT(path_mknod, apparmor_path_mknod),
1170        LSM_HOOK_INIT(path_rename, apparmor_path_rename),
1171        LSM_HOOK_INIT(path_chmod, apparmor_path_chmod),
1172        LSM_HOOK_INIT(path_chown, apparmor_path_chown),
1173        LSM_HOOK_INIT(path_truncate, apparmor_path_truncate),
1174        LSM_HOOK_INIT(inode_getattr, apparmor_inode_getattr),
1175
1176        LSM_HOOK_INIT(file_open, apparmor_file_open),
1177        LSM_HOOK_INIT(file_receive, apparmor_file_receive),
1178        LSM_HOOK_INIT(file_permission, apparmor_file_permission),
1179        LSM_HOOK_INIT(file_alloc_security, apparmor_file_alloc_security),
1180        LSM_HOOK_INIT(file_free_security, apparmor_file_free_security),
1181        LSM_HOOK_INIT(mmap_file, apparmor_mmap_file),
1182        LSM_HOOK_INIT(file_mprotect, apparmor_file_mprotect),
1183        LSM_HOOK_INIT(file_lock, apparmor_file_lock),
1184
1185        LSM_HOOK_INIT(getprocattr, apparmor_getprocattr),
1186        LSM_HOOK_INIT(setprocattr, apparmor_setprocattr),
1187
1188        LSM_HOOK_INIT(sk_alloc_security, apparmor_sk_alloc_security),
1189        LSM_HOOK_INIT(sk_free_security, apparmor_sk_free_security),
1190        LSM_HOOK_INIT(sk_clone_security, apparmor_sk_clone_security),
1191
1192        LSM_HOOK_INIT(socket_create, apparmor_socket_create),
1193        LSM_HOOK_INIT(socket_post_create, apparmor_socket_post_create),
1194        LSM_HOOK_INIT(socket_bind, apparmor_socket_bind),
1195        LSM_HOOK_INIT(socket_connect, apparmor_socket_connect),
1196        LSM_HOOK_INIT(socket_listen, apparmor_socket_listen),
1197        LSM_HOOK_INIT(socket_accept, apparmor_socket_accept),
1198        LSM_HOOK_INIT(socket_sendmsg, apparmor_socket_sendmsg),
1199        LSM_HOOK_INIT(socket_recvmsg, apparmor_socket_recvmsg),
1200        LSM_HOOK_INIT(socket_getsockname, apparmor_socket_getsockname),
1201        LSM_HOOK_INIT(socket_getpeername, apparmor_socket_getpeername),
1202        LSM_HOOK_INIT(socket_getsockopt, apparmor_socket_getsockopt),
1203        LSM_HOOK_INIT(socket_setsockopt, apparmor_socket_setsockopt),
1204        LSM_HOOK_INIT(socket_shutdown, apparmor_socket_shutdown),
1205#ifdef CONFIG_NETWORK_SECMARK
1206        LSM_HOOK_INIT(socket_sock_rcv_skb, apparmor_socket_sock_rcv_skb),
1207#endif
1208        LSM_HOOK_INIT(socket_getpeersec_stream,
1209                      apparmor_socket_getpeersec_stream),
1210        LSM_HOOK_INIT(socket_getpeersec_dgram,
1211                      apparmor_socket_getpeersec_dgram),
1212        LSM_HOOK_INIT(sock_graft, apparmor_sock_graft),
1213#ifdef CONFIG_NETWORK_SECMARK
1214        LSM_HOOK_INIT(inet_conn_request, apparmor_inet_conn_request),
1215#endif
1216
1217        LSM_HOOK_INIT(cred_alloc_blank, apparmor_cred_alloc_blank),
1218        LSM_HOOK_INIT(cred_free, apparmor_cred_free),
1219        LSM_HOOK_INIT(cred_prepare, apparmor_cred_prepare),
1220        LSM_HOOK_INIT(cred_transfer, apparmor_cred_transfer),
1221
1222        LSM_HOOK_INIT(bprm_set_creds, apparmor_bprm_set_creds),
1223        LSM_HOOK_INIT(bprm_committing_creds, apparmor_bprm_committing_creds),
1224        LSM_HOOK_INIT(bprm_committed_creds, apparmor_bprm_committed_creds),
1225
1226        LSM_HOOK_INIT(task_free, apparmor_task_free),
1227        LSM_HOOK_INIT(task_alloc, apparmor_task_alloc),
1228        LSM_HOOK_INIT(task_getsecid, apparmor_task_getsecid),
1229        LSM_HOOK_INIT(task_setrlimit, apparmor_task_setrlimit),
1230        LSM_HOOK_INIT(task_kill, apparmor_task_kill),
1231
1232#ifdef CONFIG_AUDIT
1233        LSM_HOOK_INIT(audit_rule_init, aa_audit_rule_init),
1234        LSM_HOOK_INIT(audit_rule_known, aa_audit_rule_known),
1235        LSM_HOOK_INIT(audit_rule_match, aa_audit_rule_match),
1236        LSM_HOOK_INIT(audit_rule_free, aa_audit_rule_free),
1237#endif
1238
1239        LSM_HOOK_INIT(secid_to_secctx, apparmor_secid_to_secctx),
1240        LSM_HOOK_INIT(secctx_to_secid, apparmor_secctx_to_secid),
1241        LSM_HOOK_INIT(release_secctx, apparmor_release_secctx),
1242};
1243
1244/*
1245 * AppArmor sysfs module parameters
1246 */
1247
1248static int param_set_aabool(const char *val, const struct kernel_param *kp);
1249static int param_get_aabool(char *buffer, const struct kernel_param *kp);
1250#define param_check_aabool param_check_bool
1251static const struct kernel_param_ops param_ops_aabool = {
1252        .flags = KERNEL_PARAM_OPS_FL_NOARG,
1253        .set = param_set_aabool,
1254        .get = param_get_aabool
1255};
1256
1257static int param_set_aauint(const char *val, const struct kernel_param *kp);
1258static int param_get_aauint(char *buffer, const struct kernel_param *kp);
1259#define param_check_aauint param_check_uint
1260static const struct kernel_param_ops param_ops_aauint = {
1261        .set = param_set_aauint,
1262        .get = param_get_aauint
1263};
1264
1265static int param_set_aalockpolicy(const char *val, const struct kernel_param *kp);
1266static int param_get_aalockpolicy(char *buffer, const struct kernel_param *kp);
1267#define param_check_aalockpolicy param_check_bool
1268static const struct kernel_param_ops param_ops_aalockpolicy = {
1269        .flags = KERNEL_PARAM_OPS_FL_NOARG,
1270        .set = param_set_aalockpolicy,
1271        .get = param_get_aalockpolicy
1272};
1273
1274static int param_set_audit(const char *val, const struct kernel_param *kp);
1275static int param_get_audit(char *buffer, const struct kernel_param *kp);
1276
1277static int param_set_mode(const char *val, const struct kernel_param *kp);
1278static int param_get_mode(char *buffer, const struct kernel_param *kp);
1279
1280/* Flag values, also controllable via /sys/module/apparmor/parameters
1281 * We define special types as we want to do additional mediation.
1282 */
1283
1284/* AppArmor global enforcement switch - complain, enforce, kill */
1285enum profile_mode aa_g_profile_mode = APPARMOR_ENFORCE;
1286module_param_call(mode, param_set_mode, param_get_mode,
1287                  &aa_g_profile_mode, S_IRUSR | S_IWUSR);
1288
1289/* whether policy verification hashing is enabled */
1290bool aa_g_hash_policy = IS_ENABLED(CONFIG_SECURITY_APPARMOR_HASH_DEFAULT);
1291#ifdef CONFIG_SECURITY_APPARMOR_HASH
1292module_param_named(hash_policy, aa_g_hash_policy, aabool, S_IRUSR | S_IWUSR);
1293#endif
1294
1295/* Debug mode */
1296bool aa_g_debug = IS_ENABLED(CONFIG_SECURITY_APPARMOR_DEBUG_MESSAGES);
1297module_param_named(debug, aa_g_debug, aabool, S_IRUSR | S_IWUSR);
1298
1299/* Audit mode */
1300enum audit_mode aa_g_audit;
1301module_param_call(audit, param_set_audit, param_get_audit,
1302                  &aa_g_audit, S_IRUSR | S_IWUSR);
1303
1304/* Determines if audit header is included in audited messages.  This
1305 * provides more context if the audit daemon is not running
1306 */
1307bool aa_g_audit_header = true;
1308module_param_named(audit_header, aa_g_audit_header, aabool,
1309                   S_IRUSR | S_IWUSR);
1310
1311/* lock out loading/removal of policy
1312 * TODO: add in at boot loading of policy, which is the only way to
1313 *       load policy, if lock_policy is set
1314 */
1315bool aa_g_lock_policy;
1316module_param_named(lock_policy, aa_g_lock_policy, aalockpolicy,
1317                   S_IRUSR | S_IWUSR);
1318
1319/* Syscall logging mode */
1320bool aa_g_logsyscall;
1321module_param_named(logsyscall, aa_g_logsyscall, aabool, S_IRUSR | S_IWUSR);
1322
1323/* Maximum pathname length before accesses will start getting rejected */
1324unsigned int aa_g_path_max = 2 * PATH_MAX;
1325module_param_named(path_max, aa_g_path_max, aauint, S_IRUSR);
1326
1327/* Determines how paranoid loading of policy is and how much verification
1328 * on the loaded policy is done.
1329 * DEPRECATED: read only as strict checking of load is always done now
1330 * that none root users (user namespaces) can load policy.
1331 */
1332bool aa_g_paranoid_load = true;
1333module_param_named(paranoid_load, aa_g_paranoid_load, aabool, S_IRUGO);
1334
1335static int param_get_aaintbool(char *buffer, const struct kernel_param *kp);
1336static int param_set_aaintbool(const char *val, const struct kernel_param *kp);
1337#define param_check_aaintbool param_check_int
1338static const struct kernel_param_ops param_ops_aaintbool = {
1339        .set = param_set_aaintbool,
1340        .get = param_get_aaintbool
1341};
1342/* Boot time disable flag */
1343static int apparmor_enabled __lsm_ro_after_init = 1;
1344module_param_named(enabled, apparmor_enabled, aaintbool, 0444);
1345
1346static int __init apparmor_enabled_setup(char *str)
1347{
1348        unsigned long enabled;
1349        int error = kstrtoul(str, 0, &enabled);
1350        if (!error)
1351                apparmor_enabled = enabled ? 1 : 0;
1352        return 1;
1353}
1354
1355__setup("apparmor=", apparmor_enabled_setup);
1356
1357/* set global flag turning off the ability to load policy */
1358static int param_set_aalockpolicy(const char *val, const struct kernel_param *kp)
1359{
1360        if (!apparmor_enabled)
1361                return -EINVAL;
1362        if (apparmor_initialized && !policy_admin_capable(NULL))
1363                return -EPERM;
1364        return param_set_bool(val, kp);
1365}
1366
1367static int param_get_aalockpolicy(char *buffer, const struct kernel_param *kp)
1368{
1369        if (!apparmor_enabled)
1370                return -EINVAL;
1371        if (apparmor_initialized && !policy_view_capable(NULL))
1372                return -EPERM;
1373        return param_get_bool(buffer, kp);
1374}
1375
1376static int param_set_aabool(const char *val, const struct kernel_param *kp)
1377{
1378        if (!apparmor_enabled)
1379                return -EINVAL;
1380        if (apparmor_initialized && !policy_admin_capable(NULL))
1381                return -EPERM;
1382        return param_set_bool(val, kp);
1383}
1384
1385static int param_get_aabool(char *buffer, const struct kernel_param *kp)
1386{
1387        if (!apparmor_enabled)
1388                return -EINVAL;
1389        if (apparmor_initialized && !policy_view_capable(NULL))
1390                return -EPERM;
1391        return param_get_bool(buffer, kp);
1392}
1393
1394static int param_set_aauint(const char *val, const struct kernel_param *kp)
1395{
1396        int error;
1397
1398        if (!apparmor_enabled)
1399                return -EINVAL;
1400        /* file is ro but enforce 2nd line check */
1401        if (apparmor_initialized)
1402                return -EPERM;
1403
1404        error = param_set_uint(val, kp);
1405        pr_info("AppArmor: buffer size set to %d bytes\n", aa_g_path_max);
1406
1407        return error;
1408}
1409
1410static int param_get_aauint(char *buffer, const struct kernel_param *kp)
1411{
1412        if (!apparmor_enabled)
1413                return -EINVAL;
1414        if (apparmor_initialized && !policy_view_capable(NULL))
1415                return -EPERM;
1416        return param_get_uint(buffer, kp);
1417}
1418
1419/* Can only be set before AppArmor is initialized (i.e. on boot cmdline). */
1420static int param_set_aaintbool(const char *val, const struct kernel_param *kp)
1421{
1422        struct kernel_param kp_local;
1423        bool value;
1424        int error;
1425
1426        if (apparmor_initialized)
1427                return -EPERM;
1428
1429        /* Create local copy, with arg pointing to bool type. */
1430        value = !!*((int *)kp->arg);
1431        memcpy(&kp_local, kp, sizeof(kp_local));
1432        kp_local.arg = &value;
1433
1434        error = param_set_bool(val, &kp_local);
1435        if (!error)
1436                *((int *)kp->arg) = *((bool *)kp_local.arg);
1437        return error;
1438}
1439
1440/*
1441 * To avoid changing /sys/module/apparmor/parameters/enabled from Y/N to
1442 * 1/0, this converts the "int that is actually bool" back to bool for
1443 * display in the /sys filesystem, while keeping it "int" for the LSM
1444 * infrastructure.
1445 */
1446static int param_get_aaintbool(char *buffer, const struct kernel_param *kp)
1447{
1448        struct kernel_param kp_local;
1449        bool value;
1450
1451        /* Create local copy, with arg pointing to bool type. */
1452        value = !!*((int *)kp->arg);
1453        memcpy(&kp_local, kp, sizeof(kp_local));
1454        kp_local.arg = &value;
1455
1456        return param_get_bool(buffer, &kp_local);
1457}
1458
1459static int param_get_audit(char *buffer, const struct kernel_param *kp)
1460{
1461        if (!apparmor_enabled)
1462                return -EINVAL;
1463        if (apparmor_initialized && !policy_view_capable(NULL))
1464                return -EPERM;
1465        return sprintf(buffer, "%s", audit_mode_names[aa_g_audit]);
1466}
1467
1468static int param_set_audit(const char *val, const struct kernel_param *kp)
1469{
1470        int i;
1471
1472        if (!apparmor_enabled)
1473                return -EINVAL;
1474        if (!val)
1475                return -EINVAL;
1476        if (apparmor_initialized && !policy_admin_capable(NULL))
1477                return -EPERM;
1478
1479        i = match_string(audit_mode_names, AUDIT_MAX_INDEX, val);
1480        if (i < 0)
1481                return -EINVAL;
1482
1483        aa_g_audit = i;
1484        return 0;
1485}
1486
1487static int param_get_mode(char *buffer, const struct kernel_param *kp)
1488{
1489        if (!apparmor_enabled)
1490                return -EINVAL;
1491        if (apparmor_initialized && !policy_view_capable(NULL))
1492                return -EPERM;
1493
1494        return sprintf(buffer, "%s", aa_profile_mode_names[aa_g_profile_mode]);
1495}
1496
1497static int param_set_mode(const char *val, const struct kernel_param *kp)
1498{
1499        int i;
1500
1501        if (!apparmor_enabled)
1502                return -EINVAL;
1503        if (!val)
1504                return -EINVAL;
1505        if (apparmor_initialized && !policy_admin_capable(NULL))
1506                return -EPERM;
1507
1508        i = match_string(aa_profile_mode_names, APPARMOR_MODE_NAMES_MAX_INDEX,
1509                         val);
1510        if (i < 0)
1511                return -EINVAL;
1512
1513        aa_g_profile_mode = i;
1514        return 0;
1515}
1516
1517/*
1518 * AppArmor init functions
1519 */
1520
1521/**
1522 * set_init_ctx - set a task context and profile on the first task.
1523 *
1524 * TODO: allow setting an alternate profile than unconfined
1525 */
1526static int __init set_init_ctx(void)
1527{
1528        struct cred *cred = (struct cred *)current->real_cred;
1529
1530        set_cred_label(cred, aa_get_label(ns_unconfined(root_ns)));
1531
1532        return 0;
1533}
1534
1535static void destroy_buffers(void)
1536{
1537        u32 i, j;
1538
1539        for_each_possible_cpu(i) {
1540                for_each_cpu_buffer(j) {
1541                        kfree(per_cpu(aa_buffers, i).buf[j]);
1542                        per_cpu(aa_buffers, i).buf[j] = NULL;
1543                }
1544        }
1545}
1546
1547static int __init alloc_buffers(void)
1548{
1549        u32 i, j;
1550
1551        for_each_possible_cpu(i) {
1552                for_each_cpu_buffer(j) {
1553                        char *buffer;
1554
1555                        if (cpu_to_node(i) > num_online_nodes())
1556                                /* fallback to kmalloc for offline nodes */
1557                                buffer = kmalloc(aa_g_path_max, GFP_KERNEL);
1558                        else
1559                                buffer = kmalloc_node(aa_g_path_max, GFP_KERNEL,
1560                                                      cpu_to_node(i));
1561                        if (!buffer) {
1562                                destroy_buffers();
1563                                return -ENOMEM;
1564                        }
1565                        per_cpu(aa_buffers, i).buf[j] = buffer;
1566                }
1567        }
1568
1569        return 0;
1570}
1571
1572#ifdef CONFIG_SYSCTL
1573static int apparmor_dointvec(struct ctl_table *table, int write,
1574                             void __user *buffer, size_t *lenp, loff_t *ppos)
1575{
1576        if (!policy_admin_capable(NULL))
1577                return -EPERM;
1578        if (!apparmor_enabled)
1579                return -EINVAL;
1580
1581        return proc_dointvec(table, write, buffer, lenp, ppos);
1582}
1583
1584static struct ctl_path apparmor_sysctl_path[] = {
1585        { .procname = "kernel", },
1586        { }
1587};
1588
1589static struct ctl_table apparmor_sysctl_table[] = {
1590        {
1591                .procname       = "unprivileged_userns_apparmor_policy",
1592                .data           = &unprivileged_userns_apparmor_policy,
1593                .maxlen         = sizeof(int),
1594                .mode           = 0600,
1595                .proc_handler   = apparmor_dointvec,
1596        },
1597        { }
1598};
1599
1600static int __init apparmor_init_sysctl(void)
1601{
1602        return register_sysctl_paths(apparmor_sysctl_path,
1603                                     apparmor_sysctl_table) ? 0 : -ENOMEM;
1604}
1605#else
1606static inline int apparmor_init_sysctl(void)
1607{
1608        return 0;
1609}
1610#endif /* CONFIG_SYSCTL */
1611
1612#if defined(CONFIG_NETFILTER) && defined(CONFIG_NETWORK_SECMARK)
1613static unsigned int apparmor_ip_postroute(void *priv,
1614                                          struct sk_buff *skb,
1615                                          const struct nf_hook_state *state)
1616{
1617        struct aa_sk_ctx *ctx;
1618        struct sock *sk;
1619
1620        if (!skb->secmark)
1621                return NF_ACCEPT;
1622
1623        sk = skb_to_full_sk(skb);
1624        if (sk == NULL)
1625                return NF_ACCEPT;
1626
1627        ctx = SK_CTX(sk);
1628        if (!apparmor_secmark_check(ctx->label, OP_SENDMSG, AA_MAY_SEND,
1629                                    skb->secmark, sk))
1630                return NF_ACCEPT;
1631
1632        return NF_DROP_ERR(-ECONNREFUSED);
1633
1634}
1635
1636static unsigned int apparmor_ipv4_postroute(void *priv,
1637                                            struct sk_buff *skb,
1638                                            const struct nf_hook_state *state)
1639{
1640        return apparmor_ip_postroute(priv, skb, state);
1641}
1642
1643#if IS_ENABLED(CONFIG_IPV6)
1644static unsigned int apparmor_ipv6_postroute(void *priv,
1645                                            struct sk_buff *skb,
1646                                            const struct nf_hook_state *state)
1647{
1648        return apparmor_ip_postroute(priv, skb, state);
1649}
1650#endif
1651
1652static const struct nf_hook_ops apparmor_nf_ops[] = {
1653        {
1654                .hook =         apparmor_ipv4_postroute,
1655                .pf =           NFPROTO_IPV4,
1656                .hooknum =      NF_INET_POST_ROUTING,
1657                .priority =     NF_IP_PRI_SELINUX_FIRST,
1658        },
1659#if IS_ENABLED(CONFIG_IPV6)
1660        {
1661                .hook =         apparmor_ipv6_postroute,
1662                .pf =           NFPROTO_IPV6,
1663                .hooknum =      NF_INET_POST_ROUTING,
1664                .priority =     NF_IP6_PRI_SELINUX_FIRST,
1665        },
1666#endif
1667};
1668
1669static int __net_init apparmor_nf_register(struct net *net)
1670{
1671        int ret;
1672
1673        ret = nf_register_net_hooks(net, apparmor_nf_ops,
1674                                    ARRAY_SIZE(apparmor_nf_ops));
1675        return ret;
1676}
1677
1678static void __net_exit apparmor_nf_unregister(struct net *net)
1679{
1680        nf_unregister_net_hooks(net, apparmor_nf_ops,
1681                                ARRAY_SIZE(apparmor_nf_ops));
1682}
1683
1684static struct pernet_operations apparmor_net_ops = {
1685        .init = apparmor_nf_register,
1686        .exit = apparmor_nf_unregister,
1687};
1688
1689static int __init apparmor_nf_ip_init(void)
1690{
1691        int err;
1692
1693        if (!apparmor_enabled)
1694                return 0;
1695
1696        err = register_pernet_subsys(&apparmor_net_ops);
1697        if (err)
1698                panic("Apparmor: register_pernet_subsys: error %d\n", err);
1699
1700        return 0;
1701}
1702__initcall(apparmor_nf_ip_init);
1703#endif
1704
1705static int __init apparmor_init(void)
1706{
1707        int error;
1708
1709        aa_secids_init();
1710
1711        error = aa_setup_dfa_engine();
1712        if (error) {
1713                AA_ERROR("Unable to setup dfa engine\n");
1714                goto alloc_out;
1715        }
1716
1717        error = aa_alloc_root_ns();
1718        if (error) {
1719                AA_ERROR("Unable to allocate default profile namespace\n");
1720                goto alloc_out;
1721        }
1722
1723        error = apparmor_init_sysctl();
1724        if (error) {
1725                AA_ERROR("Unable to register sysctls\n");
1726                goto alloc_out;
1727
1728        }
1729
1730        error = alloc_buffers();
1731        if (error) {
1732                AA_ERROR("Unable to allocate work buffers\n");
1733                goto buffers_out;
1734        }
1735
1736        error = set_init_ctx();
1737        if (error) {
1738                AA_ERROR("Failed to set context on init task\n");
1739                aa_free_root_ns();
1740                goto buffers_out;
1741        }
1742        security_add_hooks(apparmor_hooks, ARRAY_SIZE(apparmor_hooks),
1743                                "apparmor");
1744
1745        /* Report that AppArmor successfully initialized */
1746        apparmor_initialized = 1;
1747        if (aa_g_profile_mode == APPARMOR_COMPLAIN)
1748                aa_info_message("AppArmor initialized: complain mode enabled");
1749        else if (aa_g_profile_mode == APPARMOR_KILL)
1750                aa_info_message("AppArmor initialized: kill mode enabled");
1751        else
1752                aa_info_message("AppArmor initialized");
1753
1754        return error;
1755
1756buffers_out:
1757        destroy_buffers();
1758
1759alloc_out:
1760        aa_destroy_aafs();
1761        aa_teardown_dfa_engine();
1762
1763        apparmor_enabled = false;
1764        return error;
1765}
1766
1767DEFINE_LSM(apparmor) = {
1768        .name = "apparmor",
1769        .flags = LSM_FLAG_LEGACY_MAJOR | LSM_FLAG_EXCLUSIVE,
1770        .enabled = &apparmor_enabled,
1771        .blobs = &apparmor_blob_sizes,
1772        .init = apparmor_init,
1773};
1774