/

CVE-2026-61649

Severity:

HIGH RISK

(7.7)

SSRF (CWE-918) in SuiteCRM External Host Validation

CVE-2026-61649

Undergoing Analysis

Vulnerability type

Category:

Server-Side Request Forgery

CWE:

CWE-918

Impact:

Server-side requests to internal or otherwise restricted services

Severity:

HIGH RISK

(7.7)

CVSS version:

3.1

Catch this CVE while code is being written

Detect vulnerable code directly in pull requests, so CVEs are fixed before merge.

Summary

A hostname validation flaw in SuiteCRM's SSRF protection can let an authenticated attacker bypass checks by placing the server's hostname in a URL path. If the affected flow accepts that URL, the server may send requests to internal services.

A hostname validation flaw in SuiteCRM's SSRF protection can let an authenticated attacker bypass checks by placing the server's hostname in a URL path. If the affected flow accepts that URL, the server may send requests to internal services.

Affected context

The issue is in the external-host validation flow that calls validate_external_host() and isSelfRequest(). In affected releases before 7.15.2 and 8.10.2, the self-request check uses a case-insensitive substring comparison rather than comparing the parsed hostname for equality. Risk depends on whether an attacker can supply a URL that reaches this flow and what services the server can access.

The issue is in the external-host validation flow that calls validate_external_host() and isSelfRequest(). In affected releases before 7.15.2 and 8.10.2, the self-request check uses a case-insensitive substring comparison rather than comparing the parsed hostname for equality. Risk depends on whether an attacker can supply a URL that reaches this flow and what services the server can access.

Exploit preconditions

  • Attack surface: A SuiteCRM feature that validates and makes server-side requests to a supplied URL
  • Required access: An authenticated account with access to the relevant URL-handling feature
  • Trigger point: URL validation through validate_external_host() and isSelfRequest()
  • Why exploitation is possible: A substring match can treat the server hostname in a URL path as a self-request, bypassing intended IP validation
  • Attack surface: A SuiteCRM feature that validates and makes server-side requests to a supplied URL
  • Required access: An authenticated account with access to the relevant URL-handling feature
  • Trigger point: URL validation through validate_external_host() and isSelfRequest()
  • Why exploitation is possible: A substring match can treat the server hostname in a URL path as a self-request, bypassing intended IP validation

Why this happens

The validation logic uses a case-insensitive substring search (stripos()) where an exact comparison of the parsed hostname is needed. Because URL paths are attacker-controlled and distinct from the hostname, matching hostname text in a path can incorrectly influence a security-sensitive destination check. This is a server-side request forgery weakness, mapped to CWE-918.

The validation logic uses a case-insensitive substring search (stripos()) where an exact comparison of the parsed hostname is needed. Because URL paths are attacker-controlled and distinct from the hostname, matching hostname text in a path can incorrectly influence a security-sensitive destination check. This is a server-side request forgery weakness, mapped to CWE-918.

Potential impact

  • The server may make requests to internal services that are not directly reachable by the attacker
  • Responses from reachable services could expose sensitive information, depending on how the application handles them
  • Requests could trigger actions on internal services if those services accept them
  • The CRM server's network position could be misused to probe or interact with restricted systems
  • The server may make requests to internal services that are not directly reachable by the attacker
  • Responses from reachable services could expose sensitive information, depending on how the application handles them
  • Requests could trigger actions on internal services if those services accept them
  • The CRM server's network position could be misused to probe or interact with restricted systems

General mitigation guidance

Defensive patterns focus on validating the actual URL destination and limiting what the server can reach.

  • Parse URLs and compare normalized hostnames exactly; do not infer a destination from substring matches in the full URL
  • Resolve and validate destination addresses, including after redirects, against an explicit allowlist
  • Prefer secure-by-default designs that allow requests only to approved hosts and schemes
  • Treat user-supplied URLs as untrusted and avoid carrying attacker-controlled values into authorization or destination decisions
  • Restrict outbound network access and run services with only the privileges and network reach they require

Defensive patterns focus on validating the actual URL destination and limiting what the server can reach.

  • Parse URLs and compare normalized hostnames exactly; do not infer a destination from substring matches in the full URL
  • Resolve and validate destination addresses, including after redirects, against an explicit allowlist
  • Prefer secure-by-default designs that allow requests only to approved hosts and schemes
  • Treat user-supplied URLs as untrusted and avoid carrying attacker-controlled values into authorization or destination decisions
  • Restrict outbound network access and run services with only the privileges and network reach they require

How teams detect issues like this

  • Use static analysis to identify substring checks on complete URLs or hostname checks that do not operate on a parsed host component
  • Review URL validation and outbound-request code for discrepancies between validation and the final request destination
  • Check whether redirects, DNS resolution, and alternate URL forms are covered by the same destination policy
  • Enforce code-review or CI policies requiring explicit destination allowlists for server-side requests
  • Monitor outbound requests for unexpected access to private, loopback, or link-local address ranges
  • Use static analysis to identify substring checks on complete URLs or hostname checks that do not operate on a parsed host component
  • Review URL validation and outbound-request code for discrepancies between validation and the final request destination
  • Check whether redirects, DNS resolution, and alternate URL forms are covered by the same destination policy
  • Enforce code-review or CI policies requiring explicit destination allowlists for server-side requests
  • Monitor outbound requests for unexpected access to private, loopback, or link-local address ranges

Sources

SourceLink
github.comgithub.com/SuiteCRM/SuiteCRM-Core/commit/a11f50180d939f639cc468b5d536e8ad714dfb68
github.comgithub.com/SuiteCRM/SuiteCRM-Core/releases/tag/v8.10.2
github.comgithub.com/SuiteCRM/SuiteCRM/commit/d6bca97a0159ec019a969b86eca32affab3beb7c
github.comgithub.com/SuiteCRM/SuiteCRM/releases/tag/v7.15.2
github.comgithub.com/SuiteCRM/SuiteCRM/security/advisories/GHSA-r665-27q3-wvg8

Frequently asked

questions

The described attack requires authentication and access to a SuiteCRM feature that accepts a URL for a server-side request.

No. The risk arises because the SuiteCRM server may be able to reach services that are not directly accessible to the attacker.

Parse the URL and validate its normalized hostname and resolved destination against a strict allowlist. Avoid substring checks on the full URL.

Treat supplied URLs as untrusted, apply consistent destination checks to redirects and DNS resolution, and limit outbound network access to required destinations.

The described attack requires authentication and access to a SuiteCRM feature that accepts a URL for a server-side request.

No. The risk arises because the SuiteCRM server may be able to reach services that are not directly accessible to the attacker.

Parse the URL and validate its normalized hostname and resolved destination against a strict allowlist. Avoid substring checks on the full URL.

Treat supplied URLs as untrusted, apply consistent destination checks to redirects and DNS resolution, and limit outbound network access to required destinations.

Find out what's already
exploitable in your codebase.