| # AppArmor User Namespace Restrictions vs. Chromium Developer Builds |
| |
| ## Short summary |
| |
| If you want to run developer builds of Chromium/Chrome on Ubuntu 23.10+ |
| (or possibly other Linux distros in the future), you'll need to either globally |
| or selectively disable an Ubuntu security feature. |
| |
| ## How can I run developer builds or chromium builds I downloaded from the internet? |
| |
| ### Option 1, the easiest way |
| |
| The easiest way is to disable Ubuntu's security feature globally by running |
| these commands in a terminal: |
| ``` |
| echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns |
| ``` |
| |
| but note that this disables a useful Ubuntu security feature. |
| |
| To make this setting persist across reboots, create a new file in |
| `/etc/sysctl.d`, for example: |
| |
| ``` |
| echo kernel.apparmor_restrict_unprivileged_userns=0 | sudo tee /etc/sysctl.d/60-apparmor-namespace.conf |
| ``` |
| |
| ### Option 2, a safer way |
| |
| A slightly safer way is to write an AppArmor profile that allows running any |
| binary named "chrome" under your chromium build directory: |
| ``` |
| export CHROMIUM_BUILD_PATH=/@{HOME}/chromium/src/out/**/chrome |
| cat | sudo tee /etc/apparmor.d/chrome-dev-builds <<EOF |
| abi <abi/4.0>, |
| include <tunables/global> |
| |
| profile chrome $CHROMIUM_BUILD_PATH flags=(unconfined) { |
| userns, |
| |
| # Site-specific additions and overrides. See local/README for details. |
| include if exists <local/chrome> |
| } |
| EOF |
| sudo service apparmor reload # reload AppArmor profiles to include the new one |
| |
| ``` |
| |
| Note that an attacker with the ability to create an executable called `chrome` |
| anywhere in the above directory will be able to bypass Ubuntu's security |
| mechanism. |
| |
| You can change `CHROMIUM_BUILD_PATH` to anything you like. ** matches any part |
| of a path, * matches one component of a path. Other options of described in |
| `man apparmor.d` under the GLOBBING section. |
| |
| ### Option 3, the safest way |
| |
| If you have installed Google Chrome, the setuid sandbox helper (the old version |
| of the sandbox) is available at `/opt/google/chrome/chrome-sandbox`. You can |
| tell developer builds to use it by putting the following in your `~/.bashrc`: |
| ``` |
| export CHROME_DEVEL_SANDBOX=/opt/google/chrome/chrome-sandbox |
| ``` |
| |
| Ubuntu's packaged version of chromium will not install the setuid sandbox |
| helper (it's a snap package that disables the ubuntu security feature at |
| runtime for its installed version of chromium). |
| |
| If you have not installed Google Chrome, but you do have a chromium source |
| checkout, you can build the SUID sandbox helper yourself and install it. This |
| is the old version of the sandbox, but should work without disabling any Ubuntu |
| security features. See [Linux SUID Sandbox Development] |
| (https://chromium.googlesource.com/chromium/src/+/main/docs/linux/suid_sandbox_development.md) |
| for instructions. This should work permanently. |
| |
| The older version of the sandbox may be slightly weaker, and involves installing |
| a setuid binary. |
| |
| ## Why does this only affect developer builds? |
| |
| Ubuntu ships with an AppArmor profile that applies to Chrome stable binaries |
| installed at `/opt/google/chrome/chrome` (the default installation path). This |
| policy is stored at `/etc/apparmor.d/chrome`. |
| |
| ## What if I don't have root access to the machine and can't install anything? |
| |
| You will need to run developer builds with the `--no-sandbox` command line flag, |
| but be aware that this disables critical security features of Chromium and |
| should never be used when browsing the open web. |
| |
| ## Technical details |
| |
| Our primary sandbox no longer works on developer builds on some Linux |
| distributions, namely Ubuntu, due to a security feature that restricts access |
| to a powerful kernel feature, user namespaces. User namespaces are used by |
| Chromium (and many containerization applications) to restrict access to the |
| filesystem without requiring root privileges or a setuid binary. For a while, |
| user namespaces have been available to unprivileged (e.g. non-root) users on |
| most Linux distros, but they exposed a lot of extra kernel attack sruface. For |
| more details, see Ubuntu's announcement at |
| https://ubuntu.com/blog/ubuntu-23-10-restricted-unprivileged-user-namespaces. |
| |
| Individual binaries can be allowlisted by filepath using root-owned AppArmor |
| profiles stored in `/etc/apparmor.d/`. Ubuntu ships with an AppArmor profile |
| that applies to Chrome stable binaries installed at |
| `/opt/google/chrome/chrome` (the default installation path). Ubuntu's packaged |
| version of Chromium is a snap package, and snap generates an AppArmor profile |
| at runtime that allows usage of user namespaces. |