GHSA-cq46-m9x9-j8w2
Scapy Session Loading Vulnerable to Arbitrary Code Execution via Untrusted Pickle Deserialization
GHSA-cq46-m9x9-j8w2 is a medium vulnerability (CVSS 5.4) in scapy, published October 22, 2025. No source lists public exploit code. No source names a fixed version.
- Severity
- 5.4 MediumCVSS 4.0, GitHub Advisories
- Exploit chance
- UnscoredNo EPSS score yet
- Exploitation
- None knownNot on CISA’s or ENISA’s lists
- Fixed in
- No fix listedNo source names one
Description
Summary
An unsafe deserialization vulnerability in Scapy <v2.7.0 allows attackers to execute arbitrary code when a malicious session file is locally loaded via the -s option. This requires convincing a user to manually load a malicious session file.
Details
Scapy’s interactive shell supports session loading using gzip-compressed pickle files:
./run_scapy -s <session_file.pkl.gz>
Internally, this triggers:
# main.py
SESSION = pickle.load(gzip.open(session_name, "rb"))
Since no validation or restriction is performed on the deserialized object, any code embedded via __reduce__() will be executed immediately. This makes it trivial for an attacker to drop a malicious .pkl.gz in a shared folder and have it executed by unsuspecting users.
The vulnerability exists in the load_session function, which deserializes data using pickle.load() on .pkl.gz files provided via the -s CLI flag or programmatically through conf.session.
Affected lines in source code: https://github.com/secdev/scapy/blob/master/scapy/main.py#L569-L572
try:
s = pickle.load(gzip.open(fname, "rb"))
except IOError:
try:
s = pickle.load(open(fname, "rb"))
Impact
This is a classic deserialization vulnerability which leads to Code Execution (CE) when untrusted data is deserialized.
Any user who can trick another user into loading a crafted .pkl.gz session file (e.g. via -s option) can execute arbitrary Python code.
- Vulnerability type: Insecure deserialization (Python
pickle) - CWE: CWE-502: Deserialization of Untrusted Data
- CVSS v4.0 Vector:
CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N - CVSS Score: 5.4 (Medium)
- Impact: Arbitrary Code Execution
- Attack vector: Local or supply chain (malicious
.pkl.gz) - Affected users: Any user who loads session files (even interactively)
- Affected version: Scapy v2.6.1
Mitigations
- Do not use 'sessions' (the -s option when launching Scapy).
- Use the Scapy 2.7.0+ where the session mechanism has been removed.
Attack profile
How easy it is to exploit
- Attack vector
- Local
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- Active
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- High
Affected packages
| Package | Affected | Fixed |
|---|---|---|
scapyPyPI | through 2.6.1 | None known |
scapyPyPI | through 2.6.1, plus listed versions 2.2.0-dev2.3.12.3.22.3.32.4.0 Show 23 moreShow less2.4.0rc32.4.0rc42.4.0rc52.4.12.4.22.4.32.4.3rc12.4.3rc22.4.3rc32.4.3rc42.4.42.4.4rc12.4.4rc22.4.52.4.5rc12.4rc22.5.02.5.0rc12.5.0rc22.5.0rc32.6.02.6.0rc12.6.0rc2 | None known |
What each source reports
GitHub Advisories Score used 5.4
Scapy Session Loading Vulnerable to Arbitrary Code Execution via Untrusted Pickle Deserialization
Summary
An unsafe deserialization vulnerability in Scapy <v2.7.0 allows attackers to execute arbitrary code when a malicious session file is locally loaded via the -s option. This requires convincing a user to manually load a malicious session file.
Details
Scapy’s interactive shell supports session loading using gzip-compressed pickle files:
./run_scapy -s <session_file.pkl.gz>
Internally, this triggers:
# main.py
SESSION = pickle.load(gzip.open(session_name, "rb"))
Since no validation or restriction is performed on the deserialized object, any code embedded via __reduce__() will be executed immediately. This makes it trivial for an attacker to drop a malicious .pkl.gz in a shared folder and have it executed by unsuspecting users.
The vulnerability exists in the load_session function, which deserializes data using pickle.load() on .pkl.gz files provided via the -s CLI flag or programmatically through conf.session.
Affected lines in source code: https://github.com/secdev/scapy/blob/master/scapy/main.py#L569-L572
try:
s = pickle.load(gzip.open(fname, "rb"))
except IOError:
try:
s = pickle.load(open(fname, "rb"))
Impact
This is a classic deserialization vulnerability which leads to Code Execution (CE) when untrusted data is deserialized.
Any user who can trick another user into loading a crafted .pkl.gz session file (e.g. via -s option) can execute arbitrary Python code.
- Vulnerability type: Insecure deserialization (Python
pickle) - CWE: CWE-502: Deserialization of Untrusted Data
- CVSS v4.0 Vector:
CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N - CVSS Score: 5.4 (Medium)
- Impact: Arbitrary Code Execution
- Attack vector: Local or supply chain (malicious
.pkl.gz) - Affected users: Any user who loads session files (even interactively)
- Affected version: Scapy v2.6.1
Mitigations
- Do not use 'sessions' (the -s option when launching Scapy).
- Use the Scapy 2.7.0+ where the session mechanism has been removed.
- Record
GHSA-cq46-m9x9-j8w2- CVSS 4.0
- 5.4 Medium
CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N - Weakness
- CWE-502
- Updated
- 2026-11-02
OSV 5.4
Scapy Session Loading Vulnerable to Arbitrary Code Execution via Untrusted Pickle Deserialization
Summary
An unsafe deserialization vulnerability in Scapy <v2.7.0 allows attackers to execute arbitrary code when a malicious session file is locally loaded via the -s option. This requires convincing a user to manually load a malicious session file.
Details
Scapy’s interactive shell supports session loading using gzip-compressed pickle files:
./run_scapy -s <session_file.pkl.gz>
Internally, this triggers:
# main.py
SESSION = pickle.load(gzip.open(session_name, "rb"))
Since no validation or restriction is performed on the deserialized object, any code embedded via __reduce__() will be executed immediately. This makes it trivial for an attacker to drop a malicious .pkl.gz in a shared folder and have it executed by unsuspecting users.
The vulnerability exists in the load_session function, which deserializes data using pickle.load() on .pkl.gz files provided via the -s CLI flag or programmatically through conf.session.
Affected lines in source code: https://github.com/secdev/scapy/blob/master/scapy/main.py#L569-L572
try:
s = pickle.load(gzip.open(fname, "rb"))
except IOError:
try:
s = pickle.load(open(fname, "rb"))
Impact
This is a classic deserialization vulnerability which leads to Code Execution (CE) when untrusted data is deserialized.
Any user who can trick another user into loading a crafted .pkl.gz session file (e.g. via -s option) can execute arbitrary Python code.
- Vulnerability type: Insecure deserialization (Python
pickle) - CWE: CWE-502: Deserialization of Untrusted Data
- CVSS v4.0 Vector:
CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N - CVSS Score: 5.4 (Medium)
- Impact: Arbitrary Code Execution
- Attack vector: Local or supply chain (malicious
.pkl.gz) - Affected users: Any user who loads session files (even interactively)
- Affected version: Scapy v2.6.1
Mitigations
- Do not use 'sessions' (the -s option when launching Scapy).
- Use the Scapy 2.7.0+ where the session mechanism has been removed.
- Record
GHSA-cq46-m9x9-j8w2- CVSS 4.0
- 5.4 Medium
CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N - Weakness
- CWE-502
- Updated
- 2026-11-02
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | GitHub Advisories, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.