summaryrefslogtreecommitdiffstats
path: root/meta-python/recipes-devtools/python/python3-ipython/CVE-2023-24816.patch
blob: e5f65fbb68e99daa1914174f9df99129ff493665 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
From 06db417ff15192d73ddac4bf0e2f20579d47b2e0 Mon Sep 17 00:00:00 2001
From: Konstantin Weddige <konstantin.weddige@lutrasecurity.com>
Date: Sat, 3 Dec 2022 19:14:09 +0100
Subject: [PATCH] Fix CVE-2023-24816 by removing legacy code.

Remove legacy code that might trigger a CVE.

Currently set_term_title is only called with (semi-)trusted input that
contain the current working directory of the current IPython session. If
an attacker can control directory names, and manage to get a user cd
into this directory the attacker can execute arbitrary commands
contained in the folder names.

Example:

    - On a windows machine where python is built without _ctypes, create
      a folder called && echo "pwn" > pwn.txt. This can be done by for
      example cloning a git repository.
    - call toggled_set_term_title(True), (or have the preference to
      true)
    - Open IPython and cd into this directory.
    - the folder now contain a pwn.txt, with pwn as content, despite the
      user not asking for any code execution.

Workaround:

    Set the configuration option
    c.TerminalInteractiveShell.term_title_format='IPython' (or to any
    other fixed, safe string).

CVE: CVE-2023-24816
Upstream-Status: Backport [https://github.com/ipython/ipython/commit/385d69325319a5972ee9b5983638e3617f21cb1f]
Signed-off-by: Gyorgy Sarvari <skandigraun@gmail.com>
---
 IPython/__init__.py       |  2 +-
 IPython/utils/terminal.py | 32 ++++++++------------------------
 2 files changed, 9 insertions(+), 25 deletions(-)

diff --git a/IPython/__init__.py b/IPython/__init__.py
index e12da90..20e6e48 100644
--- a/IPython/__init__.py
+++ b/IPython/__init__.py
@@ -62,7 +62,7 @@ __version__  = release.version
 version_info = release.version_info
 # list of CVEs that should have been patched in this release.
 # this is informational and should not be relied upon.
-__patched_cves__ = {"CVE-2022-21699"}
+__patched_cves__ = {"CVE-2022-21699", "CVE-2023-24816"}
 
 
 def embed_kernel(module=None, local_ns=None, **kwargs):
diff --git a/IPython/utils/terminal.py b/IPython/utils/terminal.py
index 49fd3fe..d884799 100644
--- a/IPython/utils/terminal.py
+++ b/IPython/utils/terminal.py
@@ -79,30 +79,14 @@ if os.name == 'posix':
         _set_term_title = _set_term_title_xterm
         _restore_term_title = _restore_term_title_xterm
 elif sys.platform == 'win32':
-    try:
-        import ctypes
-
-        SetConsoleTitleW = ctypes.windll.kernel32.SetConsoleTitleW
-        SetConsoleTitleW.argtypes = [ctypes.c_wchar_p]
-    
-        def _set_term_title(title):
-            """Set terminal title using ctypes to access the Win32 APIs."""
-            SetConsoleTitleW(title)
-    except ImportError:
-        def _set_term_title(title):
-            """Set terminal title using the 'title' command."""
-            global ignore_termtitle
-
-            try:
-                # Cannot be on network share when issuing system commands
-                curr = os.getcwd()
-                os.chdir("C:")
-                ret = os.system("title " + title)
-            finally:
-                os.chdir(curr)
-            if ret:
-                # non-zero return code signals error, don't try again
-                ignore_termtitle = True
+    import ctypes
+
+    SetConsoleTitleW = ctypes.windll.kernel32.SetConsoleTitleW
+    SetConsoleTitleW.argtypes = [ctypes.c_wchar_p]
+
+    def _set_term_title(title):
+        """Set terminal title using ctypes to access the Win32 APIs."""
+        SetConsoleTitleW(title)
 
 
 def set_term_title(title):