5 ms·
Escaping a Python sandbox (NdH 2013 quals writeup)
- justincormack 14y agoTl;dr do not try to create a Python sandbox it is not a good language for it.
- lucian1900 14y agoOr create a real sandbox, with interpreter support, like the PyPy one.
- deleted 14y ago[deleted]
- chubot 14y agoHm how new is this? Any projects using it? It looks pretty good from the docs: http://pypy.readthedocs.org/en/latest/sandbox.html http://pypy.readthedocs.org/en/latest/sandbox.html
- pekk 14y agoIt's really not new at all. Pretty clear demonstration that Python as a language is not incompatible with sandboxing
- minopret 14y agoBased on this exploit if not on general principle, it seems advisable to wrap a sandboxing runtime in additional protections. For example codepad.org says: "When your app is remote code execution, you have to expect security problems. Rather than rely on just the chroot and ptrace supervisor, I've taken some additional precautions: The supervisor processes run on virtual machines, which are firewalled such that they are incapable of making outgoing connections. The machines that run the virtual machines are also heavily firewalled, and restored from their source images periodically."
- gngeal 14y agoGiven a sane language and a sane exposed API, it's not difficult to limit what the remote code can do. It's just that bolting a software-based isolation layer ("sandbox") on top of something existing can be expected to yield a few holes in the process. If I were to use anything existing, it would be something like Lua. Just strip away the standard library API and replace it with something strictly under your control.
- justincormack 14y agoLua is much more sane because you have much more control of what is accessible to code than you have in Python.
- habitue 14y agoTl;dr if your code takes user input and interprets it as code, you have an inherently insecure program. Dynamic languages with lots of introspection made their work easier here, but the whole reason it was possible is because the program was intentionally insecure. The "restricted environment" was a few small hacks on top of eval, it wasn't a serious attempt to make it secure.
- chrismorgan 14y agoDid you try grabbing the code of the ``auth`` function so that you could discover what you were supposed to do?
- kaoD 14y agoFrom the article: > You can get the code object of a function using myfunc.func_code. This is forbidden in the restricted mode of the Python interpreter, so we can’t see the code of the auth function.
- Erwin 14y agoI recommend Zope's Restricted Python: https://pypi.python.org/pypi/RestrictedPython https://pypi.python.org/pypi/RestrictedPython for that sort of thing (this is not like Python's now-dead restricted mode). Restricted Python will recompile your code from something like "x.y(42)" into your_getattr(x, "y")(42). It will disallow access of any names starting with _, a number of other unsafe constructs etc. So you can set up your sandbox as restricted as you want. For example the objects I expose have each an ACL so I can give users access to some system object's specific properties while disallowing modifications of them.
- MostAwesomeDude 14y agoThe regulars of #python have known about this for a while; here's a decent writeup: http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html http://nedbatchelder.com/blog/201206/eval_really_is_dangerou...
- lvh 14y agoYou can get access to the usual builtins using a lambda function's func_globals.
- pekk 14y agoIs it really news to concoct exploits against obscure, antiquated practices which nobody uses because they have been known as insecure for years?