CVE-2022-24840: Django s3file Path Traversal Vulnerability

CRITICAL
Advisory Identifier: GHSA-4w8f-hjm9-xwgf
CVSS 9.1
CWE-96 CWE-22
Published
Advisory Summary

CVE-2022-24840 is a CRITICAL (CVSS 9.1) path traversal vulnerability (CWE-96: Improper Neutralization of Directives in Statically Saved Code ('Static Code Injection')) affecting Django s3file libraries in the PyPI ecosystem. The issue involves path traversal in django-s3file. Remediation is available by upgrading affected packages to version 5.5.1.

CVE-2022-24840 at a Glance

CVE Identifier CVE-2022-24840
GHSA Identifier GHSA-4w8f-hjm9-xwgf
Severity CRITICAL
CVSS v3.1 Base Score 9.1
CWE Classification CWE-96: Improper Neutralization of Directives in Statically Saved Code ('Static Code Injection')
Affected Product Django s3file
Package Ecosystem PyPI
Published Date
Last Updated

Security Impact

CVSS: 9.1

The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required None (PR:N)
User Interaction None (UI:N)
Scope Unchanged (S:U)
Confidentiality High (C:H)
Integrity High (I:H)
Availability None (A:N)

How to Fix CVE-2022-24840

To remediate this vulnerability, upgrade all affected Django s3file dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

django-s3file fixed: 5.5.1
pip install django-s3file>=5.5.1
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

pip show django-s3file

How to Check if You Are Affected

To determine whether your Python environment is affected by CVE-2022-24840, inspect your installed packages using pip:

pip show django-s3file

Analyze the terminal output to locate any version of Django s3file in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 5.5.1), your application is affected.

Note: The pip show django-s3file command checks currently installed packages in your active Python environment.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-96: Improper Neutralization of Directives in Statically Saved Code ('Static Code Injection'), where the product receives input from an upstream component, but it does not neutralize or incorrectly neutralizes code syntax before inserting the input into an executable resource, such as a library, configuration file, or template. In Django s3file, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

### Impact It was possible to traverse the entire AWS S3 bucket and in most cases to access or delete files. The issue was discovered by the maintainer. There were no reports of the vulnerability being known to or exploited by a third party, before the release of the patch. If the `AWS_LOCATION` setting was set, traversal was limited to that location only. If all your files handling views (like form views) require authentication or special permission, the thread is limited to privileged users. ### Patches The vulnerability has been fixed in version 5.5.1 and above. ### Workarounds There is no feasible workaround. We must urge all users to immediately updated to a patched version. ### Detailed attack vector description An attacker may use a request with malicious form data to traverse the entire AWS S3 bucket and perform destructive operations. An attack could look as follows: ```bash curl -X POST -F "s3file=file" -F "file=/priviliged/location/secrets.txt" https://www.example.com/any/path/will/work/ ``` This will result in a request with files set and opened: ```python >>> request.FILES.getlist("file") [File("/priviliged/location/secrets.txt")] ``` Since this behavior is injected via a middleware, any view can be called this way and will carry any files defined by the attacker. Via the `s3file` form field, any input name can be specified, including multiple inputs. For each input, multiple files can be freely picked of the S3 bucket. #### Scenarios and their practicality There are four scenarios that would be considered practical in most setups: 1. Illegal file injection, 2. file deletion, 3. file retrieval & tree traversal. 4. code injection & remote code execution. ##### File deletion An attacker knows the location of a privileged file, like a static asset. Next, the file is injected into a form view. The upload to function will move the file to a new location. This is effectively deleting the file, since the previous references to it are invalid, and will cause S3 to return a 404. Furthermore, the new location is unknown to the site operator. ##### File retrieval & tree traversal An attacker knows the URL of a secret file and injects it into a form view. The view will move the file to a public location, making it accessible to the attacker. Since most form views will not be rate limited, this could also be used to guess files and traverse the file tree. ##### Illegal file injection An attacker uses any form to upload a file to the temporary upload location. Next, the attacker injects that file into a request, does not validate the contents or is not equipped to handle the mime type. The latter could be used as a potential DOS vector. In practice, this is not a practical risk in most hardened setup. Files should always be sanitized before processing, since files can be included in a request even without this security issues. ### For more information If you have any questions or comments about this advisory: * Open an issue on [GitHub](https://github.com/codingjoe/django-s3file/issues) * Email us at [johannes@maron.family](mailto:johannes@maron.family)

CVE-2022-24840 Affected Django s3file Versions

1 component(s)
Fixed Versions:
5.5.1
Product / Package Ecosystem Affected Versions Fixed Version
django-s3file
PyPI
< 5.5.1
5.5.1

References

Frequently Asked Questions

