| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
| |
Config file was missing from staged files
|
|
|
|
|
|
|
|
| |
Previously executor_for_platform() would select linux-user-chroot
if availble. New behaviour is to look for bubblewrap first, then
linux-user-chroot, else falling back to chroot. To support this, a
generic 'get_program()' function was added to both bubblewrap.py
and linux_user_chroot.py for interfacing.
|
|
|
|
|
| |
Adds in support for the bubblewrap sandbox. Comes with a logger that
logs both to stdout (WARN or higher) and to a log file (everything)
|
|
|
|
| |
Also fix a small error detected by the new tests.
|
|
|
|
| |
This module is not included in Python 3.
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Fix missing source argument in the 'mount' command.
- Add missing datapath assigment to ensure that file is created in
the expected location.
- Remove unnecessary extra_mounts that were causing the test files
in /data to not be accessible inside the sandbox as that directory
was being overlapped with a mount bind.
Also, mention that the C library static libraries are required to be
installed for running the tests.
|
|
|
|
| |
If the root logger is used instead of a named 'sandboxlib' logger. This causes potential issues for 3rd party tools using this library
|
|
|
|
|
|
|
| |
This hack ensures that when propagating an exception back from
the child process in a chroot, the required string-escape python
module is already in memory and no attempt to lazy load it in the
chroot is made.
|
|
|
|
|
|
|
| |
Without propagating the traceback for the child, issues
such as the following become near impossible to diagnose:
https://github.com/devcurmudgeon/ybd/issues/224
|
|
|
|
|
|
|
|
|
|
|
| |
The mount operation is overloaded to also remount to change flags.
This does not result in a new mount,
so unmounting it is the wrong thing to do in this case.
For now, we assume that we're modifying a mount we created earlier,
so we can just avoid unmounting when we remount,
rather than having to determine how to reverse the changing of flags.
|
|
|
|
|
|
|
|
|
|
|
|
| |
You can't create a bind-mount as read-only,
you can only bind-mount then remount it as read-only.
So a sandboxlib user might opt to say it wants to bind something in,
then make it read-only, as two separate extra mounts.
We can't do this directly with linux-user-chroot,
as we are restricted to bind-mounts and making a subtree read-only,
but making a subtree read-only is close enough.
|
|
|
|
|
|
| |
It's more natural to not pass -t when bind-mounting,
to not pass -o when no options are required,
and to not pass the source path when remounting.
|
|
|
|
|
| |
This fixes a crash if the command fails, because we would try to decode
'err' but it would be None because output was not being captured.
|
|
|
|
|
|
| |
I thought that a typeerror was causing a crash in YBD, but realised
it was something else. This commit should still be an improvement,
though.
|
|
|
|
|
|
|
| |
This fixes https://github.com/CodethinkLabs/sandboxlib/issues/6
where passing a relative path for 'cwd' caused an error. I had assumed
that os.chroot() reset the current working directory itself, since
the `chroot` program does, but apparently not.
|
|
|
|
| |
This fixes https://github.com/CodethinkLabs/sandboxlib/issues/3
|
|
|
|
|
| |
This should have no effect on behaviour, but makes things slightly more
predictable.
|
|
|
|
| |
The `unshare` and `mount` commands are no longer needed.
|
| |
|
| |
|
| |
|
|
|
|
|
| |
Also, remove a comment that I think is superfluous. Hopefully it's
still clear that the chroot backend should work on any POSIX OS.
|
|
|
|
|
| |
It would always pick 'chroot' even when linux-user-chroot was available
because I'm dumb.
|
|
|
|
|
|
| |
The old name might be mistaken for a verb, i.e. "sandbox this backend"
or some such thing. Hopefully the new name makes it clearer that it
returns an execution backend.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The goal is to be useful for apps which want to be flexible about which
backend they use, taking into account that not all backends are capable
of the same thing.
My idea for degrade_config_for_capabilities() is that the app first
defines the sandboxing config they would like to use, and then passes it
through degrade_config_for_capabilities(). Any changes made are warned
about, because probably the user needs to know if certain security
features are being disabled.
This commit also adds a CAPABILITIES dict to each backend.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
First, the user should get better errors now if it is not found:
sandboxlib.ProgramNotFound: Did not find 'linux-user-chroot' in
PATH. Searched '/sbin:/bin:/usr/sbin:/usr/bin'
Second, we explicitly search for the program on each call to
run_sandbox() using the same search code used in
sandbox_module_for_platform(). This shouldn't change anything, but I
think it's better practice to search for the program ourselves than to
assume exec('linux-user-chroot') will do the right thing.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
This means the linux_user_chroot backend doesn't depend on 'unshare' and
'mount' any more. This in turn means it can be used by non-root users, in
theory.
This limits what type of mounts the linux_user_chroot backend can do to
'proc', 'tmpfs' and bind mounts. Adding more types without going back to
needing 'root' for this backend will require changing linux-user-chroot
itself (or creating a separate setuid helper program).
|
|
|
|
| |
Previously only 'none' (as a string) was allowed.
|
|
|
|
|
|
|
|
| |
Creating missing mountpoints is done later now, so that there's less
chance of them being created if bad sandbox configuration was passed.
The previous code didn't seem work correctly, probably because of
Python os.path.join() having the annoying behaviour of deleting all
previous path components if it finds one with a preceeding '/'.
|
|
|
|
|
|
| |
This makes it easier to debug problems. The log domain 'sandboxlib' is
used, so callers can handle the log messages from 'sandboxlib' however
they want using the Python 'logging' API.
|
|
|
|
|
|
|
|
|
| |
The idea with 'extra_env' was that all 'sandboxlib' sandboxes would have
a consistent base environment with standard PATH, etc. But that's not
really workable at all, and only PATH actually matters here anyway.
Now the caller passes in the entire environment as 'env', 'extra_env' is
gone.
|
|
|
|
|
|
|
|
|
|
| |
I had hoped that we could provide access to a subprocess.Popen()
instance directly so users could do whatever they want with the .stdout
and .stderr pipes. However, that's not always possible (e.g. the chroot
backend can't return the Popen object it creates to the caller, because
it's in a different process).
The current approach isn't groundbreaking but it is quite simple.
|
|
|
|
| |
This decides what is the best module to use on the current platform.
|
| |
|
|
|
|
| |
This is the last bit of API needed to be usable by YBD and Morph.
|
| |
|
|
|
|
|
|
| |
No need to do mounts inside the process that calls os.chroot(), and in
fact it's stupid because there's no guarantee of a /bin/umount existing
after we call os.chroot().
|
|
|
|
| |
This is far from complete and has probably numerous issues right now.
|
|
|
|
| |
This required a rewrite of the 'chroot' module.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Note that *sharing* the network is a different thing to *choosing not to
isolate* the network. The former implies networking will actually work
correctly, while the latter only implies that we didn't deliberately
break it. So the default network behaviour is 'undefined'.
The different backends have different capabilities, so I added a
maximum_possible_isolation() method to return whatever is the most
isolated configuration that a backend is capable of. I called this
function maximum_security() initially, but it doesn't actually guarantee
any kind of security at all so that wasn't a good name.
|
| |
|
|
|
|
| |
Also, set it correctly when running an App Container image.
|
|
|
|
|
| |
This library is now enough to run a very simple App Container image,
using either 'chroot' or 'linux-user-chroot'.
|
|
Removed the App Container-specific stuff from 'chroot' module, and
added a copyright notice.
|