CVE-2026-100169 (GCVE-0-2026-100169)
Vulnerability from cvelistv5
Published
2026-10-14 16:01
Modified
2026-10-16 15:31
CWE
  • CWE-287 - Improper Authentication
Summary
Improper Authentication in the social account linking path of the Prowler API in Prowler from 5.4.0 before 5.35.0 allows a remote unauthenticated attacker to obtain persistent access to the account of a user who has not yet registered, because ProwlerSocialAccountAdapter.pre_social_login() in api/src/backend/api/adapters.py links a Google or GitHub login to any existing local account that has the same email address as the one returned by the provider, without requiring that the address has been verified by the provider or on the existing account, and without any other check that both accounts belong to the same person. Self registration is open and the new account is usable at once, because UserViewSet.get_permissions() in api/src/backend/api/v1/views.py grants AllowAny to the create action, ACCOUNT_EMAIL_VERIFICATION is set to none in api/src/backend/config/settings/social_login.py, and the Django ModelBackend checks only the password and is_active, not the django-allauth EmailAddress record. An attacker who registers an email address before its owner keeps the password set at registration after the link is made, because sociallogin.connect() does not reset the password and does not disable the existing account, and the owner who later signs in with Google or GitHub is logged into the attacker's account. django-allauth makes the same email based link on its own, because SOCIALACCOUNT_EMAIL_AUTHENTICATION and SOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT are both set to True in the same settings module. This gives the attacker the cloud provider credentials, scan findings and tenant memberships held in the account.
Impacted products
Vendor Product Version
Prowler Prowler Version: 5.4.0   ≤
Create a notification for this product.
Show details on NVD website


