You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Multiple security and robustness fixes across the library: switch client login to POST and add client-side rate limiting with exponential backoff; make login_with_mfa use the same rate limiting; add require_https option to fail on plain HTTP in non-localhost environments. Harden webhooks and MCP server: use constant-time key comparison (secure_compare), stop logging invalid webhook keys, enforce JSON size and nesting limits, default MCP bind to 127.0.0.1, add optional MCP API key auth (X-MCP-API-Key), and limit MCP payload parsing. Prevent remote code execution by blocking dangerous tool methods (moved to Parse::Agent::Tools and validated at call time) and fix load-order crashes. Improve logging safety by redacting sensitive fields from request/response logs. Improve caching safety by hashing session tokens (SHA-256 prefix) for cache keys. Harden query/aggregation handling by validating field names and blocking dangerous pipeline stages and $where usage. Fix transaction rollback tracking by keying original states by object_id. Update tests to be deterministic and adapt to behavior changes. Bump version to 3.3.2.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+30Lines changed: 30 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,35 @@
1
1
## Parse-Stack Changelog
2
2
3
+
### 3.3.2
4
+
5
+
#### Security Fixes
6
+
7
+
-**FIXED**: Login now uses POST instead of GET, preventing passwords from appearing in server logs, browser history, and URL query parameters.
8
+
-**FIXED**: Webhook key comparison now uses constant-time `ActiveSupport::SecurityUtils.secure_compare` to prevent timing attacks. Invalid webhook keys are no longer logged.
9
+
-**FIXED**: MCP server default binding changed from `0.0.0.0` to `127.0.0.1`, preventing unintended network exposure.
10
+
-**FIXED**: Field names in queries are now validated to block MongoDB operator injection (`$where`, `$function`, etc.).
11
+
-**FIXED**: Aggregation pipelines now block dangerous stages (`$out`, `$merge`) and `$where` operators inside `$match` stages.
12
+
-**FIXED**: Sensitive fields (passwords, tokens, auth data) are now redacted from debug log output.
13
+
-**NEW**: Client-side login rate limiting with exponential backoff after repeated failures to mitigate brute force attacks.
14
+
-**FIXED**: Session tokens in cache keys are now hashed with SHA-256 instead of stored as plaintext.
15
+
-**NEW**: MCP server now supports API key authentication via `MCP_API_KEY` env var or `api_key:` parameter. Requests must include `X-MCP-API-Key` header when configured.
16
+
-**FIXED**: JSON payloads in webhooks and MCP server are now limited to 1 MB size and 20 levels of nesting depth to prevent denial-of-service attacks.
17
+
-**FIXED**: Tool method invocation in MCP server now blocks dangerous methods (`eval`, `exec`, `system`, `send`, `method`, `binding`, etc.) to prevent code execution via user-controlled method names.
18
+
-**FIXED**: Blocked methods list moved to always-loaded `Parse::Agent::Tools` module, fixing load-order crash when MCP server is not enabled.
19
+
-**FIXED**: Login rate limiter is now thread-safe (Mutex-protected) with periodic cleanup of expired entries to prevent memory leaks.
20
+
-**FIXED**: MCP server now explicitly requires ActiveSupport modules, preventing load-order failures.
21
+
-**FIXED**: Session token cache key hash increased from 16 to 32 hex characters (128 bits) to reduce collision risk.
22
+
-**FIXED**: MCP `/tools` endpoint now requires API key authentication when configured, preventing unauthenticated schema enumeration.
23
+
-**FIXED**: Response body logging is now redacted alongside request logging, preventing session tokens from appearing in debug output.
24
+
-**NEW**: `require_https` option for `Parse::Client` raises an error when HTTP is used with a non-localhost server URL. Enable via `require_https: true` or `PARSE_REQUIRE_HTTPS=true`.
25
+
-**FIXED**: `login_with_mfa` now applies the same rate limiting and exponential backoff as the standard `login` method.
26
+
-**FIXED**: Aggregation pipeline blocklist expanded to also block `$function`, `$accumulator`, `$collMod`, `$createIndex`, and `$dropIndex` stages.
27
+
28
+
#### Bug Fixes
29
+
30
+
-**FIXED**: `Parse::Object.transaction` now correctly assigns `objectId`, `createdAt`, and `updatedAt` to all objects in the batch. Previously, only the first unsaved object received its server-assigned ID because `Parse::Object#hash` treats all unsaved objects as equal, causing Hash key collisions in the internal tracking map.
31
+
-**FIXED**: `AggregateTestComment` and `AggregateTestPost` test models now use `belongs_to` for pointer fields instead of `property :object`, which caused Parse Server schema mismatch errors when saving pointer values.
0 commit comments