What is CVE-2022-24840?
CVE-2022-24840 is a security vulnerability in Django s3file involving Path Traversal in django-s3file under CWE-96: Improper Neutralization of Directives in Statically Saved Code ('Static Code Injection').
Which Django s3file versions are affected?
Affected versions include releases prior to 5.5.1 across affected packages: django-s3file.
What version fixes CVE-2022-24840?
Upgrading to 5.5.1 (or the latest patched release for your respective branch) resolves the vulnerability.
Is django-s3file affected?
Yes, django-s3file is affected in releases prior to 5.5.1. Upgrade your dependency to 5.5.1 or later.
What is the CVSS score of CVE-2022-24840?
CVE-2022-24840 has a CVSS v3.1 base score of 9.1 (CRITICAL) with vector string CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N.
What CWE is associated with CVE-2022-24840?
CVE-2022-24840 is classified under CWE-96: Improper Neutralization of Directives in Statically Saved Code ('Static Code Injection') (The product receives input from an upstream component, but it does not neutralize or incorrectly neutralizes code syntax before inserting the input into an executable resource, such as a library, configuration file, or template.).
How can I check PyPI dependencies for CVE-2022-24840?
Run the dependency tree command: 'pip show django-s3file'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-4w8f-hjm9-xwgf",
  "modified" : "2024-09-16T21:49:30Z",
  "published" : "2022-06-06T21:24:24Z",
  "aliases" : [ "CVE-2022-24840" ],
  "summary" : "Path Traversal in django-s3file",
  "details" : "### Impact\n\nIt was possible to traverse the entire AWS S3 bucket and in most cases to access or delete files.\nThe issue was discovered by the maintainer. There were no reports of the vulnerability\nbeing known to or exploited by a third party, before the release of the patch.\n\nIf the `AWS_LOCATION` setting was set, traversal was limited to that location only.\nIf all your files handling views (like form views) require authentication or special permission, the thread is limited to privileged users.\n\n### Patches\n\nThe vulnerability has been fixed in version 5.5.1 and above.\n\n### Workarounds\n\nThere is no feasible workaround. We must urge all users to immediately updated to a patched version.\n\n### Detailed attack vector description\n\nAn attacker may use a request with malicious form data to traverse the entire AWS S3 bucket and perform destructive operations.\n\nAn attack could look as follows:\n```bash\ncurl -X POST -F \"s3file=file\" -F \"file=/priviliged/location/secrets.txt\" https://www.example.com/any/path/will/work/\n```\n\nThis will result in a request with files set and opened:\n\n```python\n>>> request.FILES.getlist(\"file\")\n[File(\"/priviliged/location/secrets.txt\")]\n```\n\nSince this behavior is injected via a middleware, any view can be called this way and will carry any files defined by the attacker.\n\nVia the `s3file` form field, any input name can be specified, including multiple inputs. For each input, multiple files can be freely\npicked of the S3 bucket.\n\n#### Scenarios and their practicality\n\nThere are four scenarios that would be considered practical in most setups:\n\n1. Illegal file injection,\n2. file deletion,\n3. file retrieval & tree traversal.\n4. code injection & remote code execution.\n\n##### File deletion\n\nAn attacker knows the location of a privileged file, like a static asset. Next, the file is injected into a form view. The upload to function will move the file to a new location. This is effectively deleting the file, since the previous references to it are invalid, and will cause S3 to return a 404. Furthermore, the new location is unknown to the site operator.\n\n##### File retrieval & tree traversal\n\nAn attacker knows the URL of a secret file and injects it into a form view. The view will move the file to a public location, making it accessible to the attacker. Since most form views will not be rate limited, this could also be used to guess files and traverse the file tree.\n\n##### Illegal file injection\n\nAn attacker uses any form to upload a file to the temporary upload location. Next, the attacker injects that file into a request, does not validate the contents or is not equipped to handle the mime type. The latter could be used as a potential DOS vector.\n\nIn practice, this is not a practical risk in most hardened setup. Files should always be sanitized before processing, since files can be included in a request even without this security issues.\n\n### For more information\nIf you have any questions or comments about this advisory:\n* Open an issue on [GitHub](https://github.com/codingjoe/django-s3file/issues)\n* Email us at [johannes@maron.family](mailto:johannes@maron.family)\n",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N"
  }, {
    "type" : "CVSS_V4",
    "score" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "PyPI",
      "name" : "django-s3file"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "5.5.1"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/codingjoe/django-s3file/security/advisories/GHSA-4w8f-hjm9-xwgf"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2022-24840"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/codingjoe/django-s3file/commit/68ccd2c621a40eb66fdd6af2be9d5fcc9c373318"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/codingjoe/django-s3file"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/codingjoe/django-s3file/releases/tag/5.5.1"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/pypa/advisory-database/tree/main/vulns/django-s3file/PYSEC-2022-208.yaml"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-22", "CWE-96" ],
    "severity" : "CRITICAL",
    "github_reviewed" : true,
    "github_reviewed_at" : "2022-06-06T21:24:24Z",
    "nvd_published_at" : "2022-06-09T04:15:00Z"
  }
}