moon-audit

Static security scanner for MoonBit projects

security
scanner
static-analysis
moon add minie135/moon-audit@0.2.1
Download zip
Author
Version
0.2.1
License
MulanPSL-2.0
Last updated
2 days ago
Downloads
17
README

#moon-audit

MoonBit Native Audit — MoonBit 原生静态安全扫描器。

#为什么需要 moon-audit?

MoonBit 是一门年轻的语言,社区正在快速长出 Web 框架(mocket、crescent)、Markdown 渲染器(cmark)、前端框架(rabbita)——但安全工具还是空白。

Semgrep、CodeQL 不认识 .mbt 文件。手动审计当然可以,但你不可能盯着每一个 PR 看 set_cookie() 有没有加 http_only=truehandle_cors() 有没有限制 Origin。

moon-audit 用 MoonBit 官方 parser 直接解析 AST,在语法树上匹配 14 条 CWE 安全规则。它知道 mocket 的 handle_cors() 应该限制 Origin,知道 cmark 的 render(safe=false) 会吞掉 XSS 防护,也知道 extern "js" 文件里的 .cast() 不是 bug 而是 FFI 的日常——会自动跳过。

不需要运行时环境,不需要外部依赖,moon build --target native 编译出来就是一个独立二进制,扫一个项目几秒钟。

#真实效果

对 MoonBit 生态 21 个开源项目(3,676 个文件)扫描,6 个项目检出漏洞,均已提交修复 PR,其中 4 个已被上游合并:

项目检出类型修复 PR状态
mizchi/luna.mbt14CRLF 注入#103✅ 已合并
oboard/mocket8XSS、CRLF 注入、Cookie、CORS、目录穿越#12✅ 已合并
moonbit-community/crescent8Cookie、DoS、CORS#44🔵 Open
moonbitlang/async3CRLF 注入#494✅ 已合并
moonbit-community/rabbita2目录穿越#126✅ 已合并
moonbit-community/cmark.mbt1XSS(已由上游修复为 safe=true)#137🔵 Open

其余 15 个项目未检出问题(未引入 Web 框架依赖,Import 门控自动跳过 Web 规则)。

静态扫描的价值在于发现——它能在代码合入前低成本地扫出可疑模式,但不可避免地会有误报(luna.mbt 的 14 个 CRLF 检出中 11 个是 config 驱动的固定 header 值)。所以 moon-audit 在静态扫描之上还提供了 PoC 动态验证脚本生成和 LLM 辅助分析,用于在本地部署的靶机上实际复现,区分真正的漏洞和噪音。目前所有提交 PR 的漏洞均经过本地运行时验证确认。

#快速开始

git clone https://github.com/I3eg1nner/moon-audit.git cd moon-audit moon install && moon build --target native # 扫描项目(一键全流程) ./moon-audit pipeline /path/to/project # 或单独运行静态扫描 ./moon-audit /path/to/project

二进制位于 _build/native/debug/build/src/main/main.exe,可复制到 PATH。 也可通过 moon add minie135/moon-audit 作为库依赖使用。

#输出格式

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

#检测规则

14 条规则,覆盖通用安全和 OWASP Top 10。

#通用安全规则

规则 ID描述默认上下文过滤
CWE-676/unsafe-call危险类型转换 (unsafe_to_*/unsafe_from_*/unsafe_new)关闭性能操作、guard body 跳过
CWE-248/panic-reachable库代码中 abort("message") 使调用者无法恢复关闭裸 panic、guard-else、平台桩、契约断言跳过
CWE-704/unsafe-cast.cast() 绕过类型系统关闭FFI 绑定文件跳过
CWE-116/replace-escapingString::replace() 仅替换首次出现,HTML 转义不完整开启
CWE-94/eval-externextern JS 中使用 eval()/new Function()关闭
CWE-22/path-concat路径拼接可能导致目录穿越关闭

#Web 框架规则(Import 门控)

仅在项目引入相关框架时激活,从源头消除无关误报。

规则 ID描述默认门控框架
CWE-79/cmark-unsafecmark 渲染 safe=false,原始 HTML 注入开启cmark
CWE-79/inner-htmlinner_html() 接收动态内容,DOM XSS关闭rabbita
CWE-79/template-injectionHTML 响应字符串插值,反射型 XSS开启mocket/crescent
CWE-113/crlf-injectionHTTP 响应头注入动态值开启通用
CWE-942/cors-credentialsCORS credentials=true 且未限制 Origin开启mocket/crescent
CWE-614/cookie-attrsCookie 缺少 HttpOnly/Secure/SameSite开启mocket/crescent
CWE-770/no-body-limit无请求体大小限制,DoS 风险开启crescent
CWE-346/ws-originWebSocket 无 Origin 校验开启mocket/crescent

标准库模块(moonbitlang/coremoonbitlang/x 等)自动跳过通用规则。

#CI 集成

#GitHub Actions

# .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

扫描结果自动出现在 Security → Code scanning alerts

默认不会导致 CI 失败——moon-audit 默认以信息模式运行(exit 0),扫描结果仅上报到 GitHub Security 面板,不阻断构建和合并流程。只有显式设置 fail-on-findings: 'true' 时,发现漏洞才会让 CI 返回非零退出码。

- uses: I3eg1nner/moon-audit@main with: fail-on-findings: 'true' # 显式启用:发现漏洞时阻断 CI severity: 'error' # 最低报告级别 upload-sarif: 'true' # 上传到 GitHub Security

#其他 CI

curl -fsSL https://cli.moonbitlang.com/install/unix.sh | bash export PATH="$HOME/.moon/bin:$PATH" git clone --depth 1 https://github.com/I3eg1nner/moon-audit.git /tmp/moon-audit cd /tmp/moon-audit && moon install moon run src/main -- --format json -o "$PROJECT_DIR/audit.json" "$PROJECT_DIR"

#配置

项目根目录创建 .moon-audit.json

{ "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 moon-audit list-rules # 查看所有规则

#辅助功能

核心 pipeline 之外的可选子命令:

# LLM 辅助验证(需配置 .env 中的 API Key) moon-audit llm-analyze --format script /path/to/project python3 llm_analyze.py # PoC 验证脚本生成 moon-audit generate-poc -o poc.md /path/to/project # 修复建议(含 Before/After 代码示例) moon-audit remediate -o fixes.md /path/to/project # 统计报告(按 CWE/OWASP 分类聚合) moon-audit summary /path/to/project

#作为库依赖

moon add minie135/moon-audit

fn 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 分析(moon.pkg/moon.mod) → AST 解析(moonbitlang/parser) → 14 条规则匹配 → 报告输出(Text/JSON/SARIF)

  1. Import 分析:解析依赖,构建 ImportContext,决定激活哪些 Web 规则
  2. AST 遍历:每条规则实现 IterVisitor trait,遍历语法树匹配漏洞模式
  3. 上下文过滤:识别 FFI 绑定、guard 校验、平台桩文件等安全上下文,抑制误报
  4. 输出:Text / JSON / SARIF 2.1.0,每条 Finding 含 confidence 分级和稳定 fingerprint

#开发

moon check # 编译检查 moon test # 运行测试(65 个用例 × 4 编译目标) moon fmt # 格式化

#许可证