Skip to content

Add template for CVE-2026-53805 (NVIDIA SIL GEN3C Unauthenticated RCE) - #17289

Closed
comradezephyr wants to merge 3 commits into
projectdiscovery:mainfrom
comradezephyr:patch-2
Closed

comradezephyr wants to merge 3 commits into
projectdiscovery:mainfrom
comradezephyr:patch-2

Conversation

@comradezephyr

Copy link
Copy Markdown
Contributor

Description

This PR adds a template for CVE-2026-53805, an unauthenticated Remote Code Execution (RCE) vulnerability in the NVIDIA Spatial Intelligence Lab (SIL) GEN3C inference API server.

The vulnerability exists in the /request-inference and /seed-model endpoints, which deserialize raw HTTP request bodies using Python's pickle.loads() without authentication or input validation.

Payload Safety & Testing Notes

  • Non-Destructive Probe: The payload uses a safe, truncated pickle object {{hex_decode('80049505000000000000004e2e')}} containing PROTO/FRAME/NONE/STOP opcodes.
  • Detection Mechanism: When the server attempts to deserialize this payload, it safely fails and throws an UnpicklingError / pickle.loads traceback without executing any code.
  • Verification: The payload has been validated in a sandbox to confirm it triggers a safe unpickling error. metadata.verified is set to false as it has not been tested against a live, vulnerable, internet-facing GEN3C instance.
  • Local static validation (nuclei v3) passes with 0 errors.

References

@theamanrawat

Copy link
Copy Markdown
Contributor

Hi @comradezephyr, could you please update the template with the PoC to confirm RCE. Right now, it matches only the error and doesn't confirm code execution. Thank you!

@comradezephyr

Copy link
Copy Markdown
Contributor Author

Hi @theamanrawat ,

Thank you for the review! That is a great point. I’ve pushed a commit updating the template to confirm true RCE using an Out-of-Band (OOB) interactsh payload.

Technical context on the update:
Because {{interactsh-url}} has a dynamic length, injecting it into a modern binary Pickle object corrupts the string-length framing. To solve this safely, I downgraded the payload to Pickle Protocol 0 (ASCII).

Furthermore, to guarantee execution across any container environment, the payload uses Python's native urllib.request.urlopen instead of assuming curl or wget exist on the host OS.

Let me know if this looks good to go!

@comradezephyr

Copy link
Copy Markdown
Contributor Author

Hi @theamanrawat , I've pushed the requested commit downgrading to Pickle Protocol 0 (ASCII) and using urllib.request.urlopen for a safe, dynamic interactsh callback.

(Note: The CI pipeline threw an HttpError: Resource not accessible by integration on the weak-matcher-checks workflow due to fork token permissions, but the template itself is updated and ready for review).

@theamanrawat

Copy link
Copy Markdown
Contributor

Thank you so much. We tried to reproduce the POC, but it didn't work on our end. If you believe the template is correct, please share a vulnerable lab environment to templates@projectdiscovery.io.

@comradezephyr

Copy link
Copy Markdown
Contributor Author

Hi @theamanrawat ,

Thanks for testing it! Because the NVIDIA GEN3C API requires heavy GPU dependencies to spin up properly, and ML containers often lack networking/binaries for OOB callbacks, I just sent a Minimal Reproducible Environment (MRE) Docker lab to templates@projectdiscovery.io so you can verify the sink locally.

If interactsh remains unreliable depending on the container's OS, I can easily swap the template to use a Time-Based Blind RCE payload (time.sleep(6)) using Pickle Protocol 0 + dsl: duration>=6 matchers. That method requires zero external binaries or outbound network access.

Let me know what the team prefers after checking the email lab!

@comradezephyr

comradezephyr commented Sep 23, 2026

Copy link
Copy Markdown
Contributor Author

Vulnerable Lab Environment for CVE-2026-53805 (PR #17289)

P.S. I shared these details to templates@projectdiscovery.io too as instructed, sharing here too to expedite the process.

Hi @theamanrawat ,

The official GEN3C inference API requires heavy GPU dependencies and ML models to spin up locally, which often causes the build to fail or hang in standard testing environments. Furthermore, if the container doesn't have curl/wget installed or restricts outbound networking, OOB interactsh payloads will fail.

To make testing easy, here is a Minimal Reproducible Environment (MRE) using Docker that perfectly isolates the exact pickle.loads() sink on the /request-inference endpoint patched in commit db2ffe12.


1. Create app.py

from flask import Flask, request
import pickle

app = Flask(__name__)

@app.route('/request-inference', methods=['POST'])
def inference():
    # Vulnerable sink identical to GEN3C before patch db2ffe12
    data = request.get_data()
    pickle.loads(data)
    return "Inference complete", 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

2. Create Dockerfile

FROM python:3.9-slim
RUN pip install flask
COPY app.py /app.py
EXPOSE 8080
CMD ["python", "/app.py"]

3. Run It

docker build -t gen3c-vuln . && docker run -p 8080:8080 gen3c-vuln

If interactsh continues to fail due to environmental restrictions, I am happy to update the PR to use a Time-Based Matcher utilizing time.sleep(6) via Pickle Protocol 0, which guarantees confirmation of execution regardless of network egress rules.

Let me know how you'd like to proceed!

comradezephyr

@theamanrawat

Copy link
Copy Markdown
Contributor

Thank you so much for sharing the lab setup. However, this is a mock setup, and we do not accept templates validated in a mock environment. For this reason, we are closing this PR. Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants