Static security scanner for MoonBit projects
Dependencies
| 项目 | 检出 | 类型 | 修复 PR | 状态 |
|---|---|---|---|---|
| mizchi/luna.mbt | 14 | CRLF 注入 | #103 | ✅ 已合并 |
| oboard/mocket | 8 | XSS、CRLF 注入、Cookie、CORS、目录穿越 | #12 | ✅ 已合并 |
| moonbit-community/crescent | 8 | Cookie、DoS、CORS | #44 | 🔵 Open |
| moonbitlang/async | 3 | CRLF 注入 | #494 | ✅ 已合并 |
| moonbit-community/rabbita | 2 | 目录穿越 | #126 | ✅ 已合并 |
| moonbit-community/cmark.mbt | 1 | XSS(已由上游修复为 safe=true) | #137 | 🔵 Open |
moon add minie135/moon-auditmoon update
moon build --target native --release
# 产物:_build/native/release/build/src/main/main.exe# 静态扫描
moon-audit --format json /path/to/project
# 指定规则
moon-audit --rule CWE-113/crlf-injection /path/to/project
# 增量扫描(只扫描变更文件,适合 CI)
git diff --name-only HEAD~1 > changed.txt
moon-audit --changed-files changed.txt /path/to/project
# 生成 baseline(存量项目首次接入时,过滤已知告警)
moon-audit generate-baseline -o baseline.json /path/to/project
moon-audit --baseline baseline.json /path/to/project
# 查看所有规则
moon-audit list-rulesmoon run src/main -- --rule CWE-22/path-concat --rule CWE-113/crlf-injection examples/moon-audit --format json /path/to/project # JSON
moon-audit --format sarif -o results.sarif /path/to # SARIF(GitHub Code Scanning)
moon-audit --fail-on-error /path/to/project # 有 Error 级别时 exit 1| 规则 ID | 描述 | 默认 | 上下文过滤 |
|---|---|---|---|
| CWE-116/replace-escaping | String::replace() 仅替换首次出现,HTML 转义不完整 | 开启 | — |
| CWE-22/path-concat | 路径拼接可能导致目录穿越 | 关闭 | API 路由/HTML/URL/git ref/shell/框架内部路径/字符串比较方法参数跳过 |
| CWE-94/eval-extern | extern JS 中使用 eval()/new Function() | 关闭 | — |
| CWE-113/crlf-injection | HTTP 响应头注入动态值 | 关闭 | let 绑定常量/sanitized 变量/全常量 match 跳过 |
| CWE-248/panic-reachable | 库代码中 panic()/abort() 使调用者无法恢复 | 关闭 | — |
| CWE-676/unsafe-call | 危险类型转换 (unsafe_from_*/unsafe_new) | 关闭 | unsafe_to_char/unsafe_to_byte 跳过 |
| CWE-704/unsafe-cast | .cast()/.reinterpret_cast() 绕过类型系统 | 关闭 | — |
| 规则 ID | 描述 | 门控框架 |
|---|---|---|
| CWE-79/cmark-unsafe | cmark 渲染 safe=false,原始 HTML 注入 | cmark |
| CWE-79/inner-html | inner_html() 接收动态内容,DOM XSS | rabbita |
| CWE-79/template-injection | HTML 响应字符串插值,反射型 XSS | mocket/crescent |
| CWE-942/cors-credentials | CORS credentials=true 且未限制 Origin | mocket/crescent |
| CWE-614/cookie-attrs | Cookie 缺少 HttpOnly/Secure/SameSite | mocket/crescent |
| CWE-770/no-body-limit | 无请求体大小限制,DoS 风险 | crescent |
| CWE-346/ws-origin | WebSocket 无 Origin 校验 | mocket/crescent |
{
"rules": {
"CWE-676/unsafe-call": { "enabled": true },
"CWE-94/eval-extern": { "enabled": false }
},
"exclude": ["_build", ".mooncakes", "*_test.mbt"]
}moon-audit --rule CWE-676/unsafe-call --rule CWE-248/panic-reachable /path/to/project# .github/workflows/security.yml
name: Security Audit
on: [push, pull_request]
jobs:
audit:
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- uses: actions/checkout@v4
- uses: I3eg1nner/moon-audit@main- uses: I3eg1nner/moon-audit@main
with:
fail-on-findings: 'true'
severity: 'error'
upload-sarif: 'true'# 项目验证:用项目自己的工具链编译检查、核对源码和依赖快照
moon-audit --verify-project --project-toolchain /path/to/project-moon \
--target native --format sarif -o results.sarif /path/to/project
# 语义检测:固定 mocket get 回调的数据流追踪
moon-audit --analysis semantic --verify-project \
--semantic-scope mocket-get-callbacks \
--project-toolchain /path/to/project-moon --target native \
--format json /path/to/project
# 多模块 workspace 扫描
moon-audit workspace /path/to/workspacemoon add minie135/moon-auditfn check_security(project_path : String) -> Unit {
let config = @audit.Config::default()
let result = @audit.scan_project(project_path, config)
let errors = result.findings.filter(fn(f) { f.severity == @audit.Error })
if errors.length() > 0 {
println(@audit.format_text(result, false))
}
} .mbt 源码 → Import 分析 → AST 解析 → 14 条规则匹配 → 上下文过滤 → 报告输出
↓(可选)
LLM 复核 / 语义数据流moon test --target all --deny-warn
moon fmt --check
moon info
moon build --target native
python3 scripts/cli_regression_test.py
python3 scripts/detection_benchmark.py # 检测回归基准(23 用例 × 6 规则)Install
Download zipStatic security scanner for MoonBit projects
Dependencies