{
  "containers": {
    "adp": [
      {
        "metrics": [
          {
            "other": {
              "content": {
                "id": "CVE-2026-100169",
                "options": [
                  {
                    "Exploitation": "none"
                  },
                  {
                    "Automatable": "no"
                  },
                  {
                    "Technical Impact": "total"
                  }
                ],
                "role": "CISA Coordinator",
                "timestamp": "2026-10-16T15:25:38.278060Z",
                "version": "2.0.3"
              },
              "type": "ssvc"
            }
          }
        ],
        "providerMetadata": {
          "dateUpdated": "2026-10-16T15:31:52.042Z",
          "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
          "shortName": "CISA-ADP"
        },
        "title": "CISA ADP Vulnrichment"
      }
    ],
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "modules": [
            "Prowler API"
          ],
          "product": "Prowler",
          "programFiles": [
            "api/src/backend/api/adapters.py",
            "api/src/backend/config/settings/social_login.py",
            "api/src/backend/api/v1/views.py"
          ],
          "repo": "https://github.com/prowler-cloud/prowler",
          "vendor": "Prowler",
          "versions": [
            {
              "lessThan": "5.35.0",
              "status": "affected",
              "version": "5.4.0",
              "versionType": "semver"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:a:prowler:prowler:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "5.35.0",
                  "versionStartIncluding": "5.4.0",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ],
          "operator": "OR"
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "finder",
          "value": "Nacho Garc\u00eda Egea"
        },
        {
          "lang": "en",
          "type": "analyst",
          "value": "Dar\u00edo Rivas"
        },
        {
          "lang": "en",
          "type": "analyst",
          "value": "Xo\u00e1n M. Otero Jorge"
        },
        {
          "lang": "en",
          "type": "coordinator",
          "value": "Secur0 CNA"
        },
        {
          "lang": "en",
          "type": "remediation developer",
          "value": "Prowler Cloud Security Team"
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "Improper Authentication in the social account linking path of the Prowler API in Prowler from 5.4.0 before 5.35.0 allows a remote unauthenticated attacker to obtain persistent access to the account of a user who has not yet registered, because \u003ccode\u003eProwlerSocialAccountAdapter.pre_social_login()\u003c/code\u003e in \u003ccode\u003eapi/src/backend/api/adapters.py\u003c/code\u003e links a Google or GitHub login to any existing local account that has the same email address as the one returned by the provider, without requiring that the address has been verified by the provider or on the existing account, and without any other check that both accounts belong to the same person. Self registration is open and the new account is usable at once, because \u003ccode\u003eUserViewSet.get_permissions()\u003c/code\u003e in \u003ccode\u003eapi/src/backend/api/v1/views.py\u003c/code\u003e grants \u003ccode\u003eAllowAny\u003c/code\u003e to the \u003ccode\u003ecreate\u003c/code\u003e action, \u003ccode\u003eACCOUNT_EMAIL_VERIFICATION\u003c/code\u003e is set to \u003ccode\u003enone\u003c/code\u003e in \u003ccode\u003eapi/src/backend/config/settings/social_login.py\u003c/code\u003e, and the Django \u003ccode\u003eModelBackend\u003c/code\u003e checks only the password and \u003ccode\u003eis_active\u003c/code\u003e, not the django-allauth \u003ccode\u003eEmailAddress\u003c/code\u003e record. An attacker who registers an email address before its owner keeps the password set at registration after the link is made, because \u003ccode\u003esociallogin.connect()\u003c/code\u003e does not reset the password and does not disable the existing account, and the owner who later signs in with Google or GitHub is logged into the attacker\u0027s account. django-allauth makes the same email based link on its own, because \u003ccode\u003eSOCIALACCOUNT_EMAIL_AUTHENTICATION\u003c/code\u003e and \u003ccode\u003eSOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT\u003c/code\u003e are both set to \u003ccode\u003eTrue\u003c/code\u003e in the same settings module. This gives the attacker the cloud provider credentials, scan findings and tenant memberships held in the account."
            }
          ],
          "value": "Improper Authentication in the social account linking path of the Prowler API in Prowler from 5.4.0 before 5.35.0 allows a remote unauthenticated attacker to obtain persistent access to the account of a user who has not yet registered, because ProwlerSocialAccountAdapter.pre_social_login() in api/src/backend/api/adapters.py links a Google or GitHub login to any existing local account that has the same email address as the one returned by the provider, without requiring that the address has been verified by the provider or on the existing account, and without any other check that both accounts belong to the same person. Self registration is open and the new account is usable at once, because UserViewSet.get_permissions() in api/src/backend/api/v1/views.py grants AllowAny to the create action, ACCOUNT_EMAIL_VERIFICATION is set to none in api/src/backend/config/settings/social_login.py, and the Django ModelBackend checks only the password and is_active, not the django-allauth EmailAddress record. An attacker who registers an email address before its owner keeps the password set at registration after the link is made, because sociallogin.connect() does not reset the password and does not disable the existing account, and the owner who later signs in with Google or GitHub is logged into the attacker\u0027s account. django-allauth makes the same email based link on its own, because SOCIALACCOUNT_EMAIL_AUTHENTICATION and SOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT are both set to True in the same settings module. This gives the attacker the cloud provider credentials, scan findings and tenant memberships held in the account."
        }
      ],
      "metrics": [
        {
          "cvssV4_0": {
            "Automatable": "NOT_DEFINED",
            "Recovery": "NOT_DEFINED",
            "Safety": "NOT_DEFINED",
            "attackComplexity": "LOW",
            "attackRequirements": "PRESENT",
            "attackVector": "NETWORK",
            "baseScore": 7.6,
            "baseSeverity": "HIGH",
            "exploitMaturity": "NOT_DEFINED",
            "privilegesRequired": "NONE",
            "providerUrgency": "NOT_DEFINED",
            "subAvailabilityImpact": "NONE",
            "subConfidentialityImpact": "NONE",
            "subIntegrityImpact": "NONE",
            "userInteraction": "PASSIVE",
            "valueDensity": "NOT_DEFINED",
            "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N",
            "version": "4.0",
            "vulnAvailabilityImpact": "NONE",
            "vulnConfidentialityImpact": "HIGH",
            "vulnIntegrityImpact": "HIGH",
            "vulnerabilityResponseEffort": "NOT_DEFINED"
          },
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-287",
              "description": "CWE-287 Improper Authentication",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-10-14T16:01:59.909Z",
        "orgId": "4daa8cea-433a-44bd-9456-53b127fc289a",
        "shortName": "Secur0"
      },
      "references": [
        {
          "tags": [
            "patch"
          ],
          "url": "https://github.com/prowler-cloud/prowler/commit/0f31f1a3c2daa05b4d77a78f451e3fbfb3fe3411"
        },
        {
          "tags": [
            "patch"
          ],
          "url": "https://github.com/prowler-cloud/prowler/pull/12013"
        },
        {
          "tags": [
            "release-notes"
          ],
          "url": "https://github.com/prowler-cloud/prowler/releases/tag/5.35.0"
        },
        {
          "tags": [
            "related"
          ],
          "url": "https://github.com/prowler-cloud/prowler/security/advisories/GHSA-h8m9-jgf8-vwvp"
        },
        {
          "tags": [
            "third-party-advisory",
            "technical-description"
          ],
          "url": "https://secur0.com/en/cna/cve-list/cve-2026-100169-prowler-account-pre-hijacking"
        }
      ],
      "solutions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "Upgrade to Prowler 5.35.0 or later. Affected versions have no environment variable or setting to disable self registration or to require email verification."
            }
          ],
          "value": "Upgrade to Prowler 5.35.0 or later. Affected versions have no environment variable or setting to disable self registration or to require email verification."
        }
      ],
      "source": {
        "discovery": "EXTERNAL"
      },
      "tags": [
        "x_open-source"
      ],
      "title": "Account pre-hijacking in the Prowler API through email based social account linking without verification",
      "x_generator": {
        "engine": "Vulnogram 1.0.5"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "4daa8cea-433a-44bd-9456-53b127fc289a",
    "assignerShortName": "Secur0",
    "cveId": "CVE-2026-100169",
    "datePublished": "2026-10-14T16:01:59.909Z",
    "dateReserved": "2026-09-25T13:10:49.476Z",
    "dateUpdated": "2026-10-16T15:31:52.042Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "vulnrichment": {
      "containers": "{\"adp\": [{\"title\": \"CISA ADP Vulnrichment\", \"metrics\": [{\"other\": {\"type\": \"ssvc\", \"content\": {\"id\": \"CVE-2026-100169\", \"role\": \"CISA Coordinator\", \"options\": [{\"Exploitation\": \"none\"}, {\"Automatable\": \"no\"}, {\"Technical Impact\": \"total\"}], \"version\": \"2.0.3\", \"timestamp\": \"2026-10-16T15:25:38.278060Z\"}}}], \"providerMetadata\": {\"orgId\": \"134c704f-9b21-4f2e-91b3-4a467353bcc0\", \"shortName\": \"CISA-ADP\", \"dateUpdated\": \"2026-10-16T15:29:32.483Z\"}}], \"cna\": {\"tags\": [\"x_open-source\"], \"title\": \"Account pre-hijacking in the Prowler API through email based social account linking without verification\", \"source\": {\"discovery\": \"EXTERNAL\"}, \"credits\": [{\"lang\": \"en\", \"type\": \"finder\", \"value\": \"Nacho Garc\\u00eda Egea\"}, {\"lang\": \"en\", \"type\": \"analyst\", \"value\": \"Dar\\u00edo Rivas\"}, {\"lang\": \"en\", \"type\": \"analyst\", \"value\": \"Xo\\u00e1n M. Otero Jorge\"}, {\"lang\": \"en\", \"type\": \"coordinator\", \"value\": \"Secur0 CNA\"}, {\"lang\": \"en\", \"type\": \"remediation developer\", \"value\": \"Prowler Cloud Security Team\"}], \"metrics\": [{\"format\": \"CVSS\", \"cvssV4_0\": {\"Safety\": \"NOT_DEFINED\", \"version\": \"4.0\", \"Recovery\": \"NOT_DEFINED\", \"baseScore\": 7.6, \"Automatable\": \"NOT_DEFINED\", \"attackVector\": \"NETWORK\", \"baseSeverity\": \"HIGH\", \"valueDensity\": \"NOT_DEFINED\", \"vectorString\": \"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N\", \"exploitMaturity\": \"NOT_DEFINED\", \"providerUrgency\": \"NOT_DEFINED\", \"userInteraction\": \"PASSIVE\", \"attackComplexity\": \"LOW\", \"attackRequirements\": \"PRESENT\", \"privilegesRequired\": \"NONE\", \"subIntegrityImpact\": \"NONE\", \"vulnIntegrityImpact\": \"HIGH\", \"subAvailabilityImpact\": \"NONE\", \"vulnAvailabilityImpact\": \"NONE\", \"subConfidentialityImpact\": \"NONE\", \"vulnConfidentialityImpact\": \"HIGH\", \"vulnerabilityResponseEffort\": \"NOT_DEFINED\"}, \"scenarios\": [{\"lang\": \"en\", \"value\": \"GENERAL\"}]}], \"affected\": [{\"repo\": \"https://github.com/prowler-cloud/prowler\", \"vendor\": \"Prowler\", \"modules\": [\"Prowler API\"], \"product\": \"Prowler\", \"versions\": [{\"status\": \"affected\", \"version\": \"5.4.0\", \"lessThan\": \"5.35.0\", \"versionType\": \"semver\"}], \"programFiles\": [\"api/src/backend/api/adapters.py\", \"api/src/backend/config/settings/social_login.py\", \"api/src/backend/api/v1/views.py\"], \"defaultStatus\": \"unaffected\"}], \"solutions\": [{\"lang\": \"en\", \"value\": \"Upgrade to Prowler 5.35.0 or later. Affected versions have no environment variable or setting to disable self registration or to require email verification.\", \"supportingMedia\": [{\"type\": \"text/html\", \"value\": \"Upgrade to Prowler 5.35.0 or later. Affected versions have no environment variable or setting to disable self registration or to require email verification.\", \"base64\": false}]}], \"references\": [{\"url\": \"https://github.com/prowler-cloud/prowler/commit/0f31f1a3c2daa05b4d77a78f451e3fbfb3fe3411\", \"tags\": [\"patch\"]}, {\"url\": \"https://github.com/prowler-cloud/prowler/pull/12013\", \"tags\": [\"patch\"]}, {\"url\": \"https://github.com/prowler-cloud/prowler/releases/tag/5.35.0\", \"tags\": [\"release-notes\"]}, {\"url\": \"https://github.com/prowler-cloud/prowler/security/advisories/GHSA-h8m9-jgf8-vwvp\", \"tags\": [\"related\"]}, {\"url\": \"https://secur0.com/en/cna/cve-list/cve-2026-100169-prowler-account-pre-hijacking\", \"tags\": [\"third-party-advisory\", \"technical-description\"]}], \"x_generator\": {\"engine\": \"Vulnogram 1.0.5\"}, \"descriptions\": [{\"lang\": \"en\", \"value\": \"Improper Authentication in the social account linking path of the Prowler API in Prowler from 5.4.0 before 5.35.0 allows a remote unauthenticated attacker to obtain persistent access to the account of a user who has not yet registered, because ProwlerSocialAccountAdapter.pre_social_login() in api/src/backend/api/adapters.py links a Google or GitHub login to any existing local account that has the same email address as the one returned by the provider, without requiring that the address has been verified by the provider or on the existing account, and without any other check that both accounts belong to the same person. Self registration is open and the new account is usable at once, because UserViewSet.get_permissions() in api/src/backend/api/v1/views.py grants AllowAny to the create action, ACCOUNT_EMAIL_VERIFICATION is set to none in api/src/backend/config/settings/social_login.py, and the Django ModelBackend checks only the password and is_active, not the django-allauth EmailAddress record. An attacker who registers an email address before its owner keeps the password set at registration after the link is made, because sociallogin.connect() does not reset the password and does not disable the existing account, and the owner who later signs in with Google or GitHub is logged into the attacker\u0027s account. django-allauth makes the same email based link on its own, because SOCIALACCOUNT_EMAIL_AUTHENTICATION and SOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT are both set to True in the same settings module. This gives the attacker the cloud provider credentials, scan findings and tenant memberships held in the account.\", \"supportingMedia\": [{\"type\": \"text/html\", \"value\": \"Improper Authentication in the social account linking path of the Prowler API in Prowler from 5.4.0 before 5.35.0 allows a remote unauthenticated attacker to obtain persistent access to the account of a user who has not yet registered, because \u003ccode\u003eProwlerSocialAccountAdapter.pre_social_login()\u003c/code\u003e in \u003ccode\u003eapi/src/backend/api/adapters.py\u003c/code\u003e links a Google or GitHub login to any existing local account that has the same email address as the one returned by the provider, without requiring that the address has been verified by the provider or on the existing account, and without any other check that both accounts belong to the same person. Self registration is open and the new account is usable at once, because \u003ccode\u003eUserViewSet.get_permissions()\u003c/code\u003e in \u003ccode\u003eapi/src/backend/api/v1/views.py\u003c/code\u003e grants \u003ccode\u003eAllowAny\u003c/code\u003e to the \u003ccode\u003ecreate\u003c/code\u003e action, \u003ccode\u003eACCOUNT_EMAIL_VERIFICATION\u003c/code\u003e is set to \u003ccode\u003enone\u003c/code\u003e in \u003ccode\u003eapi/src/backend/config/settings/social_login.py\u003c/code\u003e, and the Django \u003ccode\u003eModelBackend\u003c/code\u003e checks only the password and \u003ccode\u003eis_active\u003c/code\u003e, not the django-allauth \u003ccode\u003eEmailAddress\u003c/code\u003e record. An attacker who registers an email address before its owner keeps the password set at registration after the link is made, because \u003ccode\u003esociallogin.connect()\u003c/code\u003e does not reset the password and does not disable the existing account, and the owner who later signs in with Google or GitHub is logged into the attacker\u0027s account. django-allauth makes the same email based link on its own, because \u003ccode\u003eSOCIALACCOUNT_EMAIL_AUTHENTICATION\u003c/code\u003e and \u003ccode\u003eSOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT\u003c/code\u003e are both set to \u003ccode\u003eTrue\u003c/code\u003e in the same settings module. This gives the attacker the cloud provider credentials, scan findings and tenant memberships held in the account.\", \"base64\": false}]}], \"problemTypes\": [{\"descriptions\": [{\"lang\": \"en\", \"type\": \"CWE\", \"cweId\": \"CWE-287\", \"description\": \"CWE-287 Improper Authentication\"}]}], \"cpeApplicability\": [{\"nodes\": [{\"negate\": false, \"cpeMatch\": [{\"criteria\": \"cpe:2.3:a:prowler:prowler:*:*:*:*:*:*:*:*\", \"vulnerable\": true, \"versionEndExcluding\": \"5.35.0\", \"versionStartIncluding\": \"5.4.0\"}], \"operator\": \"OR\"}], \"operator\": \"OR\"}], \"providerMetadata\": {\"orgId\": \"4daa8cea-433a-44bd-9456-53b127fc289a\", \"shortName\": \"Secur0\", \"dateUpdated\": \"2026-10-14T16:01:59.909Z\"}}}",
      "cveMetadata": "{\"cveId\": \"CVE-2026-100169\", \"state\": \"PUBLISHED\", \"dateUpdated\": \"2026-10-16T15:31:52.042Z\", \"dateReserved\": \"2026-09-25T13:10:49.476Z\", \"assignerOrgId\": \"4daa8cea-433a-44bd-9456-53b127fc289a\", \"datePublished\": \"2026-10-14T16:01:59.909Z\", \"assignerShortName\": \"Secur0\"}",
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }
  }
}


Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Sightings

Author Source Type Date

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or seen somewhere by the user.
  • Confirmed: The vulnerability is confirmed from an analyst perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: This vulnerability was exploited and seen by the user reporting the sighting.
  • Patched: This vulnerability was successfully patched by the user reporting the sighting.
  • Not exploited: This vulnerability was not exploited or seen by the user reporting the sighting.
  • Not confirmed: The user expresses doubt about the veracity of the vulnerability.
  • Not patched: This vulnerability was not successfully patched by the user reporting the sighting.


Loading…

Loading…