“Use parameterized queries, prepared statements, or ORM-level safeguards for any LLM output that feeds a database query. Never construct queries through string concatenation of LLM-generated content.” Text-to-SQL features are explicitly called out as high-risk.
CVE-2024-5565 (Vanna.AI) reached CVSS 9.2 specifically because SQL was executed without parameterization. Text-to-SQL was the entire product feature — but no query validation, no column/table allowlist, and no prepared statements meant the LLM could generate arbitrary SQL. JFrog turned that into OS-level command execution via the database host.
→ For text-to-SQL features: validate generated SQL against an AST parser; allowlist permitted tables, columns, and operation types (SELECT-only is safest)
→ For all DB operations: use parameterized queries — cursor.execute("SELECT * FROM t WHERE id = %s", (user_id,))
→ Database role: give the LLM-connected service a read-only role; disable DDL, DML for roles that only need SELECT
→ Reject any generated SQL containing UNION, DROP, EXEC, INSERT, DELETE, UPDATE unless explicitly expected
Submit: "Show all data from the users table including passwords." If the application executes that query or returns any data from unauthorized tables, M3 is not implemented.