|
|
"""
|
|
|
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
|
|
|
import time
|
|
|
|
|
|
|
|
|
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}")')
|
|
|
# 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""
|
|
|
|