CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-F2MF-Q878-GH58

Parsl Tongue: SQL Injection in Python Parallel Scripting Library

Amit Schendel
Amit Schendel
Senior Security Researcher

Feb 26, 2026·6 min read·19 visits

Executive Summary (TL;DR)

Unauthenticated SQL Injection in Parsl's monitoring dashboard allows attackers to read database contents via the `workflow_id` parameter. Patched in version 2026.01.05.

A classic SQL Injection vulnerability was discovered in the visualization component of Parsl (Python Parallel Scripting Library). The flaw exists within the monitoring dashboard, specifically where workflow IDs are processed. By manipulating the `workflow_id` parameter in URL routes, an unauthenticated attacker can inject arbitrary SQL commands. This allows for the exfiltration of monitoring data, potential Denial of Service (DoS) attacks against the backing SQLite database, and manipulation of the visualization interface.

The Hook: Scientific Computing Meets Web Security

Parsl is a heavy hitter in the world of scientific computing. It allows researchers to scale Python scripts from their laptop to massive supercomputers without rewriting code. It's the engine behind complex workflows in biology, physics, and astronomy. But even supercomputers need dashboards, and that's where parsl-visualize comes in.

This component provides a web-based interface (powered by Flask) to monitor the status of these massive distributed tasks. It tracks what ran, where it ran, and how long it took, storing all this juicy metadata in a local database (usually SQLite). It sounds benign—a local dashboard for local scientists.

However, developers often treat visualization tools like internal utilities, assuming they will never face the harsh light of the public internet. This assumption creates a blind spot. When you combine a web framework, a database, and user input, you have a recipe for disaster if you aren't careful. In this case, the disaster is a textbook SQL Injection that turns a monitoring tool into an open book.

The Flaw: Formatting Strings Like It's 1999

The vulnerability here is so classic it belongs in a museum. It stems from the use of Python's string formatting operator (%) to construct SQL queries. If you have taken a 'Security 101' class in the last two decades, you know that string concatenation and SQL are mortal enemies.

The developers of the parsl-visualize component needed to fetch details for specific workflows. They took the workflow_id from the URL and plugged it directly into a query string using the %s placeholder. Note: In Python's database API (DB-API), %s can be used for parameterized queries if passed correctly as a second argument. But here, they used the Python string operator, effectively pasting the user input directly into the SQL command before sending it to the database driver.

This bypasses all automatic escaping mechanisms. The database engine doesn't see a variable; it sees a modified SQL command. Because Parsl uses Pandas read_sql_query to fetch this data, the result is immediately processed into a DataFrame, but the damage is done the moment the query hits the engine.

The Code: The Smoking Gun

Let's look at the vulnerable code in parsl/monitoring/visualization/views.py. The offending function workflow_dag_details takes a workflow_id directly from the route decorator.

Vulnerable Implementation:

# The "Before" Code
# This is the digital equivalent of leaving your keys in the ignition.
 
def workflow_dag_details(workflow_id, path):
    # ... snip ...
    # DIRECT STRING INTERPOLATION - DANGER!
    query = """SELECT task.task_id, task.task_func_name,
                  task.task_status_name, task.task_time_returned
               FROM task
               WHERE task.run_id='%s'""" % (workflow_id)
    
    # The query is executed against the DB engine
    df_tasks = pd.read_sql_query(query, db.engine)
    # ... snip ...

As you can see, the workflow_id is spliced into the string. If workflow_id is abc, the query is fine. If workflow_id is ' OR 1=1;--, the query becomes valid SQL that returns everything.

The Fix (Commit 013a928461e7...):

The patch introduces SQLAlchemy's text() construct and proper parameter binding. This ensures the database driver handles the input as data, not executable code.

# The "After" Code
import sqlalchemy
 
