This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author gousaiyang
Recipients christian.heimes, docs@python, frankli, gousaiyang, steve.dower, vstinner, zkonge
Date 2021-03-11.03:16:06
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1615432567.4.0.527761650737.issue43438@roundup.psfhosted.org>
In-reply-to
Content
We understand that audit hooks should not be used to build a sandbox with Python. It is natural for audit hooks to appear in CTF challenges though, as many CTF challenges intentionally try to use a wrong way to secure a system (and let players prove it wrong).

With that being said, audit hooks should still be robust, even for logging purposes. We are no trying to prevent all kinds of malicious behaviors, but we want to detect them *as much as possible*. If audit hooks can be easily removed while triggering very few seemingly non-sensitive audit events (in this CTF challenge, only "import gc" is triggered, which probably looks "no so suspicious"), this allows attackers to hide details of further malicious behavior without being audited, which violated the motivation of audit hooks (to increase security transparency).

The recent gc patch introduced new events which will make the attack in that CTF challenge look more suspicious. But probably it is still better to harden the current data structure used to store per interpreter audit hooks. If an attacker happens to gain a reference to the list holding the hooks (although I'm not sure how that will still be possible without using `gc`), they can easily remove the hooks at the Python language level. Probably a Python tuple is already better than a Python list to store the hooks, since tuples are immutable at the language level. Although that means we should build new a tuple each time a new hook is added.

If the hook itself is fragile (e.g. a hook written in Python which relies on global variables), it is a user fault. But if the hook function itself is good, it shouldn't be too easy to remove. Any successful attempts to remove the hook must have already "pwned" the Python interpreter (i.e. gained arbitrary memory read/write or native code execution ability), either by using ctypes, by open('/proc/self/mem'), by crafting bytecode (which triggers code.__new__) or importing modules written in native code. (Overwriting hook.__code__ triggers object.__setattr__.)
History
Date User Action Args
2021-03-11 03:16:07gousaiyangsetrecipients: + gousaiyang, vstinner, christian.heimes, docs@python, steve.dower, zkonge, frankli
2021-03-11 03:16:07gousaiyangsetmessageid: <1615432567.4.0.527761650737.issue43438@roundup.psfhosted.org>
2021-03-11 03:16:07gousaiyanglinkissue43438 messages
2021-03-11 03:16:06gousaiyangcreate