Static security scanner for MoonBit projects
| 规则 ID | 描述 | 严重级别 |
|---|---|---|
| CWE-116/replace-escaping | String::replace() 仅替换首次出现,HTML 转义不完整 | Error |
| CWE-79/cmark-unsafe | cmark 渲染 Markdown 时默认 safe=false,允许注入 | Error |
| CWE-79/inner-html | inner_html() 接收动态内容,DOM XSS | Error |
| CWE-79/template-injection | HTML 响应中使用字符串插值,反射型 XSS | Error |
| CWE-94/eval-extern | extern JS 中使用 eval()/new Function() | Error |
| CWE-113/crlf-injection | HTTP 响应头注入动态值,CRLF 注入 | Error |
| CWE-942/cors-credentials | CORS credentials=true 且未限制 Origin | Error |
| CWE-614/cookie-attrs | Cookie 缺少 HttpOnly/Secure/SameSite 属性 | Warning |
| CWE-770/no-body-limit | 服务器无请求体大小限制,DoS 风险 | Warning |
| CWE-346/ws-origin | WebSocket 无 Origin 校验 | Warning |
| CWE-22/path-concat | 路径拼接可能导致目录穿越 | Warning |
moon add nicball/moon-auditmoon run src/main -- /path/to/moonbit-project# JSON 格式
moon run src/main -- --format json /path/to/project
# SARIF 格式(GitHub Code Scanning)
moon run src/main -- --format sarif -o results.sarif /path/to/projectmoon run src/main -- list-rules{
"rules": {
"CWE-116/replace-escaping": { "enabled": true, "severity": "error" },
"CWE-94/eval-extern": { "enabled": false }
},
"exclude": ["_build", ".mooncakes", "*_test.mbt"]
}src/
├── scanner.mbt # 主扫描引擎:目录遍历、AST 解析、规则调度
├── types.mbt # 核心类型:Finding, Severity, RuleId, Config
├── helpers.mbt # AST 参数检查工具函数
├── import_analysis.mbt # moon.pkg/moon.mod 依赖分析
├── config.mbt # .moon-audit.json 配置加载
├── output.mbt # Text/JSON 输出格式化
├── sarif.mbt # SARIF 2.1.0 输出
├── llm_prompt.mbt # LLM 辅助分析提示词生成
├── poc_gen.mbt # PoC 漏洞利用脚本生成
├── remediation.mbt # 修复建议引擎
├── taint.mbt # 污点追踪数据流分析
├── summary.mbt # 扫描统计报告
├── cwe*.mbt # 各 CWE 规则实现
├── scanner_test.mbt # 核心规则测试
├── extended_test.mbt # 扩展模块测试
└── main/main.mbt # CLI 入口静态分析发现 → 生成结构化提示词 → LLM 深度分析 → 误报过滤 → 高精度结果静态分析发现 → 分类 CWE 类型 → 生成 Python 利用脚本 → 红队验证# 编译检查
moon check
# 运行测试
moon test
# 格式化代码
moon fmt