{"id":"GHSA-78m5-jpmf-ch7v","summary":"GuardDog vulnerable to arbitrary file write when scanning a specially-crafted remote PyPI package","details":"### Summary\n\nUnsafe extracting using `shutil.unpack_archive()` from a remotely retrieved tarball may lead to writing the extracted file to an unintended destination.\n\n### Details\n\nExtracting files using `shutil.unpack_archive()` from a potentially malicious tarball without validating that the destination file path is within the intended destination directory can cause files outside the destination directory to be overwritten.  \n\nThe vulnerable code snippet is between [L153..158](https://github.com/DataDog/guarddog/blob/a1d064ceb09d39bb28deb6972bc0a278756ea91f/guarddog/scanners/package_scanner.py#L153..158). \n\n```python\nresponse = requests.get(url, stream=True)\n\nwith open(zippath, \"wb\") as f:\n      f.write(response.raw.read())\n\nshutil.unpack_archive(zippath, unzippedpath)\n```\nIt seems that a remotely retrieved tarball which could be with the extension `.tar.gz` happens to be unpacked using `shutil.unpack_archive()` with no destination verification/limitation of the extracted files.\n\n### PoC\n\nThe PoC provided showcases the risk of extracting the non-harmless text file `sim4n6.txt` to a parent location rather than the current folder. \n\n```bash\n\u003e tar --list -f archive.tar\ntar: Removing leading `../../../' from member names\n../../../sim4n6.txt\n\n\u003e python3 \nPython 3.10.6 (main, Nov  2 2022, 18:53:38) [GCC 11.3.0] on linux\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n\u003e\u003e\u003e import shutil\n\u003e\u003e\u003e shutil.unpack_archive(\"archive.tar\")\n\u003e\u003e\u003e exit()\n\n\u003e file ../../../sim4n6.txt\n../../../sim4n6.txt: ASCII text\n```\n\n### A Potential Attack Scenario\n\n- An attacker may craft a malicious tarball with a filename path, such as `../../../../../../../../etc/passwd`, and then serve the archive remotely, thus, providing a possibility to overwrite the system files.\n\n### Mitigation\n\nPotential mitigation could be to:\n- Use a safer module, like `zipfile`.\n- Validate the location of the extracted files and discard those with malicious paths such as a relative path `..` or absolute ones. ","aliases":["CVE-2022-23530","PYSEC-2022-42993"],"modified":"2024-11-20T05:37:45.239747Z","published":"2022-12-05T23:34:43Z","database_specific":{"severity":"LOW","github_reviewed":true,"github_reviewed_at":"2022-12-05T23:34:43Z","nvd_published_at":"2022-12-16T23:15:00Z","cwe_ids":["CWE-22"]},"references":[{"type":"WEB","url":"https://github.com/DataDog/guarddog/security/advisories/GHSA-78m5-jpmf-ch7v"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2022-23530"},{"type":"WEB","url":"https://github.com/DataDog/guarddog/commit/37c7d0767ba28f4df46117d478f97652594c491c"},{"type":"PACKAGE","url":"https://github.com/DataDog/guarddog"},{"type":"WEB","url":"https://github.com/DataDog/guarddog/blob/a1d064ceb09d39bb28deb6972bc0a278756ea91f/guarddog/scanners/package_scanner.py#L153..158"},{"type":"WEB","url":"https://github.com/pypa/advisory-database/tree/main/vulns/guarddog/PYSEC-2022-42993.yaml"}],"affected":[{"package":{"name":"guarddog","ecosystem":"PyPI","purl":"pkg:pypi/guarddog"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.1.8"}]}],"versions":["0.1.1","0.1.3","0.1.4","0.1.5","0.1.6","0.1.7"],"database_specific":{"last_known_affected_version_range":"\u003c= 0.1.7","source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2022/12/GHSA-78m5-jpmf-ch7v/GHSA-78m5-jpmf-ch7v.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:L"},{"type":"CVSS_V4","score":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:L/VI:L/VA:L/SC:L/SI:L/SA:L"}]}