🛡️ CVE-2026-22871 — guarddog

🟠 CVSS 8.0 — High ✅ No Known Exploit CWE-22 OSV
8.0
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

GuardDog Path Traversal Vulnerability Leads to Arbitrary File Overwrite and RCE

Summary

A path traversal vulnerability exists in GuardDog's safe_extract() function that allows malicious PyPI packages to write arbitrary files outside the intended extraction directory, leading to Arbitrary File Overwrite and Remote Code Execution on systems running GuardDog.

CWE: CWE-22 (Improper Limitation of a Pathname to a Restricted Directory)

Details

Vulnerable Code

File: guarddog/utils/archives.py

```python

elif zipfile.is_zipfile(source_archive):

with zipfile.ZipFile(source_archive, "r") as zip:

for file in zip.namelist():

# Note: zip.extract cleans up any malicious file name

# such as directory traversal attempts This is not the

# case of zipfile.extractall

zip.extract(file, path=os.path.join(target_directory, file)) # ❌ VULNERABLE

```

Root Cause

The comment about zip.extract() fooled me at first :) then I noticed the os.path.join() call.

The vulnerability stems from incorrect usage of Python's zipfile.ZipFile.extract() API:

  • The path parameter should be the target directory, not a full file path
  • extract() automatically appends the member name to the path
  • By passing os.path.join(target_directory, file), GuardDog causes the filename to be appended twice
  • This breaks zipfile's built-in path traversal sanitization

Attack Vector

1. Attacker creates malicious wheel with path traversal filenames

2. Uploads to PyPI or distributes directly

3. Package scan: guarddog pypi scan malicious-pkg

4. GuardDog downloads and extracts the package

5. Malicious files written to arbitrary locations

6. Code execution could be achieved

Impact

Impact depends on how GuardDog is running and under which environment.

Critical Scenarios

1. Immediate Code Execution

  • Write to ~/.bashrc → executes on next shell
  • Write to ~/.profile → executes on login

2. Persistent Backdoors

  • Write to ~/.ssh/authorized_keys → SSH access
  • Write to /etc/cron.d/malicious → scheduled execution (if root)
  • Write to systemd user services → persistent execution

and more...

Credits

Reported by: Charbel (dwbruijn)

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. A user must be tricked into taking some action. Rated impact: confidentiality high, integrity high, availability high.

Weakness class

CVE-2026-22871 is classified as CWE-22: Path Traversal. A file path built from user input is not confined to the intended directory, letting an attacker reach files elsewhere on the filesystem.

Affected software

CVE-2026-22871 is recorded against 1 package.

  • guarddog (fixed in 2.7.1)

Timeline and source

Published on 13 January 2026 and last revised on 7 July 2026. No public exploit is currently recorded for this entry. A vendor advisory or fix has been published. Record sourced from OSV.

References

github.com (Web)
nvd.nist.gov (Advisory)
github.com (Web)
github.com (Package)

Details

Severity HIGH
CVSS Score 8.0
CVSS Vector CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
CWE CWE-22
Public Exploit ✅ No
Source OSV
Published 2026-01-13
Updated 2026-08-12
Modified 2026-07-07

Affected Packages

Software From version Fixed in
guarddog 2.7.1

Similar Threats

Site Security Check

Is guarddog part of your stack?

CVE-2026-22871 is rated CVSS 8.0 High. BotEraser scans your installation against known CVE records and tells you whether this vulnerability applies to the versions you actually run.

Scan My Site Free →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.