CVE-2026-95698 (GCVE-0-2026-95698)
Vulnerability from cvelistv5 – Published: 2026-09-22 14:36 – Updated: 2026-09-22 15:04- CWE-22 - Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
| URL | Tags |
|---|---|
| https://github.com/MISP/MISP/commit/e00986075 | patch |
qwen3.8:27b
advisory
bcp-05-x-01bcp-05-x-02
Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.
| Model | Source | Identifier |
|---|---|---|
| qwen3.8:27b | ollama | qwen3.8:27b |
- Generator
-
patch2vuln.pyon 2026-09-22 14:32 - Model
qwen3.8:27b- Input
-
https://github.com/MISP/MISP/commit/e00986075.patch
646ef716ac7a… - Confidence
- high
| Commit | Subject | Patch SHA-256 |
|---|---|---|
e00986075acf
|
fix: [security] Reject path traversal in the org-logo | 646ef716ac7a… |
Fix summary
The fix adds input validation in findOrgImage so that each organization identifier value (id, name, uuid) is checked to be a non-empty plain filename component. Values containing path separators (detected via basename comparison) or dot-dot sequences are rejected, preventing the constructed path from escaping the designated org-image directory. The validated value is then used in the file_exists call and the returned image reference.
Patch summary
In app/View/Helper/OrgImgHelper.php, the findOrgImage method now casts each field value to a string and rejects it if it is empty, if basename($value) does not equal $value (indicating embedded path separators), or if it contains the substring '..'. The previously unvalidated $options[$field] is replaced with the validated $value in both the file_exists() call and the assignment to $image. Ten lines added, two lines removed in a single file.
CVSS rationale
AV:N: MISP is a network-accessible web application; the org name is set via API/event import over the network. AC:L: The attacker simply includes ../ in an org name during a normal import operation; no race or complex condition is needed. AT:N: No manipulation of the target beyond normal input is required. PR:L: The attacker must be an authenticated MISP user with permission to create or import events that set the organization name. UI:N: No victim interaction is required; the traversal occurs server-side during view rendering. VC:L: The attacker gains a file-existence oracle and can read .png/.svg files outside the intended directory, a limited but real confidentiality breach. VI:N, VA:N: No integrity or availability impact is evidenced. SC:N, SI:N, SA:N: No secondary impacts are indicated by the patch or commit message.
Weakness rationale
- CWE-22 The vulnerability is a textbook path traversal: a user-controlled string (org name) is concatenated into a filesystem path without sanitization, allowing the resolved path to escape the intended directory. The fix explicitly rejects path separators and dot-dot sequences, confirming the root cause is missing path confinement.
Attack pattern rationale
- CAPEC-126 CAPEC-126 describes an attacker manipulating path components in a request to access files or directories outside the intended scope. This matches the vulnerability exactly: the org name field is manipulated to include ../ sequences, causing the server to probe and potentially read files outside the org-image directory. The mapping is direct and unambiguous.
Assumptions to verify
- The affected version boundary is inferred from the nearest git tag v2.5.47 with 51 commits after the fix; the exact last-affected and first-fixed release numbers are not explicitly stated in the patch metadata.
- PR:L assumes the attacker needs an authenticated MISP account with event-import or org-creation privileges; the patch does not specify the exact permission level required.
- The confidentiality impact is rated Low because the file read and existence oracle are limited to files with .png or .svg extensions; a broader arbitrary file read is not possible through this code path.
- CAPEC-126 is selected as the closest match; no uncertainty is noted because the attack pattern (path traversal via crafted filename) maps directly to this CAPEC entry.
- The commit date (2026-09-16) is taken at face value from the patch metadata; no independent verification of the timeline was performed.
Model comparison
Selected qwen3.8:27b
by deterministic-consensus-v1
The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required.
| Model | Score | Agreement | Confidence | Assumptions |
|---|---|---|---|---|
qwen3.8:27b |
6 | 9 | high | 5 |
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-95698",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "yes"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-09-22T15:03:36.684296Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-09-22T15:04:08.199Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"modules": [
"app/View/Helper/OrgImgHelper.php"
],
"product": "MISP",
"programFiles": [
"app/View/Helper/OrgImgHelper.php"
],
"repo": "https://github.com/MISP/MISP",
"vendor": "MISP",
"versions": [
{
"lessThan": "2.5.47",
"status": "affected",
"version": "0",
"versionType": "semver"
}
]
}
],
"credits": [
{
"lang": "en",
"type": "reporter",
"value": "Jeroen Pinoy"
},
{
"lang": "en",
"type": "remediation developer",
"value": "iglocska"
},
{
"lang": "en",
"type": "remediation developer",
"value": "Claude Opus 4.8"
}
],
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eThe findOrgImage method in MISP\u0027s OrgImgHelper constructs a filesystem path by concatenating a user-supplied organization identifier with a fixed image directory and a file extension, then calls file_exists() on the resulting path. The organization name field is attacker-controllable through event import, which sets Org.name. Because no validation was performed on the field value before path construction, an organization name containing directory traversal sequences (e.g., ../../etc/passwd) would cause the path to resolve outside the intended org-image directory.\u0026nbsp;\u003c/p\u003e\u003cp\u003eThis yields two security impacts:\u0026nbsp;\u003c/p\u003e\u2003- an arbitrary file existence oracle, since file_exists() returns a boolean for any path the process can access.\u003cbr\u003e\u003cdiv\u003e\u2003-\u0026nbsp;an arbitrary file read limited to files with .png or .svg extensions, because the resolved filename is returned and subsequently rendered or served to the requesting user.\u003c/div\u003e\u003cdiv\u003e\u003cbr\u003e\u003c/div\u003e\u003cp\u003eThe vulnerability requires an authenticated user with the ability to create or import events that set the organization name.\u003c/p\u003e"
}
],
"value": "The findOrgImage method in MISP\u0027s OrgImgHelper constructs a filesystem path by concatenating a user-supplied organization identifier with a fixed image directory and a file extension, then calls file_exists() on the resulting path. The organization name field is attacker-controllable through event import, which sets Org.name. Because no validation was performed on the field value before path construction, an organization name containing directory traversal sequences (e.g., ../../etc/passwd) would cause the path to resolve outside the intended org-image directory.\u00a0\n\nThis yields two security impacts:\u00a0\n\n\u2003- an arbitrary file existence oracle, since file_exists() returns a boolean for any path the process can access.\n\u2003-\u00a0an arbitrary file read limited to files with .png or .svg extensions, because the resolved filename is returned and subsequently rendered or served to the requesting user.\n\n\n\n\nThe vulnerability requires an authenticated user with the ability to create or import events that set the organization name."
}
],
"impacts": [
{
"capecId": "CAPEC-126",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-126 Path Traversal"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"attackVector": "NETWORK",
"baseScore": 5.3,
"baseSeverity": "MEDIUM",
"privilegesRequired": "LOW",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "LOW",
"vulnIntegrityImpact": "NONE",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-22",
"description": "CWE-22 Improper Limitation of a Pathname to a Restricted Directory (\u0027Path Traversal\u0027)",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-09-22T14:36:35.043Z",
"orgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
"shortName": "CIRCL"
},
"references": [
{
"name": "Security patch",
"tags": [
"patch"
],
"url": "https://github.com/MISP/MISP/commit/e00986075"
}
],
"solutions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eThe fix adds input validation in findOrgImage so that each organization identifier value (id, name, uuid) is checked to be a non-empty plain filename component. Values containing path separators (detected via basename comparison) or dot-dot sequences are rejected, preventing the constructed path from escaping the designated org-image directory. The validated value is then used in the file_exists call and the returned image reference.\u003c/p\u003e"
}
],
"value": "The fix adds input validation in findOrgImage so that each organization identifier value (id, name, uuid) is checked to be a non-empty plain filename component. Values containing path separators (detected via basename comparison) or dot-dot sequences are rejected, preventing the constructed path from escaping the designated org-image directory. The validated value is then used in the file_exists call and the returned image reference."
}
],
"title": "MISP Path Traversal in OrgImgHelper findOrgImage via Crafted Organization Name",
"x_gcve": [
{
"extensions": {
"bcp-05-x-01": {
"ai_annotations": [
{
"ai_level": "generated",
"description": "Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.",
"gna_source": 1,
"models": [
{
"gna_source": 1,
"identifier": "qwen3.8:27b",
"name": "qwen3.8:27b",
"source": "ollama"
}
],
"review_status": "full",
"scope": "record",
"tags": [
"ai-computer-assisted:llm-generated",
"ai-computer-assisted:classification"
]
}
]
},
"bcp-05-x-02": {
"x_patch2vuln": {
"assumptions": [
"The affected version boundary is inferred from the nearest git tag v2.5.47 with 51 commits after the fix; the exact last-affected and first-fixed release numbers are not explicitly stated in the patch metadata.",
"PR:L assumes the attacker needs an authenticated MISP account with event-import or org-creation privileges; the patch does not specify the exact permission level required.",
"The confidentiality impact is rated Low because the file read and existence oracle are limited to files with .png or .svg extensions; a broader arbitrary file read is not possible through this code path.",
"CAPEC-126 is selected as the closest match; no uncertainty is noted because the attack pattern (path traversal via crafted filename) maps directly to this CAPEC entry.",
"The commit date (2026-09-16) is taken at face value from the patch metadata; no independent verification of the timeline was performed."
],
"capecRationale": [
{
"capecId": "CAPEC-126",
"rationale": "CAPEC-126 describes an attacker manipulating path components in a request to access files or directories outside the intended scope. This matches the vulnerability exactly: the org name field is manipulated to include ../ sequences, causing the server to probe and potentially read files outside the org-image directory. The mapping is direct and unambiguous."
}
],
"commit": "e00986075acf47257030caa0298fad7b730a764c",
"confidence": "high",
"credits": [
{
"lang": "en",
"type": "reporter",
"value": "Jeroen Pinoy"
},
{
"lang": "en",
"type": "remediation developer",
"value": "iglocska"
},
{
"lang": "en",
"type": "remediation developer",
"value": "Claude Opus 4.8"
}
],
"cvssRationale": "AV:N: MISP is a network-accessible web application; the org name is set via API/event import over the network. AC:L: The attacker simply includes ../ in an org name during a normal import operation; no race or complex condition is needed. AT:N: No manipulation of the target beyond normal input is required. PR:L: The attacker must be an authenticated MISP user with permission to create or import events that set the organization name. UI:N: No victim interaction is required; the traversal occurs server-side during view rendering. VC:L: The attacker gains a file-existence oracle and can read .png/.svg files outside the intended directory, a limited but real confidentiality breach. VI:N, VA:N: No integrity or availability impact is evidenced. SC:N, SI:N, SA:N: No secondary impacts are indicated by the patch or commit message.",
"fixSummary": "The fix adds input validation in findOrgImage so that each organization identifier value (id, name, uuid) is checked to be a non-empty plain filename component. Values containing path separators (detected via basename comparison) or dot-dot sequences are rejected, preventing the constructed path from escaping the designated org-image directory. The validated value is then used in the file_exists call and the returned image reference.",
"generatedAt": "2026-09-22T14:32:54.822056Z",
"generator": "patch2vuln.py",
"model": "qwen3.8:27b",
"modelComparison": {
"rankings": [
{
"agreementScore": 9,
"assumptionCount": 5,
"confidence": "high",
"model": "qwen3.8:27b",
"score": 6
}
],
"selectedModel": "qwen3.8:27b",
"selectionMethod": "deterministic-consensus-v1",
"selectionNotice": "The selected result is closest to model consensus; this heuristic does not establish factual correctness and human review remains required."
},
"patchSha256": "646ef716ac7a2ad0525154af9e0a6a7ffac9739a4f4d7114994521ae57d93fbd",
"patchSummary": "In app/View/Helper/OrgImgHelper.php, the findOrgImage method now casts each field value to a string and rejects it if it is empty, if basename($value) does not equal $value (indicating embedded path separators), or if it contains the substring \u0027..\u0027. The previously unvalidated $options[$field] is replaced with the validated $value in both the file_exists() call and the assignment to $image. Ten lines added, two lines removed in a single file.",
"patchTruncated": false,
"patches": [
{
"commit": "e00986075acf47257030caa0298fad7b730a764c",
"patchSha256": "646ef716ac7a2ad0525154af9e0a6a7ffac9739a4f4d7114994521ae57d93fbd",
"source": "https://github.com/MISP/MISP/commit/e00986075.patch",
"sourceUrl": "https://github.com/MISP/MISP/commit/e00986075.patch",
"subject": "fix: [security] Reject path traversal in the org-logo"
}
],
"source": "https://github.com/MISP/MISP/commit/e00986075.patch",
"subject": "fix: [security] Reject path traversal in the org-logo",
"tagVersionBoundary": {
"commits_after_fix": 51,
"repository": "https://github.com/MISP/MISP",
"tag": "v2.5.47",
"version": "2.5.47",
"version_type": "semver"
},
"weaknessRationale": [
{
"cweId": "CWE-22",
"rationale": "The vulnerability is a textbook path traversal: a user-controlled string (org name) is concatenated into a filesystem path without sanitization, allowing the resolved path to escape the intended directory. The fix explicitly rejects path separators and dot-dot sequences, confirming the root cause is missing path confinement."
}
]
}
}
},
"recordType": "advisory",
"vulnId": "GCVE-1-2026-20266"
}
]
}
},
"cveMetadata": {
"assignerOrgId": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
"assignerShortName": "CIRCL",
"cveId": "CVE-2026-95698",
"datePublished": "2026-09-22T14:36:35.043Z",
"dateReserved": "2026-09-22T14:36:33.476Z",
"dateUpdated": "2026-09-22T15:04:08.199Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"vulnerability-lookup:meta": {
"epss": {
"cve": "CVE-2026-95698",
"date": "2026-09-23",
"epss": "0.00718",
"percentile": "0.52427"
},
"nvd": {
"cve": {
"affected": [
{
"affectedData": [
{
"modules": [
"app/View/Helper/OrgImgHelper.php"
],
"product": "MISP",
"programFiles": [
"app/View/Helper/OrgImgHelper.php"
],
"repo": "https://github.com/MISP/MISP",
"vendor": "MISP",
"versions": [
{
"lessThan": "2.5.47",
"status": "affected",
"version": "0",
"versionType": "semver"
}
]
}
],
"source": "5a6e4751-2f3f-4070-9419-94fb35b644e8"
}
],
"cveTags": [],
"descriptions": [
{
"lang": "en",
"value": "The findOrgImage method in MISP\u0027s OrgImgHelper constructs a filesystem path by concatenating a user-supplied organization identifier with a fixed image directory and a file extension, then calls file_exists() on the resulting path. The organization name field is attacker-controllable through event import, which sets Org.name. Because no validation was performed on the field value before path construction, an organization name containing directory traversal sequences (e.g., ../../etc/passwd) would cause the path to resolve outside the intended org-image directory.\u00a0\n\nThis yields two security impacts:\u00a0\n\n\u2003- an arbitrary file existence oracle, since file_exists() returns a boolean for any path the process can access.\n\u2003-\u00a0an arbitrary file read limited to files with .png or .svg extensions, because the resolved filename is returned and subsequently rendered or served to the requesting user.\n\n\n\n\nThe vulnerability requires an authenticated user with the ability to create or import events that set the organization name."
}
],
"id": "CVE-2026-95698",
"lastModified": "2026-09-22T16:18:23.587",
"metrics": {
"cvssMetricV40": [
{
"cvssData": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"attackVector": "NETWORK",
"availabilityRequirement": "NOT_DEFINED",
"baseScore": 5.3,
"baseSeverity": "MEDIUM",
"confidentialityRequirement": "NOT_DEFINED",
"exploitMaturity": "NOT_DEFINED",
"integrityRequirement": "NOT_DEFINED",
"modifiedAttackComplexity": "NOT_DEFINED",
"modifiedAttackRequirements": "NOT_DEFINED",
"modifiedAttackVector": "NOT_DEFINED",
"modifiedPrivilegesRequired": "NOT_DEFINED",
"modifiedSubAvailabilityImpact": "NOT_DEFINED",
"modifiedSubConfidentialityImpact": "NOT_DEFINED",
"modifiedSubIntegrityImpact": "NOT_DEFINED",
"modifiedUserInteraction": "NOT_DEFINED",
"modifiedVulnAvailabilityImpact": "NOT_DEFINED",
"modifiedVulnConfidentialityImpact": "NOT_DEFINED",
"modifiedVulnIntegrityImpact": "NOT_DEFINED",
"privilegesRequired": "LOW",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "LOW",
"vulnIntegrityImpact": "NONE",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"source": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
"type": "Secondary"
}
],
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"id": "CVE-2026-95698",
"options": [
{
"exploitation": "none"
},
{
"automatable": "yes"
},
{
"technicalImpact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-09-22T15:03:36.684296Z",
"version": "2.0.3"
}
}
]
},
"published": "2026-09-22T15:17:27.887",
"references": [
{
"source": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
"url": "https://github.com/MISP/MISP/commit/e00986075"
}
],
"sourceIdentifier": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
"vulnStatus": "Deferred",
"weaknesses": [
{
"description": [
{
"lang": "en",
"value": "CWE-22"
}
],
"source": "5a6e4751-2f3f-4070-9419-94fb35b644e8",
"type": "Secondary"
}
]
}
}
}
}
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Browse all ATT&CK techniques and the vulnerabilities related to each.
Related by attack behaviour
Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.