OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <dlfcn.h> | 5 #include <dlfcn.h> |
6 #include <fcntl.h> | 6 #include <fcntl.h> |
7 #include <sys/epoll.h> | 7 #include <sys/epoll.h> |
8 #include <sys/prctl.h> | 8 #include <sys/prctl.h> |
9 #include <sys/signal.h> | 9 #include <sys/signal.h> |
10 #include <sys/socket.h> | 10 #include <sys/socket.h> |
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 media::InitializeMediaLibrary(module_path); | 502 media::InitializeMediaLibrary(module_path); |
503 } | 503 } |
504 | 504 |
505 #if !defined(CHROMIUM_SELINUX) | 505 #if !defined(CHROMIUM_SELINUX) |
506 static bool EnterSandbox() { | 506 static bool EnterSandbox() { |
507 // The SUID sandbox sets this environment variable to a file descriptor | 507 // The SUID sandbox sets this environment variable to a file descriptor |
508 // over which we can signal that we have completed our startup and can be | 508 // over which we can signal that we have completed our startup and can be |
509 // chrooted. | 509 // chrooted. |
510 const char* const sandbox_fd_string = getenv("SBX_D"); | 510 const char* const sandbox_fd_string = getenv("SBX_D"); |
511 | 511 |
512 if (CommandLine::ForCurrentProcess()->HasSwitch( | 512 if (switches::SeccompSandboxEnabled()) { |
513 switches::kEnableSeccompSandbox)) { | |
514 PreSandboxInit(); | 513 PreSandboxInit(); |
515 SkiaFontConfigUseIPCImplementation(kMagicSandboxIPCDescriptor); | 514 SkiaFontConfigUseIPCImplementation(kMagicSandboxIPCDescriptor); |
516 } else if (sandbox_fd_string) { // Use the SUID sandbox. | 515 } else if (sandbox_fd_string) { // Use the SUID sandbox. |
517 g_suid_sandbox_active = true; | 516 g_suid_sandbox_active = true; |
518 | 517 |
519 char* endptr; | 518 char* endptr; |
520 const long fd_long = strtol(sandbox_fd_string, &endptr, 10); | 519 const long fd_long = strtol(sandbox_fd_string, &endptr, 10); |
521 if (!*sandbox_fd_string || *endptr || fd_long < 0 || fd_long > INT_MAX) | 520 if (!*sandbox_fd_string || *endptr || fd_long < 0 || fd_long > INT_MAX) |
522 return false; | 521 return false; |
523 const int fd = fd_long; | 522 const int fd = fd_long; |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
611 | 610 |
612 bool ZygoteMain(const MainFunctionParams& params) { | 611 bool ZygoteMain(const MainFunctionParams& params) { |
613 #if !defined(CHROMIUM_SELINUX) | 612 #if !defined(CHROMIUM_SELINUX) |
614 g_am_zygote_or_renderer = true; | 613 g_am_zygote_or_renderer = true; |
615 #endif | 614 #endif |
616 | 615 |
617 #if defined(SECCOMP_SANDBOX) | 616 #if defined(SECCOMP_SANDBOX) |
618 // The seccomp sandbox needs access to files in /proc, which might be denied | 617 // The seccomp sandbox needs access to files in /proc, which might be denied |
619 // after one of the other sandboxes have been started. So, obtain a suitable | 618 // after one of the other sandboxes have been started. So, obtain a suitable |
620 // file handle in advance. | 619 // file handle in advance. |
621 if (CommandLine::ForCurrentProcess()->HasSwitch( | 620 if (switches::SeccompSandboxEnabled()) { |
622 switches::kEnableSeccompSandbox)) { | |
623 g_proc_fd = open("/proc", O_DIRECTORY | O_RDONLY); | 621 g_proc_fd = open("/proc", O_DIRECTORY | O_RDONLY); |
624 if (g_proc_fd < 0) { | 622 if (g_proc_fd < 0) { |
625 LOG(ERROR) << "WARNING! Cannot access \"/proc\". Disabling seccomp " | 623 LOG(ERROR) << "WARNING! Cannot access \"/proc\". Disabling seccomp " |
626 "sandboxing."; | 624 "sandboxing."; |
627 } | 625 } |
628 } | 626 } |
629 #endif // SECCOMP_SANDBOX | 627 #endif // SECCOMP_SANDBOX |
630 | 628 |
631 // Turn on the SELinux or SUID sandbox | 629 // Turn on the SELinux or SUID sandbox |
632 if (!EnterSandbox()) { | 630 if (!EnterSandbox()) { |
633 LOG(FATAL) << "Failed to enter sandbox. Fail safe abort. (errno: " | 631 LOG(FATAL) << "Failed to enter sandbox. Fail safe abort. (errno: " |
634 << errno << ")"; | 632 << errno << ")"; |
635 return false; | 633 return false; |
636 } | 634 } |
637 | 635 |
638 #if defined(SECCOMP_SANDBOX) | 636 #if defined(SECCOMP_SANDBOX) |
639 // The seccomp sandbox will be turned on when the renderers start. But we can | 637 // The seccomp sandbox will be turned on when the renderers start. But we can |
640 // already check if sufficient support is available so that we only need to | 638 // already check if sufficient support is available so that we only need to |
641 // print one error message for the entire browser session. | 639 // print one error message for the entire browser session. |
642 if (g_proc_fd >= 0 && | 640 if (g_proc_fd >= 0 && switches::SeccompSandboxEnabled()) { |
643 CommandLine::ForCurrentProcess()->HasSwitch( | |
644 switches::kEnableSeccompSandbox)) { | |
645 if (!SupportsSeccompSandbox(g_proc_fd)) { | 641 if (!SupportsSeccompSandbox(g_proc_fd)) { |
646 // There are a good number of users who cannot use the seccomp sandbox | 642 // There are a good number of users who cannot use the seccomp sandbox |
647 // (e.g. because their distribution does not enable seccomp mode by | 643 // (e.g. because their distribution does not enable seccomp mode by |
648 // default). While we would prefer to deny execution in this case, it | 644 // default). While we would prefer to deny execution in this case, it |
649 // seems more realistic to continue in degraded mode. | 645 // seems more realistic to continue in degraded mode. |
650 LOG(ERROR) << "WARNING! This machine lacks support needed for the " | 646 LOG(ERROR) << "WARNING! This machine lacks support needed for the " |
651 "Seccomp sandbox. Running renderers with Seccomp " | 647 "Seccomp sandbox. Running renderers with Seccomp " |
652 "sandboxing disabled."; | 648 "sandboxing disabled."; |
653 } else { | 649 } else { |
654 LOG(INFO) << "Enabling experimental Seccomp sandbox."; | 650 LOG(INFO) << "Enabling experimental Seccomp sandbox."; |
655 } | 651 } |
656 } | 652 } |
657 #endif // SECCOMP_SANDBOX | 653 #endif // SECCOMP_SANDBOX |
658 | 654 |
659 Zygote zygote; | 655 Zygote zygote; |
660 // This function call can return multiple times, once per fork(). | 656 // This function call can return multiple times, once per fork(). |
661 return zygote.ProcessRequests(); | 657 return zygote.ProcessRequests(); |
662 } | 658 } |
OLD | NEW |