GCVE-1-2026-20266 (CVE-2026-95698)

Vulnerability from gna-1 – Published: 2026-09-22 14:36 – Updated: 2026-09-22 14:36
VLAI
Title
MISP Path Traversal in OrgImgHelper findOrgImage via Crafted Organization Name
Summary
The findOrgImage method in MISP's 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.  This yields two security impacts:   - an arbitrary file existence oracle, since file_exists() returns a boolean for any path the process can access.  - 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. The vulnerability requires an authenticated user with the ability to create or import events that set the organization name.
CWE
  • CWE-22 - Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
Assigner
GNA-1 This instance
References
Impacted products
Vendor Product Version CPE status
MISP MISP Affected: 0 , < 2.5.47 (semver)
guessed Create a notification for this product.
GCVE extensions
AI involvement GCVE-BCP-05-X-01
Whole record AI-generated Human-reviewed GNA-1

Draft vulnerability metadata was generated from a git-format patch using an Ollama-hosted language model. Human validation is required before publication.

ai-computer-assisted:llm-generatedai-computer-assisted:classification
Model Source Identifier
qwen3.8:27b ollama qwen3.8:27b
Patch provenance GCVE-BCP-05-X-02
Generator
patch2vuln.py on 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": {
    "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": {
        "orgId": "00000000-0000-4000-9000-000000000000"
      },
      "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": "00000000-0000-4000-9000-000000000000",
    "cveId": "CVE-2026-95698",
    "datePublished": "2026-09-22T14:36:25.776959Z",
    "dateReserved": "2026-09-22T14:36:33.476Z",
    "dateUpdated": "2026-09-22T14:36:33.546261Z",
    "state": "PUBLISHED",
    "vulnId": "GCVE-1-2026-20266"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.1"
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

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.

Loading…

Loading…

Loading…

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.


Loading…