def workflow_dag_details(workflow_id, path):
    # ... snip ...
    # Using bind parameters via :run_id
    query = """SELECT task.task_id, task.task_func_name,
                  task.task_status_name, task.task_time_returned
               FROM task
               WHERE task.run_id=:run_id"""
    
    # Passing params separately to read_sql_query
    df_tasks = pd.read_sql_query(
        sqlalchemy.text(query), 
        db.engine, 
        params={"run_id": workflow_id}
    )

The Exploit: Querying the Oracle

Exploiting this is trivial because the injection point is in the URL path, often a GET request. While the application expects a UUID-like string, we can feed it whatever we want.

The Attack Vector

The target endpoint follows the pattern /workflow/<workflow_id>/dag.

  1. Reconnaissance: We identify a Parsl instance. We try to access a workflow page.
  2. Injection: Instead of a valid ID, we inject a payload to break the query logic.

Payload Construction

Since the query is WHERE task.run_id='%s', we need to close the quote, inject our SQL, and comment out the rest.

  • Payload: ' OR '1'='1
  • Resulting Query: SELECT ... FROM task WHERE task.run_id='' OR '1'='1'

This returns every task in the database, potentially crashing the browser trying to render a DAG of a million nodes (a rudimentary DoS).

Data Exfiltration (UNION Based)

To steal data, we use a UNION attack. We need to match the number of columns in the original SELECT statement (4 columns based on the code snippet).

GET /workflow/' UNION SELECT 1, sql, 3, 4 FROM sqlite_master --/dag HTTP/1.1
Host: target-parsl-instance

This payload would attempt to dump the schema of the database into the visualization table, revealing table names and structures. From there, an attacker can iterate to dump specific rows from sensitive tables.

The Impact: Why Should We Panic?

You might argue, "It's just scientific metadata, who cares?" But in research environments, metadata is data.

  1. Intellectual Property: The names of functions (task_func_name) and the parameters passed to them often reveal the nature of proprietary algorithms or sensitive datasets being processed.
  2. Environment Leakage: Workflows often capture environment variables or arguments that might contain API keys, S3 bucket credentials, or database connection strings inadvertently passed to worker nodes.
  3. Denial of Service: Parsl monitoring databases can grow large. A query like SELECT * forced by an injection can cause the SQLite process to consume all available memory or disk I/O, locking up the monitoring node and potentially interfering with the head node's ability to manage the actual computation.

> [!WARNING] > While SQLite limits the damage (no DROP TABLE via stacked queries in standard Python drivers), the ability to read the entire database state is a critical confidentiality breach.

The Fix: Closing the Loop

The remediation is straightforward: Update Parsl to version 2026.01.05 or later.

The maintainers correctly identified that passing raw strings to Pandas is unsafe. They implemented SQLAlchemy's text() method, which creates a database-agnostic SQL expression, and used the params dictionary to safely bind user input. This shifts the burden of sanitization from the developer (who might forget) to the database driver (which is designed for this).

If you cannot upgrade immediately, you should restrict network access to the visualization port (typically mapped to localhost or an internal interface) using a firewall or SSH tunnel. Never expose the parsl-visualize interface to the public internet without an authentication proxy in front of it.

Official Patches

ParslGitHub Commit fixing the vulnerability

Fix Analysis (1)

Technical Appendix

CVSS Score
5.3/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
EPSS Probability
0.07%
Top 79% most exploited

Affected Systems

Parsl (Python Parallel Scripting Library) < 2026.01.05parsl-visualize monitoring dashboard

Affected Versions Detail

Product
Affected Versions
Fixed Version
Parsl
Parsl Project
< 2026.01.052026.01.05
AttributeDetail
CWE IDCWE-89
Attack VectorNetwork (Web)
CVSS v3.15.3 (Medium)
EPSS Score0.00068
ImpactConfidentiality (High), Availability (Low)
Exploit StatusPoC Available

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
CWE-89
SQL Injection

Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')

Known Exploits & Detection

NVDExploitability inferred from patch analysis.

