Overview
CVE-2026-4230 exposes a SQL injection vulnerability in vanna-ai when used with Flask, specifically through the update_sql path in the Endpoint component (src/vanna/legacy/flask/__init__.py). The vulnerability maps to CWE-74 and CWE-89, reflecting improper handling and binding of user-supplied data in SQL statements. An attacker can leverage remote HTTP requests to manipulate the underlying SQL executed by the application, potentially extracting data, modifying records, or executing additional statements. The public disclosure of this vulnerability increases the risk surface for any deployment using vulnerable vanna-ai versions, and the report notes that the vendor did not respond to disclosure efforts. In real Flask code paths, this class of vulnerability emerges when endpoints interpolate untrusted input into raw SQL strings instead of using parameter binding or ORM abstractions. The impact can be severe in applications that expose administrative or user data operations without proper input handling.
Affected Versions
vanna-ai up to 2.0.2
Code Fix Example
Flask API Security Remediation
Vulnerable pattern (Flask + Raw SQL, vulnerable):\nfrom flask import Flask, request\nimport sqlite3\n\napp = Flask('__name__')\n\ndef get_db():\n return sqlite3.connect('app.db')\n\[email protected]('/update', methods=['POST'])\ndef update_status_vuln():\n user_id = request.form['user_id']\n status = request.form['status']\n conn = get_db()\n cur = conn.cursor()\n sql = "UPDATE users SET status = '" + status + "' WHERE id = " + user_id\n cur.execute(sql)\n conn.commit()\n conn.close()\n return 'OK'\n\n# Safe pattern using parameterized queries\[email protected]('/update_safe', methods=['POST'])\ndef update_status_safe():\n user_id = request.form['user_id']\n status = request.form['status']\n conn = get_db()\n cur = conn.cursor()\n sql = "UPDATE users SET status = ? WHERE id = ?"\n cur.execute(sql, (status, user_id))\n conn.commit()\n conn.close()\n return 'OK'