File: cve.py

package info (click to toggle)
ipython 9.8.0-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 8,624 kB
  • sloc: python: 45,268; sh: 317; makefile: 168
file content (66 lines) | stat: -rw-r--r-- 1,999 bytes parent folder | download
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
"""
Test that CVEs stay fixed.
"""

from IPython.utils.tempdir import TemporaryDirectory, TemporaryWorkingDirectory
from pathlib import Path
import random
import sys
import os
import string
import subprocess


def test_cve_2022_21699():
    """
    Here we test CVE-2022-21699.

    We create a temporary directory, cd into it.
    Make a profile file that should not be executed and start IPython in a subprocess,
    checking for the value.



    """

    dangerous_profile_dir = Path("profile_default")

    dangerous_startup_dir = dangerous_profile_dir / "startup"
    dangerous_expected = "CVE-2022-21699-" + "".join(
        [random.choice(string.ascii_letters) for i in range(10)]
    )

    with TemporaryWorkingDirectory() as t:
        dangerous_startup_dir.mkdir(parents=True)
        (dangerous_startup_dir / "foo.py").write_text(
            f'print("{dangerous_expected}")', encoding="utf-8"
        )
        # 1 sec to make sure FS is flushed.
        # time.sleep(1)
        cmd = [sys.executable, "-m", "IPython"]
        env = os.environ.copy()
        env["IPY_TEST_SIMPLE_PROMPT"] = "1"

        # First we fake old behavior, making sure the profile is/was actually dangerous
        p_dangerous = subprocess.Popen(
            cmd + [f"--profile-dir={dangerous_profile_dir}"],
            env=env,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
        )
        out_dangerous, err_dangerouns = p_dangerous.communicate(b"exit\r")
        assert dangerous_expected in out_dangerous.decode()

        # Now that we know it _would_ have been dangerous, we test it's not loaded
        p = subprocess.Popen(
            cmd,
            env=env,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
        )
        out, err = p.communicate(b"exit\r")
        assert b"IPython" in out
        assert dangerous_expected not in out.decode()
        assert err == b""