Skip to content

🛡️ Sentinel: [CRITICAL] Fix SQL injection vulnerability in PRAGMA query#89

Open
mattjoyce wants to merge 1 commit into
mainfrom
sentinel-fix-sql-injection-pragma-8083646188786366617
Open

🛡️ Sentinel: [CRITICAL] Fix SQL injection vulnerability in PRAGMA query#89
mattjoyce wants to merge 1 commit into
mainfrom
sentinel-fix-sql-injection-pragma-8083646188786366617

Conversation

@mattjoyce
Copy link
Copy Markdown
Owner

🛡️ Sentinel: [CRITICAL] Fix SQL injection vulnerability in PRAGMA query

Severity: CRITICAL
Vulnerability: The function sqliteColumnExists in internal/storage/sqlite.go used fmt.Sprintf to concatenate the table argument directly into a PRAGMA table_info(%s); SQL query string. This is a classic SQL injection vulnerability if the table parameter ever receives untrusted input, because PRAGMA statements in SQLite do not support bind parameters. Test files had the same string interpolation practice.
Impact: While currently the table arguments might come from trusted internal schemas, static analysis and automated security scanners correctly flag this as a critical SQL injection risk. Any future refactor allowing user input to this function would result in full SQL injection leading to database compromise.
Fix: Replaced the unsafe string interpolation with the SQLite table-valued function pragma_table_info(?), which acts like a normal table and safely supports prepared statement parameter binding. Updated tests to use the same parameterized format.
Verification: Ran go test -v ./internal/storage/... to verify SQLite functions still correctly interrogate schemas and table info. Tests pass.
Learning: Documented the security pattern regarding SQLite PRAGMA vs pragma_table_info(?) in .jules/sentinel.md to prevent future re-introduction of this vulnerability.


PR created automatically by Jules for task 8083646188786366617 started by @mattjoyce

**Severity:** CRITICAL
**Vulnerability:** The function `sqliteColumnExists` in `internal/storage/sqlite.go` used `fmt.Sprintf` to concatenate the `table` argument directly into a `PRAGMA table_info(%s);` SQL query string. This is a classic SQL injection vulnerability if the table parameter ever receives untrusted input, because `PRAGMA` statements in SQLite do not support bind parameters. Test files had the same string interpolation practice.
**Impact:** While currently the `table` arguments might come from trusted internal schemas, static analysis and automated security scanners correctly flag this as a critical SQL injection risk. Any future refactor allowing user input to this function would result in full SQL injection leading to database compromise.
**Fix:** Replaced the unsafe string interpolation with the SQLite table-valued function `pragma_table_info(?)`, which acts like a normal table and safely supports prepared statement parameter binding. Updated tests to use the same parameterized format.
**Verification:** Ran `go test -v ./internal/storage/...` to verify SQLite functions still correctly interrogate schemas and table info. Tests pass.
**Learning:** Documented the security pattern regarding SQLite PRAGMA vs `pragma_table_info(?)` in `.jules/sentinel.md` to prevent future re-introduction of this vulnerability.

Co-authored-by: mattjoyce <278869+mattjoyce@users.noreply.github.com>
@google-labs-jules
Copy link
Copy Markdown
Contributor

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

mattjoyce added a commit that referenced this pull request Jun 6, 2026
mattjoyce added a commit that referenced this pull request Jun 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant