{
    "dataType": "CVE_RECORD",
    "dataVersion": "5.2",
    "cveMetadata": {
        "cveId": "CVE-2026-81931",
        "assignerOrgId": "4daa8cea-433a-44bd-9456-53b127fc289a",
        "state": "PUBLISHED",
        "assignerShortName": "Secur0",
        "dateReserved": "2026-08-27T18:47:15.950Z",
        "datePublished": "2026-08-27T19:33:27.288Z",
        "dateUpdated": "2026-08-27T19:33:27.288Z"
    },
    "containers": {
        "cna": {
            "providerMetadata": {
                "orgId": "4daa8cea-433a-44bd-9456-53b127fc289a",
                "shortName": "Secur0",
                "dateUpdated": "2026-08-27T19:33:27.288Z"
            },
            "title": "Unrestricted upload of file with dangerous type in Prospero Flow CRM product photo allows stored cross-site scripting",
            "datePublic": "2026-08-27T00:00:00.000Z",
            "problemTypes": [
                {
                    "descriptions": [
                        {
                            "lang": "en",
                            "cweId": "CWE-434",
                            "description": "CWE-434 Unrestricted upload of file with dangerous type",
                            "type": "CWE"
                        }
                    ]
                }
            ],
            "impacts": [
                {
                    "capecId": "CAPEC-592",
                    "descriptions": [
                        {
                            "lang": "en",
                            "value": "CAPEC-592 Stored XSS"
                        }
                    ]
                }
            ],
            "affected": [
                {
                    "vendor": "Roskus",
                    "product": "Prospero Flow CRM",
                    "repo": "https://github.com/Roskus/prospero-flow-crm",
                    "modules": [
                        "Product"
                    ],
                    "programFiles": [
                        "app/Http/Controllers/Product/ProductSaveController.php",
                        "app/Http/Requests/ProductRequest.php"
                    ],
                    "versions": [
                        {
                            "status": "affected",
                            "version": "0",
                            "lessThan": "5.16.0",
                            "versionType": "semver"
                        }
                    ],
                    "defaultStatus": "unaffected",
                    "cpes": [
                        "cpe:2.3:a:roskus:prospero_flow_crm:*:*:*:*:*:*:*:*"
                    ]
                }
            ],
            "cpeApplicability": [
                {
                    "operator": "OR",
                    "nodes": [
                        {
                            "operator": "OR",
                            "negate": false,
                            "cpeMatch": [
                                {
                                    "vulnerable": true,
                                    "criteria": "cpe:2.3:a:roskus:prospero_flow_crm:*:*:*:*:*:*:*:*",
                                    "versionStartIncluding": "0",
                                    "versionEndExcluding": "5.16.0"
                                }
                            ]
                        }
                    ]
                }
            ],
            "descriptions": [
                {
                    "lang": "en",
                    "value": "Unrestricted Upload of File with Dangerous Type in the product photo upload in Roskus Prospero Flow CRM before 5.16.0 allows an authenticated user holding the create product permission (routine Seller role) to execute arbitrary JavaScript in the application origin. The photo validation rule classifies the file only by its content (magic bytes) and rejects only a fixed list of PHP extensions, while ProductSaveController::save() names the stored file using the client-supplied extension and copies it into the public web root. A file that begins with an image header and carries an HTML extension passes validation, is stored under public/asset/upload/product/, and is served with a text/html content type, turning the upload into first-party stored script execution.",
                    "supportingMedia": [
                        {
                            "type": "text/html",
                            "base64": false,
                            "value": "<p>Unrestricted Upload of File with Dangerous Type in the product photo upload in Roskus Prospero Flow CRM before 5.16.0 allows an authenticated user holding the create product permission (routine Seller role) to execute arbitrary JavaScript in the application origin. The photo validation rule classifies the file only by its content (magic bytes) and rejects only a fixed list of PHP extensions, while <code>ProductSaveController::save()</code> names the stored file using the client-supplied extension and copies it into the public web root. A file that begins with an image header and carries an HTML extension passes validation, is stored under <code>public/asset/upload/product/</code>, and is served with a <code>text/html</code> content type, turning the upload into first-party stored script execution.</p>"
                        }
                    ]
                }
            ],
            "tags": [
                "x_open-source"
            ],
            "references": [
                {
                    "url": "https://github.com/Roskus/prospero-flow-crm/commit/71b20e1a37f4381d1b8b0a6933a942324e1cc19f",
                    "tags": [
                        "patch"
                    ]
                },
                {
                    "url": "https://secur0.com/en/cna/cve-list/cve-2026-81931-unrestricted-upload-product-photo-extension-confusion-xss",
                    "tags": [
                        "third-party-advisory",
                        "technical-description"
                    ]
                }
            ],
            "metrics": [
                {
                    "format": "CVSS",
                    "scenarios": [
                        {
                            "lang": "en",
                            "value": "GENERAL"
                        }
                    ],
                    "cvssV4_0": {
                        "attackVector": "NETWORK",
                        "attackComplexity": "LOW",
                        "attackRequirements": "NONE",
                        "privilegesRequired": "LOW",
                        "userInteraction": "ACTIVE",
                        "vulnConfidentialityImpact": "NONE",
                        "subConfidentialityImpact": "NONE",
                        "vulnIntegrityImpact": "LOW",
                        "subIntegrityImpact": "LOW",
                        "vulnAvailabilityImpact": "NONE",
                        "subAvailabilityImpact": "NONE",
                        "exploitMaturity": "NOT_DEFINED",
                        "Safety": "NOT_DEFINED",
                        "Automatable": "NOT_DEFINED",
                        "Recovery": "NOT_DEFINED",
                        "valueDensity": "NOT_DEFINED",
                        "vulnerabilityResponseEffort": "NOT_DEFINED",
                        "providerUrgency": "NOT_DEFINED",
                        "version": "4.0",
                        "baseSeverity": "MEDIUM",
                        "baseScore": 4.8,
                        "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:A/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N"
                    }
                }
            ],
            "solutions": [
                {
                    "lang": "en",
                    "value": "Upgrade to 5.16.0 or later from the main branch; no tagged release carries the fix. Review and remove any existing files with a non-image extension under public/asset/upload/product/.",
                    "supportingMedia": [
                        {
                            "type": "text/html",
                            "base64": false,
                            "value": "<p>Upgrade to 5.16.0 or later from the main branch; no tagged release carries the fix. Review and remove any existing files with a non-image extension under <code>public/asset/upload/product/</code>.</p>"
                        }
                    ]
                }
            ],
            "credits": [
                {
                    "lang": "en",
                    "value": "Adrián García López",
                    "type": "finder"
                },
                {
                    "lang": "en",
                    "value": "Darío Rivas Quero",
                    "type": "analyst"
                },
                {
                    "lang": "en",
                    "value": "Secur0 CNA",
                    "type": "coordinator"
                },
                {
                    "lang": "en",
                    "value": "Gustavo Novaro",
                    "type": "remediation developer"
                }
            ],
            "source": {
                "discovery": "EXTERNAL"
            }
        }
    }
}