Depending on the options that it's given, the new namespaces created by bubblewrap might be:
- a sandboxed environment, with a security boundary between the real system and the sandbox (for example Flatpak uses it this way when running the actual app)
- a non-sandboxed environment, with differences between the real system and the sandbox, but no meaningful security boundary (for example Flatpak uses it this way when running
xdg-dbus-proxy, and the Steam Runtime uses it this way when running Steam games)
If there is meant to be a security boundary, lots of features of bubblewrap need to "fail closed". For example, if we are told to provide a filesystem, and we fail to remount it ro or nosuid, then our only choice is to refuse to run the wrapped program (fail closed), because if we carried on anyway (fail open) then we would not be providing the intended security properties.
However, if there is not meant to be a security boundary, for a lot of failures we can consider ignoring the failure (possibly with a warning) and carrying on anyway.
At the moment, bubblewrap has no way to tell which of these security models the user of bubblewrap is looking for, so we have to make the conservative/pessimistic assumption that they do want a security boundary, and fail closed.
However, if we added a --not-a-security-boundary option, we could use it to make bubblewrap more robust in the cases where something unexpected goes wrong, such as #650. Pseudocode:
if (a thing fails)
{
if (not_a_security_boundary)
warn ("the thing failed (%s), continuing without doing the thing", strerror (errno));
else
die_with_error ("the thing failed");
}
Depending on the options that it's given, the new namespaces created by bubblewrap might be:
xdg-dbus-proxy, and the Steam Runtime uses it this way when running Steam games)If there is meant to be a security boundary, lots of features of bubblewrap need to "fail closed". For example, if we are told to provide a filesystem, and we fail to remount it
roornosuid, then our only choice is to refuse to run the wrapped program (fail closed), because if we carried on anyway (fail open) then we would not be providing the intended security properties.However, if there is not meant to be a security boundary, for a lot of failures we can consider ignoring the failure (possibly with a warning) and carrying on anyway.
At the moment, bubblewrap has no way to tell which of these security models the user of bubblewrap is looking for, so we have to make the conservative/pessimistic assumption that they do want a security boundary, and fail closed.
However, if we added a
--not-a-security-boundaryoption, we could use it to make bubblewrap more robust in the cases where something unexpected goes wrong, such as #650. Pseudocode: