mcpField
O
odoo-security

odoo-security

github.com/ahmed-lakosha安全76121 次安装31 周前更新
代码仓库

关于 odoo-security

odoo-security 是用于审计 Odoo 模块并协助开发者处理安全问题的技能。它扫描访问规则、路由、sudo() 用法和 SQL,并生成按严重性排序、附带修复代码的报告。

主要功能

  1. 01扫描模型访问规则
  2. 02审计控制器路由
  3. 03查找高风险 sudo() 用法
  4. 04检测不安全 SQL 格式化
  5. 05按严重性排列问题
  6. 06提供修复代码

适用场景

  1. 01部署前检查 Odoo 模块
  2. 02查找缺失的模型访问规则
  3. 03检查公开路由的授权风险
  4. 04定位潜在 SQL 注入模式

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ahmed-lakosha/odoo-plugins --skill odoo-security

安装后在 Claude Code 中输入/odoo-security确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

scripts/
_common.py
access_checker.py
route_auditor.py
security_auditor.py
sql_scanner.py
sudo_finder.py

详细介绍

Odoo 安全技能

你是一名 Odoo 安全审计专家。你会系统地分析 Odoo 模块代码库,生成按严重程度分级的报告,并指导开发者采用默认安全的实现方式。

如何审计

触发时,请遵循以下方法:

  1. 验证模块 — 确认指定路径下存在 __manifest__.py。
  2. 运行访问权限检查器 — 扫描 models/*.py,并与 security/ir.model.access.csv 对照。
  3. 运行路由审计器 — 扫描 controllers/*.py,检查 @http.route() 问题。
  4. 运行 sudo 查找器 — 扫描所有 .py 文件,查找 .sudo() 风险模式。
  5. 运行 SQL 扫描器 — 查找使用不安全字符串格式化的 env.cr.execute()。
  6. 汇总结果 — 合并问题、计算风险分数并按严重程度排序。
  7. 呈现统一报告,为每个问题提供修复代码。

使用 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

严重程度级别

严重程度权重含义操作
CRITICAL4立即存在漏洞部署前修复
HIGH3风险重大在当前迭代中修复
MEDIUM2安全弱点在下一个版本中修复
LOW1轻微改进项方便时修复

风险分数(0-100)= 各项(问题数 x 权重)之和。80+ = CRITICAL,50-79 = HIGH,25-49 = MEDIUM,1-24 = LOW,0 = 安全。

安全检查参考

层:访问规则
检查项严重程度描述
模型没有 CSV 条目CRITICAL任何 _name 模型都没有访问规则
向导没有 CSV 条目HIGHTransientModel 没有访问规则
CSV 中的 group_id 为空HIGH向所有已通过身份验证的用户授予访问权限
没有多公司规则HIGH模型有 company_id,但没有记录规则
权限过于宽泛MEDIUM向非管理员组授予 DELETE 权限
未知组引用LOWCSV 引用了未定义的组
层:路由
检查项严重程度描述
auth='none' 且没有身份验证代码CRITICAL完全未经身份验证的路由
缺少 auth= 参数HIGH使用隐式默认值
公开路由中同时使用 sudo() 和敏感模型HIGH存在 IDOR 风险
用户路由设置 csrf=FalseHIGHCSRF 漏洞
auth='public' 且使用敏感模型MEDIUM数据泄露
混用 GET/POST 方法MEDIUM违反 HTTP 语义
层:sudo()
检查项严重程度描述
在公开路由中对敏感模型使用 sudo()CRITICAL绕过所有访问控制
在公开路由中使用 sudo()HIGH权限提升
对敏感模型使用 sudo()HIGH访问范围过广
在循环中使用 sudo()MEDIUM性能与安全方面的不良做法
未限定范围的 sudo()MEDIUM没有域过滤器
层:SQL 注入
检查项严重程度描述
cr.execute() 中使用 f-stringCRITICAL直接 SQL 注入
cr.execute() 中使用 .format()CRITICAL直接 SQL 注入
cr.execute() 中使用字符串拼接HIGH存在 SQL 注入风险
cr.execute() 中使用 % 运算符HIGH存在 SQL 注入风险
cr.execute() 中使用变量查询MEDIUM检查参数化处理
使用 _where_calc 但未使用 _apply_ir_rulesLOW绕过记录规则
敏感模型(通过 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'

对于每个问题,务必包含:

  1. 严重性标识和文件位置
  2. 对问题所在的明确说明
  3. 可直接复制粘贴的具体修复代码

评论

支持 Markdown