Parsl Monitoring Visualization Vulnerable to SQL Injection
Description
Parsl is a Python parallel scripting library. A SQL Injection vulnerability exists in the parsl-visualize component of versions prior to 2026.01.05. The application constructs SQL queries using unsafe string formatting (Python % operator) with user-supplied input (workflow_id) directly from URL routes. This allows an unauthenticated attacker with access to the visualization dashboard to inject arbitrary SQL commands, potentially leading to data exfiltration or denial of service against the monitoring database. Version 2026.01.05 fixes the issue.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
parslPyPI | < 2026.01.05 | 2026.01.05 |
Affected products
1Patches
1013a928461e7Switch two visualization views to safer SQL parameter style (#4049)
1 file changed · +8 −6
parsl/monitoring/visualization/views.py+8 −6 modified@@ -1,4 +1,5 @@ import pandas as pd +import sqlalchemy from flask import current_app as app from flask import render_template @@ -143,9 +144,9 @@ def workflow_dag_details(workflow_id, path): FROM status WHERE status.task_id = task.task_id and status.run_id = task.run_id ) - WHERE task.run_id='%s'""" % (workflow_id) + WHERE task.run_id=:run_id""" - df_tasks = pd.read_sql_query(query, db.engine) + df_tasks = pd.read_sql_query(sqlalchemy.text(query), db.engine, params={"run_id": workflow_id}) group_by_apps = (path == "group_by_apps") return render_template('dag.html', @@ -166,10 +167,11 @@ def workflow_resources(workflow_id): message="Workflow %s does not have any resource usage records." % workflow_id) df_task = queries.tasks_for_workflow(workflow_id, db.engine) - df_task_tries = pd.read_sql_query("""SELECT task.task_id, task_func_name, - task_try_time_launched, task_try_time_running, task_try_time_returned from task, try - WHERE task.task_id = try.task_id AND task.run_id='%s' and try.run_id='%s'""" - % (workflow_id, workflow_id), db.engine) + + query = """SELECT task.task_id, task_func_name, + task_try_time_launched, task_try_time_running, task_try_time_returned from task, try + WHERE task.task_id = try.task_id AND task.run_id=:run_id and try.run_id=task.run_id""" + df_task_tries = pd.read_sql_query(query, db.engine, params={"run_id": workflow_id}) df_node = queries.nodes_for_workflow(workflow_id, db.engine) return render_template('resource_usage.html', workflow_details=workflow_details,
Vulnerability mechanics
Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
4- github.com/advisories/GHSA-f2mf-q878-gh58ghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2026-21892ghsaADVISORY
- github.com/Parsl/parsl/commit/013a928461e70f38a33258bd525a351ed828e974ghsax_refsource_MISCWEB
- github.com/Parsl/parsl/security/advisories/GHSA-f2mf-q878-gh58ghsax_refsource_CONFIRMWEB
News mentions
0No linked articles in our index yet.