diff --git a/corecrl-181216/coreclr-master/tests/scripts/crossgen_comparison.py b/corecrl-181216/coreclr-master/tests/scripts/crossgen_comparison.py index 77569a334a..feefb4b513 100644 --- a/corecrl-181216/coreclr-master/tests/scripts/crossgen_comparison.py +++ b/corecrl-181216/coreclr-master/tests/scripts/crossgen_comparison.py @@ -568,7 +568,26 @@ def dotnet_sdk_enumerate_assemblies(dotnet_sdk_dirname): def crossgen_dotnet_sdk(args): dotnet_sdk_dirname = tempfile.mkdtemp() with tarfile.open(args.dotnet_sdk_filename) as dotnet_sdk_tarfile: - dotnet_sdk_tarfile.extractall(dotnet_sdk_dirname) + def is_within_directory(directory, target): + + abs_directory = os.path.abspath(directory) + abs_target = os.path.abspath(target) + + prefix = os.path.commonprefix([abs_directory, abs_target]) + + return prefix == abs_directory + + def safe_extract(tar, path=".", members=None, *, numeric_owner=False): + + for member in tar.getmembers(): + member_path = os.path.join(path, member.name) + if not is_within_directory(path, member_path): + raise Exception("Attempted Path Traversal in Tar File") + + tar.extractall(path, members, numeric_owner=numeric_owner) + + + safe_extract(dotnet_sdk_tarfile, dotnet_sdk_dirname) il_corelib_filename = args.il_corelib_filename ni_files_dirname, debugging_files_dirname = create_output_folders() diff --git a/dotnet-3.0.0/coreclr/tests/scripts/crossgen_comparison.py b/dotnet-3.0.0/coreclr/tests/scripts/crossgen_comparison.py index 77569a334a..feefb4b513 100644 --- a/dotnet-3.0.0/coreclr/tests/scripts/crossgen_comparison.py +++ b/dotnet-3.0.0/coreclr/tests/scripts/crossgen_comparison.py @@ -568,7 +568,26 @@ def dotnet_sdk_enumerate_assemblies(dotnet_sdk_dirname): def crossgen_dotnet_sdk(args): dotnet_sdk_dirname = tempfile.mkdtemp() with tarfile.open(args.dotnet_sdk_filename) as dotnet_sdk_tarfile: - dotnet_sdk_tarfile.extractall(dotnet_sdk_dirname) + def is_within_directory(directory, target): + + abs_directory = os.path.abspath(directory) + abs_target = os.path.abspath(target) + + prefix = os.path.commonprefix([abs_directory, abs_target]) + + return prefix == abs_directory + + def safe_extract(tar, path=".", members=None, *, numeric_owner=False): + + for member in tar.getmembers(): + member_path = os.path.join(path, member.name) + if not is_within_directory(path, member_path): + raise Exception("Attempted Path Traversal in Tar File") + + tar.extractall(path, members, numeric_owner=numeric_owner) + + + safe_extract(dotnet_sdk_tarfile, dotnet_sdk_dirname) il_corelib_filename = args.il_corelib_filename ni_files_dirname, debugging_files_dirname = create_output_folders() diff --git a/dotnet-3.1.0/coreclr-3.1.0/tests/scripts/crossgen_comparison.py b/dotnet-3.1.0/coreclr-3.1.0/tests/scripts/crossgen_comparison.py index 77569a334a..feefb4b513 100644 --- a/dotnet-3.1.0/coreclr-3.1.0/tests/scripts/crossgen_comparison.py +++ b/dotnet-3.1.0/coreclr-3.1.0/tests/scripts/crossgen_comparison.py @@ -568,7 +568,26 @@ def dotnet_sdk_enumerate_assemblies(dotnet_sdk_dirname): def crossgen_dotnet_sdk(args): dotnet_sdk_dirname = tempfile.mkdtemp() with tarfile.open(args.dotnet_sdk_filename) as dotnet_sdk_tarfile: - dotnet_sdk_tarfile.extractall(dotnet_sdk_dirname) + def is_within_directory(directory, target): + + abs_directory = os.path.abspath(directory) + abs_target = os.path.abspath(target) + + prefix = os.path.commonprefix([abs_directory, abs_target]) + + return prefix == abs_directory + + def safe_extract(tar, path=".", members=None, *, numeric_owner=False): + + for member in tar.getmembers(): + member_path = os.path.join(path, member.name) + if not is_within_directory(path, member_path): + raise Exception("Attempted Path Traversal in Tar File") + + tar.extractall(path, members, numeric_owner=numeric_owner) + + + safe_extract(dotnet_sdk_tarfile, dotnet_sdk_dirname) il_corelib_filename = args.il_corelib_filename ni_files_dirname, debugging_files_dirname = create_output_folders() diff --git a/dotnet-5.0.0/runtime-5.0.0-rtm.20519.4/src/coreclr/tests/scripts/crossgen_comparison.py b/dotnet-5.0.0/runtime-5.0.0-rtm.20519.4/src/coreclr/tests/scripts/crossgen_comparison.py index 68a67ff72f..bb1677deaa 100644 --- a/dotnet-5.0.0/runtime-5.0.0-rtm.20519.4/src/coreclr/tests/scripts/crossgen_comparison.py +++ b/dotnet-5.0.0/runtime-5.0.0-rtm.20519.4/src/coreclr/tests/scripts/crossgen_comparison.py @@ -691,7 +691,26 @@ def dotnet_sdk_enumerate_assemblies(dotnet_sdk_dirname): async def crossgen_dotnet_sdk(args): dotnet_sdk_dirname = tempfile.mkdtemp() with tarfile.open(args.dotnet_sdk_filename) as dotnet_sdk_tarfile: - dotnet_sdk_tarfile.extractall(dotnet_sdk_dirname) + def is_within_directory(directory, target): + + abs_directory = os.path.abspath(directory) + abs_target = os.path.abspath(target) + + prefix = os.path.commonprefix([abs_directory, abs_target]) + + return prefix == abs_directory + + def safe_extract(tar, path=".", members=None, *, numeric_owner=False): + + for member in tar.getmembers(): + member_path = os.path.join(path, member.name) + if not is_within_directory(path, member_path): + raise Exception("Attempted Path Traversal in Tar File") + + tar.extractall(path, members, numeric_owner=numeric_owner) + + + safe_extract(dotnet_sdk_tarfile, dotnet_sdk_dirname) il_corelib_filename = args.il_corelib_filename ni_files_dirname, debugging_files_dirname = create_output_folders() diff --git a/dotnet-everything-181229/coreclr/tests/scripts/crossgen_comparison.py b/dotnet-everything-181229/coreclr/tests/scripts/crossgen_comparison.py index 77569a334a..feefb4b513 100644 --- a/dotnet-everything-181229/coreclr/tests/scripts/crossgen_comparison.py +++ b/dotnet-everything-181229/coreclr/tests/scripts/crossgen_comparison.py @@ -568,7 +568,26 @@ def dotnet_sdk_enumerate_assemblies(dotnet_sdk_dirname): def crossgen_dotnet_sdk(args): dotnet_sdk_dirname = tempfile.mkdtemp() with tarfile.open(args.dotnet_sdk_filename) as dotnet_sdk_tarfile: - dotnet_sdk_tarfile.extractall(dotnet_sdk_dirname) + def is_within_directory(directory, target): + + abs_directory = os.path.abspath(directory) + abs_target = os.path.abspath(target) + + prefix = os.path.commonprefix([abs_directory, abs_target]) + + return prefix == abs_directory + + def safe_extract(tar, path=".", members=None, *, numeric_owner=False): + + for member in tar.getmembers(): + member_path = os.path.join(path, member.name) + if not is_within_directory(path, member_path): + raise Exception("Attempted Path Traversal in Tar File") + + tar.extractall(path, members, numeric_owner=numeric_owner) + + + safe_extract(dotnet_sdk_tarfile, dotnet_sdk_dirname) il_corelib_filename = args.il_corelib_filename ni_files_dirname, debugging_files_dirname = create_output_folders()