Skip to content

fix(providers): harden MariaDB query filters - #49

Closed
bherila wants to merge 10 commits into
mainfrom
codex/fix-sql-injection-vulnerability-in-temps
Closed

bherila wants to merge 10 commits into
mainfrom
codex/fix-sql-injection-vulnerability-in-temps

Conversation

@bherila

@bherila bherila commented Aug 15, 2026

Copy link
Copy Markdown
Owner

Motivation

  • The data-browser allowed attacker-controlled where fragments to be concatenated into MariaDB SQL and, when combined with the workspace sqlx downgrade, exposed a viable SQL exfiltration primitive.
  • The existing denylist missed token-bounded constructs such as SELECT subqueries and MariaDB error-producing XML functions, and query error details were echoed to callers, which could leak sensitive database responses.

Description

  • Reject token-bounded SELECT subqueries and MariaDB error-producing functions by adding select, extractvalue, and updatexml to the validate_where_clause checks and switching to a token-aware matcher implemented as contains_sql_keyword.
  • Improve the validate_where_clause logic to use contains_sql_keyword(...) so keywords are matched as tokens rather than via naive substring checks.
  • Stop returning raw DB error text and the SQL statement to clients by replacing the provider DataError::QueryFailed payload with a generic message and by sanitizing problem details in the HTTP handler so QueryFailed responses say Query failed; check server logs for details.
  • Add regression unit tests covering rejected subqueries, extractvalue/updatexml, and sleep(...) expressions and update CHANGELOG.md under ## [Unreleased] with a short entry describing the fix.

Testing

  • Ran cargo fmt --all --check which succeeded.
  • Ran cargo test -p temps-providers validates_where_clause --lib -- --nocapture which passed (1 passed).
  • Ran cargo check -p temps-providers --lib which completed successfully.

Codex Task

bherila and others added 10 commits August 15, 2026 07:46
Runs cargo check + lib tests on the tempsdev1 self-hosted runner for
pushes to main/feature/**/fix/** and manual dispatch. Scoped to push
and workflow_dispatch only (never pull_request/pull_request_target) so
fork PRs can never execute on the self-hosted host. Uses a persistent,
isolated CARGO_TARGET_DIR outside the runner work dir so the build
cache survives checkout cleans and is reused across runs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A warm CARGO_TARGET_DIR caches the example plugins' build-script fingerprint,
so after actions/checkout git-cleans the source tree the script is skipped and
include_dir!(".../web/dist") panics on the missing dir. Recreate the debug
placeholder assets up front so the check is independent of build-script cache.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
temps-cli embeds crates/temps-cli/dist via include_dir!; like the example
plugins its build.rs placeholder is skipped on a warm cache, so generalize the
prep step to cover every include_dir! dist target, not just the plugins.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…vy crates

cargo test --lib --workspace pulled in temps-domains' real-Pebble ACME tests,
which need a challenge-responder network this box can't provide. Match the
unit-a/unit-b crate list from rust-tests.yml instead (Docker+networking-heavy
crates run in hosted's dedicated integration jobs, not here).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Its local_provider tests launch a real bundled Chromium against live
example.com/github.com. The hosted ubuntu-latest image ships
google-chrome system-wide so headless_chrome reuses it; this self-hosted
box has no system browser, so headless_chrome auto-downloads one and the
parallel tests race on the binary (Text file busy) and debug ports (no
available ports between 8000 and 9000). It is a live-network browser
integration test, not a unit test, and hosted CI already covers it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The tempsdev1 EC2 runner it targeted has been decommissioned (no
self-hosted runners are registered on this repo anymore), so every
push to main/feature/**/fix/** was queuing a job with nothing to pick
it up. Hosted CI (rust-tests.yml) already covers push and PR on
ubuntu-latest.
cargo fetch --locked warms the registry/deps cache synchronously, then
a full `cargo build --workspace --all-targets` kicks off in the
background (nohup, disowned) so opening the codespace isn't blocked
on it -- by the time you start editing, the workspace is already
compiled or close to it.
Full workspace builds/tests can pin every core and several GB of RAM
for minutes on this 51-crate workspace. Check load/memory before
running them locally, and prefer pushing to let hosted CI validate
when the box is already under load.
…ents

A single load check right before launching a build isn't enough when
multiple worktrees or subagents share a box -- builds kicked off
seconds apart can each pass the check and then land together, and a
few concurrent full/release builds is enough to thrash a shared host
(swap, OOM, runaway load). Re-check right before the build starts and
default to assuming something else may already be building.
@bherila
bherila force-pushed the codex/fix-sql-injection-vulnerability-in-temps branch from 5dcb4e5 to c1fa306 Compare August 15, 2026 07:46
@github-actions

Copy link
Copy Markdown

📓 Changelog preview

This is what your commits will add to the generated CHANGELOG.md at release time (via git-cliff). Do not edit CHANGELOG.md by hand — it is generated from your Conventional Commit messages.

## [Unreleased]

### Added

- **devcontainer:** Prefetch cargo deps and background-build on create

### CI

- **self-hosted:** Add build/test workflow on push to bherila fork
- **self-hosted:** Recreate example-plugin web/dist before cargo check
- **self-hosted:** Also recreate temps-cli/dist placeholder
- **self-hosted:** Run hosted unit-test crate set, skip integration-heavy crates
- **self-hosted:** Exclude temps-screenshots live-browser tests

### Documentation

- Add local resource-awareness guidance to CLAUDE.md
- Emphasize local resource awareness with concurrent worktrees/agents

### Fixed

- **providers:** Harden MariaDB query filters

### Miscellaneous

- **ci:** Remove dead self-hosted-ci workflow

@bherila

bherila commented Oct 11, 2026

Copy link
Copy Markdown
Owner Author

This proposal was superseded by fork PR #53, whose functional changes were included in merged upstream gotempsh#677. Upstream gotempsh#676 explicitly records this supersession.

Fork main has now been fast-forwarded to upstream main at 7250ab59b38d3138014ade7f5d6391c856eaa4f7. Closing this obsolete fork PR as part of the upstream synchronization; its branch history is retained.

@bherila bherila closed this Oct 11, 2026
@bherila
bherila deleted the codex/fix-sql-injection-vulnerability-in-temps branch October 11, 2026 19:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant