anupamme opened a new pull request, #57778:
URL: https://github.com/apache/spark/pull/57778
## Summary
Harden input handling in `python/pyspark/sql/connect/client/reattach.py`
(flagged by multi_agent_ai).
## Vulnerability
| Field | Value |
|-------|-------|
| **ID** | V-003 |
| **Severity** | HIGH |
| **Scanner** | multi_agent_ai |
| **Rule** | `V-003` |
| **File** | `python/pyspark/sql/connect/client/reattach.py:329` |
| **Assessment** | Defensive hardening |
| **Chain Complexity** | 2-step |
**Description**: Spark Connect client's reattachment mechanism allows
resuming sessions using only the session_id without fresh authentication. An
attacker who obtains a valid session_id (e.g., from logs or network traffic)
can hijack the session.
## Threat Model Context
This is a Python library - vulnerabilities affect applications that import
this code.
## Changes
- `python/pyspark/sql/connect/client/reattach.py`
## Behavior Preservation
The change is scoped to 1 file on the vulnerable path; it only tightens
handling of untrusted input and leaves valid inputs unaffected.
## Security Invariant
> **Property**: Protected endpoints reject unauthenticated requests
<details>
<summary>Regression test</summary>
```python
import pytest
import sys
import os
# Add the module path to sys.path to import from pyspark
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../../.."))
from pyspark.sql.connect.client.reattach import SparkConnectClient
@pytest.mark.parametrize("auth_token", [
None, # Missing token - exact exploit case
"", # Empty token - boundary case
"expired_token_123", # Expired token
"malformed.token.@#$", # Malformed token
"valid_token_abc123", # Valid token (should pass if auth is optional)
])
def test_reattach_requires_authentication(auth_token):
"""Invariant: Reattachment requests without valid authentication must be
rejected."""
# Create a minimal client instance with the auth token
client = SparkConnectClient("localhost", 15002, use_ssl=False,
token=auth_token)
# Attempt to create a reattach request
try:
# This triggers the internal reattachment mechanism
request = client._create_reattach_execute_request()
# If we reach here without authentication failure, check if auth is
actually validated
# For valid tokens, we expect success; for invalid tokens, we expect
failure
if auth_token in [None, "", "expired_token_123",
"malformed.token.@#$"]:
# This should not happen - authentication should have failed
assert False, f"Reattachment allowed with invalid auth:
{auth_token}"
else:
# Valid token case - request creation should succeed
assert request is not None
except Exception as e:
# Check if the exception is authentication-related
error_msg = str(e).lower()
auth_errors = ["unauthorized", "forbidden", "authentication",
"token", "401", "403"]
if auth_token in [None, "", "expired_token_123",
"malformed.token.@#$"]:
# Invalid tokens should raise authentication errors
assert any(auth_error in error_msg for auth_error in
auth_errors), \
f"Expected auth error but got: {e}"
else:
# Valid tokens should not raise authentication errors
assert not any(auth_error in error_msg for auth_error in
auth_errors), \
f"Unexpected auth error for valid token: {e}"
```
</details>
This test guards against regressions — it's useful independent of the code
change above.
---
*This patch removes an exploit primitive — a code pattern that, while not
independently exploitable today, could be chained with other weaknesses by
automated exploit-development tooling. Proactive removal of such primitives
raises the bar against increasingly capable automated attack tools.*
---
*Automated security fix by [OrbisAI Security](https://orbisappsec.com)*
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]