Skip to content
Open
Show file tree
Hide file tree
Changes from 3 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
181 changes: 181 additions & 0 deletions nettacker/modules/vuln/langflow_cve_2026_33017.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
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, which processes
attacker-controlled flow node definitions instead of using only the stored
flow data. The official fix in 1.9.0 removes this behavior entirely, ignoring
attacker-supplied node data and building only the stored (empty) flow.
This module detects the vulnerable input-validation flaw by submitting a
uniquely-identified CustomComponent node and checking whether the server's
build-event stream references it. Testing against 1.8.2 (vulnerable) and
1.9.0 (patched) shows: vulnerable instances process and reference the
injected node (visible as processing errors); patched instances discard
it before processing (empty vertex list in events). This confirms the
vulnerability's root cause (improper input handling); it does not
independently verify code execution. Non-destructive detection suitable
for production scanning.
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:
# Step 1: Obtain unauthenticated access token via AUTO_LOGIN (default enabled)
# Uses capturing group to extract actual token value from response
- method: get
timeout: 5
headers:
User-Agent: Nettacker
ssl: false
url:
nettacker_fuzzer:
input_format: "{{schema}}://{target}:{{ports}}/api/v1/auto_login"
response:
save_to_temp_events_only: token
condition_type: and
conditions:
status_code:
regex: "200"
reverse: false
content:
# Capturing group: extract actual token string from "access_token":"<value>"
regex: '"access_token":"([^"]*)"'
reverse: false
Comment thread
coderabbitai[bot] marked this conversation as resolved.

# Step 2: Create a public flow (required to obtain flow_id for build endpoint)
# Uses capturing group to extract actual flow UUID
- method: post
timeout: 5
headers:
User-Agent: Nettacker
Content-Type: application/json
Authorization: "Bearer dependent_on_temp_event[0]['content'][0]"
ssl: false
json:
name: nettacker_check
data:
nodes: []
edges: []
access_type: PUBLIC

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Remove the public flow after detection

Whenever authentication and flow creation succeed, this request persists a nettacker_check flow with PUBLIC access, but the module has no cleanup request on either the successful or failed detection path. Repeated production scans therefore modify the target and accumulate publicly accessible artifacts despite the module's non-destructive claim; delete the created flow after the check.

Useful? React with 👍 / 👎.

url:
nettacker_fuzzer:
input_format: "{{schema}}://{target}:{{ports}}/api/v1/flows/"
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:
# Capturing group: extract actual flow UUID from "id":"<uuid>"
regex: '"id":"([a-f0-9\-]{36})"'
reverse: false

# Step 3: Submit attacker-controlled flow data to build_public_tmp
# On vulnerable versions, this node data is accepted and processed.
# On patched versions, it is silently discarded before graph construction.
# Uses capturing group to extract actual job UUID
- 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
json:
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
edges: []
url:
nettacker_fuzzer:
input_format: "{{schema}}://{target}:{{ports}}/api/v1/build_public_tmp/dependent_on_temp_event[1]['content'][0]/flow"
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:
# Capturing group: extract actual job UUID from "job_id":"<uuid>"
regex: '"job_id":"([a-f0-9\-]{36})"'
reverse: false

# Step 4: Poll build-event stream to detect vulnerable behavior
# Vulnerable (1.8.2): server processes our injected node, error mentions our node id
# Patched (1.9.0): server discards our node, builds only empty flow (empty vertices list)
# Detection signal: presence of our distinctive node id in any event (error or otherwise)
# vs. absence/empty vertices list (patched). This confirms the endpoint processes
# attacker-supplied node data on vulnerable versions only.
- method: get
timeout: 15

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.

According to the CVE only 2 seconds timeout should be sufficient ? (GHSA-vwmf-pq79-vjvx)

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"
response:
dependent_on_temp_event: "token,flow_id,job_id"
condition_type: and
conditions:
status_code:
regex: "200"
reverse: false
content:
# Match detection: our injected node id appears anywhere in event stream
# (vulnerable versions reference it during processing; patched versions ignore it)
regex: nettacker_vuln_check
reverse: false

# Step 5: Cleanup - Delete the created flow to avoid accumulating test artifacts
- 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]"
response:
dependent_on_temp_event: "token,flow_id"
condition_type: or
conditions:
status_code:
regex: "20[0-4]"
reverse: false
content:
regex: "deleted|Deleted|success"
reverse: true
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated