odoo-security について
odoo-securityは、Odooモジュールを監査し、開発者によるセキュリティ問題への対処を支援するスキルです。アクセスルール、ルート、sudo()の使用、SQLを検査し、深刻度順の結果と修正コードを提示します。
主な機能
- 01モデルアクセスルールのスキャン
- 02コントローラールートの監査
- 03危険なsudo()使用の検出
- 04安全でないSQL書式の検出
- 05深刻度順の問題整理
- 06修正コードの提示
活用シーン
- 01デプロイ前のOdooモジュール確認
- 02モデルアクセスルールの不足確認
- 03公開ルートの認可リスク確認
- 04SQLインジェクションの可能性の特定
インストール
コマンドをコピーしてターミナルで実行します。
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)=(問題数 × 重み)の合計。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 | 暗黙のデフォルト値 |
| public 内の sudo() + 機密モデル | HIGH | IDOR のリスク |
| ユーザールートで csrf=False | HIGH | CSRF の脆弱性 |
| auth='public' + 機密モデル | MEDIUM | データ漏えい |
| GET/POST メソッドの混在 | MEDIUM | HTTP セマンティクスへの違反 |
レイヤー:sudo()
| チェック | 深刻度 | 説明 |
|---|---|---|
| public 内の sudo() + 機密モデル | CRITICAL | すべてのアクセス制御を回避 |
| public ルート内の 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 | パラメーター化を確認 |
| _apply_ir_rules のない _where_calc | LOW | レコードルールを回避 |
機密モデル(sudo/public 経由でアクセスする場合、リスクが高まります)
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'
各問題について、必ず次の内容を含めてください。
- 重大度バッジとファイルの場所
- 問題点の明確な説明
- コピーしてそのまま使える具体的な修正コード