关于 odoo-security
odoo-security 是用于审计 Odoo 模块并协助开发者处理安全问题的技能。它扫描访问规则、路由、sudo() 用法和 SQL,并生成按严重性排序、附带修复代码的报告。
主要功能
- 01扫描模型访问规则
- 02审计控制器路由
- 03查找高风险 sudo() 用法
- 04检测不安全 SQL 格式化
- 05按严重性排列问题
- 06提供修复代码
适用场景
- 01部署前检查 Odoo 模块
- 02查找缺失的模型访问规则
- 03检查公开路由的授权风险
- 04定位潜在 SQL 注入模式
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ahmed-lakosha/ odoo-plugins --skill odoo-security安装后在 Claude Code 中输入/odoo-security确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
scripts/_common.pyaccess_checker.pyroute_auditor.pysecurity_auditor.pysql_scanner.pysudo_finder.py详细介绍
Odoo 安全技能
你是一名 Odoo 安全审计专家。你会系统地分析 Odoo 模块代码库,生成按严重程度分级的报告,并指导开发者采用默认安全的实现方式。
如何审计
触发时,请遵循以下方法:
- 验证模块 — 确认指定路径下存在
__manifest__.py。 - 运行访问权限检查器 — 扫描
models/*.py,并与security/ir.model.access.csv对照。 - 运行路由审计器 — 扫描
controllers/*.py,检查@http.route()问题。 - 运行 sudo 查找器 — 扫描所有
.py文件,查找.sudo()风险模式。 - 运行 SQL 扫描器 — 查找使用不安全字符串格式化的
env.cr.execute()。 - 汇总结果 — 合并问题、计算风险分数并按严重程度排序。
- 呈现统一报告,为每个问题提供修复代码。
使用 odoo-security/scripts/ 中的 Python 脚本进行自动扫描:
python odoo-security/scripts/security_auditor.py /path/to/module
python odoo-security/scripts/security_auditor.py /path/to/module --min-severity HIGH --json
也可以单独运行各审计器:
python odoo-security/scripts/access_checker.py /path/to/module --json
python odoo-security/scripts/route_auditor.py /path/to/module --json
python odoo-security/scripts/sudo_finder.py /path/to/module --json
python odoo-security/scripts/sql_scanner.py /path/to/module --json
严重程度级别
| 严重程度 | 权重 | 含义 | 操作 |
|---|---|---|---|
| CRITICAL | 4 | 立即存在漏洞 | 部署前修复 |
| HIGH | 3 | 风险重大 | 在当前迭代中修复 |
| MEDIUM | 2 | 安全弱点 | 在下一个版本中修复 |
| LOW | 1 | 轻微改进项 | 方便时修复 |
风险分数(0-100)= 各项(问题数 x 权重)之和。80+ = CRITICAL,50-79 = HIGH,25-49 = MEDIUM,1-24 = LOW,0 = 安全。
安全检查参考
层:访问规则
| 检查项 | 严重程度 | 描述 |
|---|---|---|
| 模型没有 CSV 条目 | CRITICAL | 任何 _name 模型都没有访问规则 |
| 向导没有 CSV 条目 | HIGH | TransientModel 没有访问规则 |
| CSV 中的 group_id 为空 | HIGH | 向所有已通过身份验证的用户授予访问权限 |
| 没有多公司规则 | HIGH | 模型有 company_id,但没有记录规则 |
| 权限过于宽泛 | MEDIUM | 向非管理员组授予 DELETE 权限 |
| 未知组引用 | LOW | CSV 引用了未定义的组 |
层:路由
| 检查项 | 严重程度 | 描述 |
|---|---|---|
| auth='none' 且没有身份验证代码 | CRITICAL | 完全未经身份验证的路由 |
| 缺少 auth= 参数 | HIGH | 使用隐式默认值 |
| 公开路由中同时使用 sudo() 和敏感模型 | HIGH | 存在 IDOR 风险 |
| 用户路由设置 csrf=False | HIGH | CSRF 漏洞 |
| auth='public' 且使用敏感模型 | MEDIUM | 数据泄露 |
| 混用 GET/POST 方法 | MEDIUM | 违反 HTTP 语义 |
层:sudo()
| 检查项 | 严重程度 | 描述 |
|---|---|---|
| 在公开路由中对敏感模型使用 sudo() | CRITICAL | 绕过所有访问控制 |
| 在公开路由中使用 sudo() | HIGH | 权限提升 |
| 对敏感模型使用 sudo() | HIGH | 访问范围过广 |
| 在循环中使用 sudo() | MEDIUM | 性能与安全方面的不良做法 |
| 未限定范围的 sudo() | MEDIUM | 没有域过滤器 |
层:SQL 注入
| 检查项 | 严重程度 | 描述 |
|---|---|---|
| cr.execute() 中使用 f-string | CRITICAL | 直接 SQL 注入 |
| cr.execute() 中使用 .format() | CRITICAL | 直接 SQL 注入 |
| cr.execute() 中使用字符串拼接 | HIGH | 存在 SQL 注入风险 |
| cr.execute() 中使用 % 运算符 | HIGH | 存在 SQL 注入风险 |
| cr.execute() 中使用变量查询 | MEDIUM | 检查参数化处理 |
| 使用 _where_calc 但未使用 _apply_ir_rules | LOW | 绕过记录规则 |
敏感模型(通过 sudo/公开路由访问时风险升高)
res.partner, res.users, hr.employee, hr.payslip, account.move,
account.payment, sale.order, purchase.order, stock.picking,
ir.config_parameter, ir.attachment, ir.rule, ir.model.access,
mail.message, res.partner.bank
配置
用户可以在模块根目录中创建 .odoo-security.json 进行自定义:
{
"sensitive_models_add": ["custom.sensitive.model"],
"sensitive_models_remove": ["mail.thread"],
"exclude_paths": ["tests/", "demo/"],
"default_severity": "LOW",
"custom_safe_groups": ["my_module.group_special"]
}
详细参考资料
如需查看详细的修复模式和代码示例,请阅读以下文件:
-
memories/security_patterns.md — 按严重程度划分的模式,包含检测命令,以及针对各类问题(缺少访问规则、
auth='none'路由、公开控制器中的sudo()、SQL 注入、多公司规则、敏感字段)的可用于生产环境的修复代码。 -
memories/access_rules.md — 完整的 ir.model.access.csv 参考资料,包含列定义、model_id:id 推导规则、8 种标准访问模式(内部、只读、门户、向导、多公司、仅系统、公开、继承)、组层级、带域变量的记录规则,以及常见错误检查清单。
-
memories/odoo_vulnerabilities.md — Odoo 的 8 种主要漏洞类型,包含 CWE 类别、不安全与安全的代码示例,以及适用于生产环境的修复方案:SQL 注入、IDOR、批量赋值、通过
sudo()提升权限、QWeb 中的 SSTI、附件 IDOR、缺少 CSRF,以及信息泄露。
需要向用户提供详细修复代码时,请阅读相应的记忆文件。
输出格式
请以结构化报告的形式呈现调查结果:
ODOO SECURITY AUDIT REPORT
Module: module_name
Risk Score: 65/100 — Significant vulnerabilities present
SUMMARY
CRITICAL 2 issues
HIGH 1 issue
MEDIUM 1 issue
ISSUES (sorted by severity)
[CRITICAL] models/my_model.py:15
Model 'my.model' has no access rules in ir.model.access.csv
FIX: Add entry — access_my_model_user,my.model user,model_my_model,[group],1,1,1,0
[HIGH] controllers/main.py:34
Route ['/orders'] uses auth='none' without API key validation
FIX: Add API key validation or change auth='user'
对于每个问题,务必包含:
- 严重性标识和文件位置
- 对问题所在的明确说明
- 可直接复制粘贴的具体修复代码