610c0ebc9d
## Summary - Refactors SSRF protection from a request-level adapter to connection-level agents, validating resolved IPs in `createConnection` + socket `lookup` events - Sets both `httpAgent` and `httpsAgent` so validation applies regardless of protocol switches during redirects - Caps `maxRedirects` to 10 as defense in depth ## Test plan - [x] All 59 existing + new unit tests pass (agent util, isPrivateIp, service) - [x] No linter errors - [ ] Verify webhook delivery still works with URLs that redirect - [ ] Verify image upload from external URLs still works (relies on redirect following) Made with [Cursor](https://cursor.com) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Changes core outbound HTTP security behavior and redirect handling, which could impact webhook/image-fetch flows and connection semantics despite improved SSRF coverage. > > **Overview** > Refactors outbound SSRF protection from a custom axios `adapter` to connection-level `httpAgent`/`httpsAgent` created by new `createSsrfSafeAgent`, which blocks private IP literals up front and validates DNS-resolved IPs via the socket `lookup` event. > > When safe mode is enabled, `SecureHttpClientService.getHttpClient` now always installs both agents and enforces a capped `maxRedirects` (default `5`), and the old `getSecureAxiosAdapter` implementation/tests/types are removed. `isPrivateIp` is tightened/expanded to treat `0.0.0.0/8` as private and avoid misclassifying bare IPv4 decimals as IPv6. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 8261da4ff05ba3bca3318ad647c04faf6603d91a. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Cursor <cursoragent@cursor.com>