1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (c) 2008-2011 Robert N. M. Watson 5 * Copyright (c) 2010-2011 Jonathan Anderson 6 * Copyright (c) 2012 FreeBSD Foundation 7 * All rights reserved. 8 * 9 * This software was developed at the University of Cambridge Computer 10 * Laboratory with support from a grant from Google, Inc. 11 * 12 * Portions of this software were developed by Pawel Jakub Dawidek under 13 * sponsorship from the FreeBSD Foundation. 14 * 15 * Redistribution and use in source and binary forms, with or without 16 * modification, are permitted provided that the following conditions 17 * are met: 18 * 1. Redistributions of source code must retain the above copyright 19 * notice, this list of conditions and the following disclaimer. 20 * 2. Redistributions in binary form must reproduce the above copyright 21 * notice, this list of conditions and the following disclaimer in the 22 * documentation and/or other materials provided with the distribution. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 */ 36 37 /* 38 * FreeBSD kernel capability facility. 39 * 40 * Two kernel features are implemented here: capability mode, a sandboxed mode 41 * of execution for processes, and capabilities, a refinement on file 42 * descriptors that allows fine-grained control over operations on the file 43 * descriptor. Collectively, these allow processes to run in the style of a 44 * historic "capability system" in which they can use only resources 45 * explicitly delegated to them. This model is enforced by restricting access 46 * to global namespaces in capability mode. 47 * 48 * Capabilities wrap other file descriptor types, binding them to a constant 49 * rights mask set when the capability is created. New capabilities may be 50 * derived from existing capabilities, but only if they have the same or a 51 * strict subset of the rights on the original capability. 52 * 53 * System calls permitted in capability mode are defined in capabilities.conf; 54 * calls must be carefully audited for safety to ensure that they don't allow 55 * escape from a sandbox. Some calls permit only a subset of operations in 56 * capability mode -- for example, shm_open(2) is limited to creating 57 * anonymous, rather than named, POSIX shared memory objects. 58 */ 59 60 #include <sys/cdefs.h> 61 __FBSDID("$FreeBSD$"); 62 63 #include "opt_capsicum.h" 64 #include "opt_ktrace.h" 65 66 #include <sys/param.h> 67 #include <sys/capsicum.h> 68 #include <sys/file.h> 69 #include <sys/filedesc.h> 70 #include <sys/kernel.h> 71 #include <sys/limits.h> 72 #include <sys/lock.h> 73 #include <sys/mutex.h> 74 #include <sys/proc.h> 75 #include <sys/syscallsubr.h> 76 #include <sys/sysproto.h> 77 #include <sys/sysctl.h> 78 #include <sys/systm.h> 79 #include <sys/ucred.h> 80 #include <sys/uio.h> 81 #include <sys/ktrace.h> 82 83 #include <security/audit/audit.h> 84 85 #include <vm/uma.h> 86 #include <vm/vm.h> 87 88 int trap_enotcap; 89 SYSCTL_INT(_kern, OID_AUTO, trap_enotcap, CTLFLAG_RW, &trap_enotcap, 0, 90 "Deliver SIGTRAP on ENOTCAPABLE"); 91 92 #ifdef CAPABILITY_MODE 93 94 #define IOCTLS_MAX_COUNT 256 /* XXX: Is 256 sane? */ 95 96 FEATURE(security_capability_mode, "Capsicum Capability Mode"); 97 98 /* 99 * System call to enter capability mode for the process. 100 */ 101 int 102 sys_cap_enter(struct thread *td, struct cap_enter_args *uap) 103 { 104 struct ucred *newcred, *oldcred; 105 struct proc *p; 106 107 if (IN_CAPABILITY_MODE(td)) 108 return (0); 109 110 newcred = crget(); 111 p = td->td_proc; 112 PROC_LOCK(p); 113 oldcred = crcopysafe(p, newcred); 114 newcred->cr_flags |= CRED_FLAG_CAPMODE; 115 proc_set_cred(p, newcred); 116 PROC_UNLOCK(p); 117 crfree(oldcred); 118 return (0); 119 } 120 121 /* 122 * System call to query whether the process is in capability mode. 123 */ 124 int 125 sys_cap_getmode(struct thread *td, struct cap_getmode_args *uap) 126 { 127 u_int i; 128 129 i = IN_CAPABILITY_MODE(td) ? 1 : 0; 130 return (copyout(&i, uap->modep, sizeof(i))); 131 } 132 133 #else /* !CAPABILITY_MODE */ 134 135 int 136 sys_cap_enter(struct thread *td, struct cap_enter_args *uap) 137 { 138 139 return (ENOSYS); 140 } 141 142 int 143 sys_cap_getmode(struct thread *td, struct cap_getmode_args *uap) 144 { 145 146 return (ENOSYS); 147 } 148 149 #endif /* CAPABILITY_MODE */ 150 151 #ifdef CAPABILITIES 152 153 FEATURE(security_capabilities, "Capsicum Capabilities"); 154 155 MALLOC_DECLARE(M_FILECAPS); 156 157 static inline int 158 _cap_check(const cap_rights_t *havep, const cap_rights_t *needp, 159 enum ktr_cap_fail_type type) 160 { 161 162 if (!cap_rights_contains(havep, needp)) { 163 #ifdef KTRACE 164 if (KTRPOINT(curthread, KTR_CAPFAIL)) 165 ktrcapfail(type, needp, havep); 166 #endif 167 return (ENOTCAPABLE); 168 } 169 return (0); 170 } 171 172 /* 173 * Test whether a capability grants the requested rights. 174 */ 175 int 176 cap_check(const cap_rights_t *havep, const cap_rights_t *needp) 177 { 178 179 return (_cap_check(havep, needp, CAPFAIL_NOTCAPABLE)); 180 } 181 182 /* 183 * Convert capability rights into VM access flags. 184 */ 185 u_char 186 cap_rights_to_vmprot(cap_rights_t *havep) 187 { 188 u_char maxprot; 189 190 maxprot = VM_PROT_NONE; 191 if (cap_rights_is_set(havep, CAP_MMAP_R)) 192 maxprot |= VM_PROT_READ; 193 if (cap_rights_is_set(havep, CAP_MMAP_W)) 194 maxprot |= VM_PROT_WRITE; 195 if (cap_rights_is_set(havep, CAP_MMAP_X)) 196 maxprot |= VM_PROT_EXECUTE; 197 198 return (maxprot); 199 } 200 201 /* 202 * Extract rights from a capability for monitoring purposes -- not for use in 203 * any other way, as we want to keep all capability permission evaluation in 204 * this one file. 205 */ 206 207 cap_rights_t * 208 cap_rights_fde(struct filedescent *fde) 209 { 210 211 return (&fde->fde_rights); 212 } 213 214 cap_rights_t * 215 cap_rights(struct filedesc *fdp, int fd) 216 { 217 218 return (cap_rights_fde(&fdp->fd_ofiles[fd])); 219 } 220 221 int 222 kern_cap_rights_limit(struct thread *td, int fd, cap_rights_t *rights) 223 { 224 struct filedesc *fdp; 225 int error; 226 227 fdp = td->td_proc->p_fd; 228 FILEDESC_XLOCK(fdp); 229 if (fget_locked(fdp, fd) == NULL) { 230 FILEDESC_XUNLOCK(fdp); 231 return (EBADF); 232 } 233 error = _cap_check(cap_rights(fdp, fd), rights, CAPFAIL_INCREASE); 234 if (error == 0) { 235 fdp->fd_ofiles[fd].fde_rights = *rights; 236 if (!cap_rights_is_set(rights, CAP_IOCTL)) { 237 free(fdp->fd_ofiles[fd].fde_ioctls, M_FILECAPS); 238 fdp->fd_ofiles[fd].fde_ioctls = NULL; 239 fdp->fd_ofiles[fd].fde_nioctls = 0; 240 } 241 if (!cap_rights_is_set(rights, CAP_FCNTL)) 242 fdp->fd_ofiles[fd].fde_fcntls = 0; 243 } 244 FILEDESC_XUNLOCK(fdp); 245 return (error); 246 } 247 248 /* 249 * System call to limit rights of the given capability. 250 */ 251 int 252 sys_cap_rights_limit(struct thread *td, struct cap_rights_limit_args *uap) 253 { 254 cap_rights_t rights; 255 int error, version; 256 257 cap_rights_init(&rights); 258 259 error = copyin(uap->rightsp, &rights, sizeof(rights.cr_rights[0])); 260 if (error != 0) 261 return (error); 262 version = CAPVER(&rights); 263 if (version != CAP_RIGHTS_VERSION_00) 264 return (EINVAL); 265 266 error = copyin(uap->rightsp, &rights, 267 sizeof(rights.cr_rights[0]) * CAPARSIZE(&rights)); 268 if (error != 0) 269 return (error); 270 /* Check for race. */ 271 if (CAPVER(&rights) != version) 272 return (EINVAL); 273 274 if (!cap_rights_is_valid(&rights)) 275 return (EINVAL); 276 277 if (version != CAP_RIGHTS_VERSION) { 278 rights.cr_rights[0] &= ~(0x3ULL << 62); 279 rights.cr_rights[0] |= ((uint64_t)CAP_RIGHTS_VERSION << 62); 280 } 281 #ifdef KTRACE 282 if (KTRPOINT(td, KTR_STRUCT)) 283 ktrcaprights(&rights); 284 #endif 285 286 AUDIT_ARG_FD(uap->fd); 287 AUDIT_ARG_RIGHTS(&rights); 288 return (kern_cap_rights_limit(td, uap->fd, &rights)); 289 } 290 291 /* 292 * System call to query the rights mask associated with a capability. 293 */ 294 int 295 sys___cap_rights_get(struct thread *td, struct __cap_rights_get_args *uap) 296 { 297 struct filedesc *fdp; 298 cap_rights_t rights; 299 int error, fd, i, n; 300 301 if (uap->version != CAP_RIGHTS_VERSION_00) 302 return (EINVAL); 303 304 fd = uap->fd; 305 306 AUDIT_ARG_FD(fd); 307 308 fdp = td->td_proc->p_fd; 309 FILEDESC_SLOCK(fdp); 310 if (fget_locked(fdp, fd) == NULL) { 311 FILEDESC_SUNLOCK(fdp); 312 return (EBADF); 313 } 314 rights = *cap_rights(fdp, fd); 315 FILEDESC_SUNLOCK(fdp); 316 n = uap->version + 2; 317 if (uap->version != CAPVER(&rights)) { 318 /* 319 * For older versions we need to check if the descriptor 320 * doesn't contain rights not understood by the caller. 321 * If it does, we have to return an error. 322 */ 323 for (i = n; i < CAPARSIZE(&rights); i++) { 324 if ((rights.cr_rights[i] & ~(0x7FULL << 57)) != 0) 325 return (EINVAL); 326 } 327 } 328 error = copyout(&rights, uap->rightsp, sizeof(rights.cr_rights[0]) * n); 329 #ifdef KTRACE 330 if (error == 0 && KTRPOINT(td, KTR_STRUCT)) 331 ktrcaprights(&rights); 332 #endif 333 return (error); 334 } 335 336 /* 337 * Test whether a capability grants the given ioctl command. 338 * If descriptor doesn't have CAP_IOCTL, then ioctls list is empty and 339 * ENOTCAPABLE will be returned. 340 */ 341 int 342 cap_ioctl_check(struct filedesc *fdp, int fd, u_long cmd) 343 { 344 u_long *cmds; 345 ssize_t ncmds; 346 long i; 347 348 FILEDESC_LOCK_ASSERT(fdp); 349 KASSERT(fd >= 0 && fd < fdp->fd_nfiles, 350 ("%s: invalid fd=%d", __func__, fd)); 351 352 ncmds = fdp->fd_ofiles[fd].fde_nioctls; 353 if (ncmds == -1) 354 return (0); 355 356 cmds = fdp->fd_ofiles[fd].fde_ioctls; 357 for (i = 0; i < ncmds; i++) { 358 if (cmds[i] == cmd) 359 return (0); 360 } 361 362 return (ENOTCAPABLE); 363 } 364 365 /* 366 * Check if the current ioctls list can be replaced by the new one. 367 */ 368 static int 369 cap_ioctl_limit_check(struct filedesc *fdp, int fd, const u_long *cmds, 370 size_t ncmds) 371 { 372 u_long *ocmds; 373 ssize_t oncmds; 374 u_long i; 375 long j; 376 377 oncmds = fdp->fd_ofiles[fd].fde_nioctls; 378 if (oncmds == -1) 379 return (0); 380 if (oncmds < (ssize_t)ncmds) 381 return (ENOTCAPABLE); 382 383 ocmds = fdp->fd_ofiles[fd].fde_ioctls; 384 for (i = 0; i < ncmds; i++) { 385 for (j = 0; j < oncmds; j++) { 386 if (cmds[i] == ocmds[j]) 387 break; 388 } 389 if (j == oncmds) 390 return (ENOTCAPABLE); 391 } 392 393 return (0); 394 } 395 396 int 397 kern_cap_ioctls_limit(struct thread *td, int fd, u_long *cmds, size_t ncmds) 398 { 399 struct filedesc *fdp; 400 u_long *ocmds; 401 int error; 402 403 AUDIT_ARG_FD(fd); 404 405 if (ncmds > IOCTLS_MAX_COUNT) { 406 error = EINVAL; 407 goto out_free; 408 } 409 410 fdp = td->td_proc->p_fd; 411 FILEDESC_XLOCK(fdp); 412 413 if (fget_locked(fdp, fd) == NULL) { 414 error = EBADF; 415 goto out; 416 } 417 418 error = cap_ioctl_limit_check(fdp, fd, cmds, ncmds); 419 if (error != 0) 420 goto out; 421 422 ocmds = fdp->fd_ofiles[fd].fde_ioctls; 423 fdp->fd_ofiles[fd].fde_ioctls = cmds; 424 fdp->fd_ofiles[fd].fde_nioctls = ncmds; 425 426 cmds = ocmds; 427 error = 0; 428 out: 429 FILEDESC_XUNLOCK(fdp); 430 out_free: 431 free(cmds, M_FILECAPS); 432 return (error); 433 } 434 435 int 436 sys_cap_ioctls_limit(struct thread *td, struct cap_ioctls_limit_args *uap) 437 { 438 u_long *cmds; 439 size_t ncmds; 440 int error; 441 442 ncmds = uap->ncmds; 443 444 if (ncmds > IOCTLS_MAX_COUNT) 445 return (EINVAL); 446 447 if (ncmds == 0) { 448 cmds = NULL; 449 } else { 450 cmds = malloc(sizeof(cmds[0]) * ncmds, M_FILECAPS, M_WAITOK); 451 error = copyin(uap->cmds, cmds, sizeof(cmds[0]) * ncmds); 452 if (error != 0) { 453 free(cmds, M_FILECAPS); 454 return (error); 455 } 456 } 457 458 return (kern_cap_ioctls_limit(td, uap->fd, cmds, ncmds)); 459 } 460 461 int 462 sys_cap_ioctls_get(struct thread *td, struct cap_ioctls_get_args *uap) 463 { 464 struct filedesc *fdp; 465 struct filedescent *fdep; 466 u_long *cmdsp, *dstcmds; 467 size_t maxcmds, ncmds; 468 int16_t count; 469 int error, fd; 470 471 fd = uap->fd; 472 dstcmds = uap->cmds; 473 maxcmds = uap->maxcmds; 474 475 AUDIT_ARG_FD(fd); 476 477 fdp = td->td_proc->p_fd; 478 479 cmdsp = NULL; 480 if (dstcmds != NULL) { 481 cmdsp = malloc(sizeof(cmdsp[0]) * IOCTLS_MAX_COUNT, M_FILECAPS, 482 M_WAITOK | M_ZERO); 483 } 484 485 FILEDESC_SLOCK(fdp); 486 fdep = fdeget_locked(fdp, fd); 487 if (fdep == NULL) { 488 error = EBADF; 489 FILEDESC_SUNLOCK(fdp); 490 goto out; 491 } 492 count = fdep->fde_nioctls; 493 if (count != -1 && cmdsp != NULL) { 494 ncmds = MIN(count, maxcmds); 495 memcpy(cmdsp, fdep->fde_ioctls, sizeof(cmdsp[0]) * ncmds); 496 } 497 FILEDESC_SUNLOCK(fdp); 498 499 /* 500 * If all ioctls are allowed (fde_nioctls == -1 && fde_ioctls == NULL) 501 * the only sane thing we can do is to not populate the given array and 502 * return CAP_IOCTLS_ALL. 503 */ 504 if (count != -1) { 505 if (cmdsp != NULL) { 506 error = copyout(cmdsp, dstcmds, 507 sizeof(cmdsp[0]) * ncmds); 508 if (error != 0) 509 goto out; 510 } 511 td->td_retval[0] = count; 512 } else { 513 td->td_retval[0] = CAP_IOCTLS_ALL; 514 } 515 516 error = 0; 517 out: 518 free(cmdsp, M_FILECAPS); 519 return (error); 520 } 521 522 /* 523 * Test whether a capability grants the given fcntl command. 524 */ 525 int 526 cap_fcntl_check_fde(struct filedescent *fde, int cmd) 527 { 528 uint32_t fcntlcap; 529 530 fcntlcap = (1 << cmd); 531 KASSERT((CAP_FCNTL_ALL & fcntlcap) != 0, 532 ("Unsupported fcntl=%d.", cmd)); 533 534 if ((fde->fde_fcntls & fcntlcap) != 0) 535 return (0); 536 537 return (ENOTCAPABLE); 538 } 539 540 int 541 cap_fcntl_check(struct filedesc *fdp, int fd, int cmd) 542 { 543 544 KASSERT(fd >= 0 && fd < fdp->fd_nfiles, 545 ("%s: invalid fd=%d", __func__, fd)); 546 547 return (cap_fcntl_check_fde(&fdp->fd_ofiles[fd], cmd)); 548 } 549 550 int 551 sys_cap_fcntls_limit(struct thread *td, struct cap_fcntls_limit_args *uap) 552 { 553 struct filedesc *fdp; 554 uint32_t fcntlrights; 555 int fd; 556 557 fd = uap->fd; 558 fcntlrights = uap->fcntlrights; 559 560 AUDIT_ARG_FD(fd); 561 AUDIT_ARG_FCNTL_RIGHTS(fcntlrights); 562 563 if ((fcntlrights & ~CAP_FCNTL_ALL) != 0) 564 return (EINVAL); 565 566 fdp = td->td_proc->p_fd; 567 FILEDESC_XLOCK(fdp); 568 569 if (fget_locked(fdp, fd) == NULL) { 570 FILEDESC_XUNLOCK(fdp); 571 return (EBADF); 572 } 573 574 if ((fcntlrights & ~fdp->fd_ofiles[fd].fde_fcntls) != 0) { 575 FILEDESC_XUNLOCK(fdp); 576 return (ENOTCAPABLE); 577 } 578 579 fdp->fd_ofiles[fd].fde_fcntls = fcntlrights; 580 FILEDESC_XUNLOCK(fdp); 581 582 return (0); 583 } 584 585 int 586 sys_cap_fcntls_get(struct thread *td, struct cap_fcntls_get_args *uap) 587 { 588 struct filedesc *fdp; 589 uint32_t rights; 590 int fd; 591 592 fd = uap->fd; 593 594 AUDIT_ARG_FD(fd); 595 596 fdp = td->td_proc->p_fd; 597 FILEDESC_SLOCK(fdp); 598 if (fget_locked(fdp, fd) == NULL) { 599 FILEDESC_SUNLOCK(fdp); 600 return (EBADF); 601 } 602 rights = fdp->fd_ofiles[fd].fde_fcntls; 603 FILEDESC_SUNLOCK(fdp); 604 605 return (copyout(&rights, uap->fcntlrightsp, sizeof(rights))); 606 } 607 608 #else /* !CAPABILITIES */ 609 610 /* 611 * Stub Capability functions for when options CAPABILITIES isn't compiled 612 * into the kernel. 613 */ 614 615 int 616 sys_cap_rights_limit(struct thread *td, struct cap_rights_limit_args *uap) 617 { 618 619 return (ENOSYS); 620 } 621 622 int 623 sys___cap_rights_get(struct thread *td, struct __cap_rights_get_args *uap) 624 { 625 626 return (ENOSYS); 627 } 628 629 int 630 sys_cap_ioctls_limit(struct thread *td, struct cap_ioctls_limit_args *uap) 631 { 632 633 return (ENOSYS); 634 } 635 636 int 637 sys_cap_ioctls_get(struct thread *td, struct cap_ioctls_get_args *uap) 638 { 639 640 return (ENOSYS); 641 } 642 643 int 644 sys_cap_fcntls_limit(struct thread *td, struct cap_fcntls_limit_args *uap) 645 { 646 647 return (ENOSYS); 648 } 649 650 int 651 sys_cap_fcntls_get(struct thread *td, struct cap_fcntls_get_args *uap) 652 { 653 654 return (ENOSYS); 655 } 656 657 #endif /* CAPABILITIES */ 658