From 84ee621d24b07c3b2b6cf1715b4632cf4625b163 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Fri, 4 Aug 2023 22:18:54 +0100 Subject: [PATCH 1/3] Add audit hook for sys.monitoring.register_callback --- Python/instrumentation.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 123c20dfe1a99b..6461a00d00ee58 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -1861,6 +1861,9 @@ monitoring_register_callback_impl(PyObject *module, int tool_id, int event, PyErr_Format(PyExc_ValueError, "invalid event %d", event); return NULL; } + if (PySys_Audit("sys.monitoring.register_callback", "O", func) < 0) { + return NULL; + } if (func == Py_None) { func = NULL; } From bddfc1818a0b629faa6c2936982db6eef673f9fe Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Sat, 5 Aug 2023 03:48:13 +0100 Subject: [PATCH 2/3] Add test --- Lib/test/audit-tests.py | 11 +++++++++++ Lib/test/test_audit.py | 13 +++++++++++++ 2 files changed, 24 insertions(+) diff --git a/Lib/test/audit-tests.py b/Lib/test/audit-tests.py index 0edc9d9c472766..9504829e96f00e 100644 --- a/Lib/test/audit-tests.py +++ b/Lib/test/audit-tests.py @@ -514,6 +514,17 @@ def test_not_in_gc(): assert hook not in o +def test_sys_monitoring_register_callback(): + import sys + + def hook(event, args): + if event.startswith("sys.monitoring"): + print(event, args) + + sys.addaudithook(hook) + sys.monitoring.register_callback(1, 1, None) + + if __name__ == "__main__": from test.support import suppress_msvcrt_asserts diff --git a/Lib/test/test_audit.py b/Lib/test/test_audit.py index 0b69864751d83d..b12ffa5d872e83 100644 --- a/Lib/test/test_audit.py +++ b/Lib/test/test_audit.py @@ -257,5 +257,18 @@ def test_not_in_gc(self): self.fail(stderr) + def test_sys_monitoring_register_callback(self): + returncode, events, stderr = self.run_python("test_sys_monitoring_register_callback") + if returncode: + self.fail(stderr) + + if support.verbose: + print(*events, sep='\n') + actual = [(ev[0], ev[2]) for ev in events] + expected = [("sys.monitoring.register_callback", "(None,)")] + + self.assertEqual(actual, expected) + + if __name__ == "__main__": unittest.main() From 8f3681311bdfdd709629489dc0efcf571fb8d3e1 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Sat, 5 Aug 2023 03:51:20 +0100 Subject: [PATCH 3/3] Add news --- .../Security/2023-08-05-03-51-05.gh-issue-107774.VPjaTR.rst | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Misc/NEWS.d/next/Security/2023-08-05-03-51-05.gh-issue-107774.VPjaTR.rst diff --git a/Misc/NEWS.d/next/Security/2023-08-05-03-51-05.gh-issue-107774.VPjaTR.rst b/Misc/NEWS.d/next/Security/2023-08-05-03-51-05.gh-issue-107774.VPjaTR.rst new file mode 100644 index 00000000000000..b89b50c79f7e2a --- /dev/null +++ b/Misc/NEWS.d/next/Security/2023-08-05-03-51-05.gh-issue-107774.VPjaTR.rst @@ -0,0 +1,3 @@ +PEP 669 specifies that ``sys.monitoring.register_callback`` will generate an +audit event. Pre-releases of Python 3.12 did not generate the audit event. +This is now fixed.