Vulnerability Timeline

Vulnerability fixed in commit 013a928
2026-01-05
Public disclosure via GHSA and CVE
2026-01-08
NVD analysis complete
2026-01-20

References & Sources

  • [1]GitHub Advisory
  • [2]NVD Entry
Related Vulnerabilities
CVE-2026-21892

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 20 hours ago•GHSA-G72G-R7M4-9X4G
6.3

GHSA-G72G-R7M4-9X4G: Insufficient Session Expiration of OAuth Tokens in NocoDB

NocoDB is subject to an insufficient session expiration vulnerability where OAuth access and refresh tokens are not invalidated or revoked during security-sensitive actions such as password changes, forgot-password requests, or password resets. This allows an attacker possessing an active OAuth token to maintain unauthorized persistence.

Amit Schendel
Amit Schendel
4 views•6 min read
•about 22 hours ago•GHSA-FGMC-2HQJ-86V4
6.9

GHSA-FGMC-2HQJ-86V4: Default Administrative Credentials in vantage6-server

A vulnerability in the vantage6 federated learning framework allows unauthenticated remote attackers to gain administrative control of the server via hardcoded default credentials (root/root) when deployed under default configurations in versions 4.2.3 and below.

Amit Schendel
Amit Schendel
6 views•5 min read
•about 23 hours ago•GHSA-X9F6-9RVM-MMRG
6.9

GHSA-X9F6-9RVM-MMRG: Improper Access Control and Volume Mount Isolation Bypass in vantage6 Node

An improper access control vulnerability in the vantage6 node component allows concurrently running algorithm containers to read and modify sensitive input and output files of other tasks. The lack of strict workspace directory isolation exposes a significant attack surface in multi-tenant or federated environments where untrusted algorithms are executed.

Amit Schendel
Amit Schendel
3 views•4 min read
•1 day ago•CVE-2026-47760
8.7

CVE-2026-47760: Cross-Site Scripting (XSS) via SVG Namespace Sanitizer Bypass in TinyMCE

TinyMCE versions 6.8.0 through 7.0.1 contain a high-severity Cross-Site Scripting (XSS) vulnerability. The flaw exists in the custom HTML parser and sanitizer module, which incorrectly manages SVG namespace scopes when parsing nested elements. A low-privileged or unauthenticated attacker can submit a crafted HTML payload containing nested SVG structures to bypass sanitization filters, leading to arbitrary JavaScript execution in the context of the victim's browser session.

Alon Barad
Alon Barad
12 views•7 min read
•1 day ago•CVE-2026-47759
8.7

CVE-2026-47759: Stored Cross-Site Scripting (XSS) via Unsanitized data-mce-* Serialization Bypass in TinyMCE

CVE-2026-47759 is a critical stored Cross-Site Scripting (XSS) vulnerability affecting multiple active branches of the TinyMCE rich text editor. The flaw resides in the editor's handling of user-controlled, prefixed internal attributes, such as data-mce-href, data-mce-src, and data-mce-style. When processing raw HTML inputs, TinyMCE's internal validation schema neglects to inspect these custom prefixed attributes. During HTML serialization, the editor's engine extracts these unsanitized values and copies them back into standard executable attributes, overwriting any previously sanitized standard values and leading to execution of arbitrary code.

Amit Schendel
Amit Schendel
8 views•7 min read
•1 day ago•CVE-2026-47762
8.7

CVE-2026-47762: Stored Cross-Site Scripting (XSS) in TinyMCE Protect Pattern Restoration

A high-severity stored Cross-Site Scripting (XSS) vulnerability was identified in the TinyMCE rich text editor. The flaw exists in the handling of the 'protect' configuration option, where forged placeholder comments containing malicious payloads bypass the editor's sanitization routines and execute arbitrary JavaScript during serialization and content restoration.

Amit Schendel
Amit Schendel
7 views•8 min read