WindClaw-mac-arm64.dmg 详细分析报告
分析日期: 2026-04-21
分析目标: /Users/jay/Downloads/WindClaw-mac-arm64.dmg
分析者: Claude (Opus 4.7)
分析平台: macOS 26 (Darwin 25.3.0)
摘要
WindClaw-mac-arm64.dmg 是由 上海万得信息技术股份有限公司 (Shanghai Wind Information Co., Ltd.) 发布的 macOS Apple Silicon 原生安装包,内含一款名为 WindClaw 的 Electron 桌面 AI Agent 客户端,版本 0.9.19。该应用内核为开源项目 openclaw (2026.3.13),定位为面向投资/金融场景的多通道 AI Agent,深度整合 Wind 自家金融数据 API、网页搜索 MCP,以及桌面自动化、办公应用 (Excel/PPT/Notion/Obsidian 等) 的 70+ 个 skills。
包已通过 Apple 公证 (Notarized Developer ID),签名与 Hardened Runtime 配置完整,未发现恶意行为。存在若干值得关注的细节:自动更新走 HTTP、入口 plist 开放 NSAllowsArbitraryLoads、应用声明的系统权限覆盖面很广(与其桌面自动化定位相符)、构建产物里泄漏了内部开发者用户名与原代号 AB1Claw / ClawX。
一、分析方法与过程
1.1 分析思路
对一个未知来源的 macOS .dmg 文件,采用由外至内、由静态到语义的分层方法:
1. 容器层:确认 dmg 本身格式、完整性、体积;
2. 文件系统层:挂载后枚举顶层内容;
3. Bundle 层:读取 Info.plist、签名、entitlements、资源目录;
4. 运行时/业务层:识别运行时 (Electron/Node/Python uv),检查主要 JS/配置,梳理插件与 skills;
5. 风险评估:签名链、网络配置 (ATS)、权限声明、自动更新通道、泄漏信息。
整个过程只使用只读挂载,不安装、不启动应用;分析结束立即 hdiutil detach。
1.2 使用的命令与工具
| 目的 | 命令 |
|---|---|
| 基础识别 | `file`, `shasum -a 256`, `ls -la` |
| DMG 元数据 | `hdiutil imageinfo` |
| 只读挂载 | `hdiutil attach -readonly -nobrowse -mountpoint /tmp/windclaw_mnt` |
| 签名/公证 | `codesign -dvv`, `codesign -d --entitlements :-`, `spctl --assess -vv` |
| 文件读取 | `ls`, `cat`, 文件读取工具 |
| 大小统计 | `du -sh` |
| 卸载 | `hdiutil detach` |
1.3 关键步骤记录
Step 1 — 文件识别
file: zlib compressed data
size: 322,200,316 bytes (~307 MB)
sha256: fdd77d68ebc7a2443eed82f7fe24826c323e82e49281907979c89a04bf3b4955
Step 2 — DMG 元数据
Format: UDZO (已压缩为 UDIF 只读, zlib)
Class: CUDIFDiskImage
Total Bytes: 846,718,464 (~807 MB 解压后容量)
Checksum Type: CRC32 Value: $B4422312
Partition scheme: GPT,主分区为 Apple_APFS
完整性校验全部 "已验证"。
Step 3 — 挂载与顶层结构
/tmp/windclaw_mnt/
├── Applications -> /Applications (符号链接,DMG 安装惯例)
└── WindClaw.app/
└── Contents/
├── Info.plist
├── MacOS/WindClaw (53 KB, 典型 Electron loader)
├── Frameworks/ (Electron Framework + Squirrel + 4 个 Helper app)
├── Resources/
└── _CodeSignature/
Squirrel.framework 的存在表明采用 Electron 标准的 Squirrel 自动更新。
Step 4 — Info.plist 要点
CFBundleIdentifier : com.wind.windclaw
CFBundleDisplayName : WindClaw
CFBundleShortVersionString : 0.9.19
CFBundleVersion : 0.9.19
LSMinimumSystemVersion : 12.0
LSApplicationCategoryType : public.app-category.productivity
DTSDKName : macosx15.5
DTXcodeBuild : 16F6
NSPrincipalClass : AtomApplication ← 确认 Electron
ElectronAsarIntegrity : app.asar / default_app.asar 的 SHA256 预期值
声明的权限使用说明 (UsageDescription) 极其全面:麦克风、摄像头、蓝牙、日历、提醒、通讯录、定位、照片库、桌面/文档/下载/可移动/网络卷文件夹、语音识别、Apple Events(控制其他 App)。同时开启:
NSAppTransportSecurity.NSAllowsArbitraryLoads = true
NSAppTransportSecurity.NSAllowsLocalNetworking = true
127.0.0.1 / localhost: 允许 HTTP 明文(本地 MCP 服务常见)
还有两个遗留名字 "ClawX"(摄像头、麦克风描述里),暗示应用曾用此代号。
Step 5 — 代码签名与公证
Identifier : com.wind.windclaw
Format : app bundle with Mach-O thin (arm64)
CodeDirectory : v=20500 flags=0x10000(runtime) ← Hardened Runtime
Authority chain : Developer ID Application: Shanghai Wind Information Co., Ltd. (VGTWX38GBJ)
: Developer ID Certification Authority
: Apple Root CA
Timestamp : Apr 17, 2026 at 16:09:42
TeamIdentifier : VGTWX38GBJ
Runtime Version : 26.1.0
Sealed Resources : v2 rules=13 files=19134
spctl --assess: accepted
source=Notarized Developer ID
Apple Gatekeeper 判定为已公证的 Developer ID,可正常运行。
Entitlements:
com.apple.security.cs.allow-dyld-environment-variables : true
com.apple.security.cs.allow-jit : true
com.apple.security.cs.allow-unsigned-executable-memory : true
com.apple.security.cs.disable-library-validation : true
com.apple.security.device.audio-input : true
com.apple.security.files.downloads.read-write : true
com.apple.security.files.user-selected.read-write : true
com.apple.security.network.client : true
前四项是 Electron 应用的必要配置(加载 V8 JIT、允许第三方 framework 装入);network.client、files.user-selected 是客户端基础。
Step 6 — Resources 结构
Resources/
├── app-update.yml (Squirrel 更新配置)
├── app.asar (19.3 MB) (Electron 主进程/渲染业务代码)
├── default_app.asar (109 KB)
├── icon.icns (668 KB)
├── bin/uv (43.5 MB, arm64) (Python 包管理器 uv 0.10.0)
├── cli/openclaw (用户可调用的 CLI 入口 shell 脚本)
├── openclaw/ (293 MB) ← 核心 Node.js 运行代码、dist、node_modules、skills、docs
├── openclaw-extensions/ (1.7 MB) ← Wind 官方扩展 + skills
├── openclaw-plugins/ (11 MB) ← 第三方通讯平台插件
└── resources/ (图标、licenses、context md 文件)
Step 6.1 — 自动更新配置
provider: generic
url: http://upgcdn.wind.com.cn/Windnet/RUNIMAGE.cosmos/10060
useMultipleRangeRequest: false
updaterCacheDirName: windclaw-updater
更新通道为明文 HTTP(upgcdn.wind.com.cn)。理论上 Squirrel 会再校验下载产物的代码签名,但该配置仍是一个值得记录的弱点。
Step 6.2 — OpenClaw 内核元信息
从 openclaw/package.json:
name : openclaw
version : 2026.3.13
description : Multi-channel AI gateway with extensible messaging integrations
license : MIT
homepage : https://github.com/openclaw/openclaw#readme
dependencies: 约 90 个
从 openclaw/.bundle-fingerprint.json 可见内部构建路径:
/Users/pguo/Documents/gitDev/AB1Claw/windows/node_modules/.pnpm/openclaw@2026.3.13_.../openclaw
泄漏信息:
- 内部开发者用户名
pguo - 原工程代号
AB1Claw - 构建工具链:pnpm monorepo
从 openclaw/.bundle-id:openclaw@2026.3.13+44eb11932fbc。
Step 6.3 — CLI 入口
Resources/cli/openclaw 是一个 sh 脚本,复用 Electron 可执行作为 Node 运行:
export OPENCLAW_EMBEDDED_IN="WindClaw"
ELECTRON_RUN_AS_NODE=1 exec "$ELECTRON" "$CLI" "$@"
也就是说:即使用户不打开 GUI,也能通过 WindClaw.app/.../cli/openclaw 直接以命令行方式驱动 openclaw。这解释了为何需要 allow-dyld-environment-variables 权限。
Step 6.4 — Python 运行时
bin/uv: Mach-O 64-bit executable arm64 (uv 0.10.0, build 0ba432459, 2026-02-05)
打包了 Astral 公司出品的 uv Python 包管理器。通常用于启动 Python 实现的 MCP server / skill 运行时。
Step 6.5 — Plugin/Extension 分类
openclaw-extensions/:
| 目录 | 作用 |
|---|---|
| `wind_financial_data/` | 调用 Wind AB1 workflow API(非 MCP) |
| `wind_web_search/` | 调用 Wind MCP `internet_search` |
| `ab1-mcp/` | 标记为 deprecated placeholder |
| `skills/` | 70+ 技能目录(见下) |
openclaw-plugins/:
| 目录 | 作用 |
|---|---|
| `dingtalk/` | 钉钉集成 |
| `openclaw-weixin/` | 微信(Weixin)集成 |
Step 6.6 — Skills 目录 (重点)
openclaw/skills/ (通用技能 50+):
1password, apple-notes, apple-reminders, bear-notes, blogwatcher, blucli, bluebubbles, camsnap, canvas, clawhub, coding-agent, discord, eightctl, gemini, gh-issues, gifgrep, github, gog, healthcheck, himalaya, imsg, mcporter, model-usage, nano-banana-pro, nano-pdf, node-connect, notion, obsidian, openai-image-gen …
openclaw-extensions/skills/ (业务/自动化技能 70+):
agentmail-1.1.1, auto-updater, A股市场主线识别, chart-image-2.5.1, computer-use-1.2.1, daily-planner-1.0.0, desktop-control-1.0.0, elite-longterm-memory, ems-sim-trading, excel-xlsx, fast-browser-use-1.0.5, file-search-1.0.0, find-skills, github, humanizer, image-1.0.4, imap-smtp-email, macro-analysis, markdown-converter-1.0.0, market-analysis, mcporter, multi-search-engine, n8n-workflow-automation-1.0.0, nano-pdf, ontology, outlook-api-1.0.3, pdf-0.1.0, powerpoint-pptx, proactive-agent …
可见产品定位为 "会下单/会炒股/会写报告/会操作你电脑"的投资 AI Agent。
Step 6.7 — Agent 人格与工作流
Resources/resources/context/ 下 7 个 markdown 定义了 Agent 行为:
IDENTITY.windclaw.md— 角色设定为 "WindClaw 投资小龙虾 🦞",强调数据驱动、结构化、专业。AGENTS.windclaw.md— 工作区规则:
- 会话启动自动读取 SOUL.md / USER.md / 今天与昨天 memory / MEMORY.md
- Skills First → Tools Second → Reasoning Third
- 工具调用优先顺序:Wind 金融数据 > Web 搜索 > 本地研究资料
- 对 Wind 工具设了"单次回答调用限制"
- 其余:
SOUL.md,USER.md,HEARTBEAT.md,TOOLS.md,MEMORY.md。
二、分析结果
2.1 产品定性
| 维度 | 结论 |
|---|---|
| 产品名 | WindClaw(万得爪 / 投资小龙虾) |
| 类型 | Electron 桌面 AI Agent 客户端 |
| 厂商 | 上海万得信息技术股份有限公司(Wind 资讯) |
| 内核 | openclaw 2026.3.13(自家/关联开源项目,MIT) |
| 目标用户 | 金融/投资领域终端用户(A股分析、宏观研究等) |
| 交付渠道 | DMG + Squirrel 自动更新 |
2.2 技术组成
┌─ WindClaw.app (Electron shell) ─────────────────────────────┐
│ ├── Electron Framework (Chromium + V8 + Node) │
│ ├── 4 Helper 子进程 (GPU / Plugin / Renderer / 默认) │
│ ├── Squirrel.framework (自动更新) │
│ └── Resources/ │
│ ├── app.asar ← 主进程/UI │
│ ├── openclaw/ ← Node AI Agent 内核 │
│ │ └── dist/*.js (600+), node_modules (385+) │
│ ├── openclaw-extensions/ ← 业务扩展 + skills │
│ ├── openclaw-plugins/ ← 钉钉/微信 │
│ ├── bin/uv (43 MB) ← Python uv 运行时 │
│ └── cli/openclaw ← 命令行入口 (Electron as Node)│
└─────────────────────────────────────────────────────────────┘
双形态运行:
1. GUI 模式:用户点开 app,主进程加载 app.asar;
2. CLI 模式:通过 ELECTRON_RUN_AS_NODE=1 直接把 Electron 当 Node 用,执行 openclaw.mjs。
2.3 签名与分发可信度
| 检查 | 结果 |
|---|---|
| Developer ID 签名 | ✅ 上海万得 (Team ID `VGTWX38GBJ`) |
| Apple 公证 | ✅ `source=Notarized Developer ID` |
| Hardened Runtime | ✅ 已启用 (`flags=0x10000`) |
| Gatekeeper | ✅ `accepted` |
| ASAR 完整性 | ✅ Info.plist 中有 `ElectronAsarIntegrity` 预期哈希 |
| DMG 校验和 | ✅ CRC32 全部通过 |
可认定 来源与完整性可信,非钓鱼/破解/伪签名包。
2.4 权限画像
必需/合理:
network.client— AI 模型调用与搜索files.user-selected、files.downloads— 用户选文件、下载audio-input— 语音输入 skill
需用户知情的宽授权:
NSAppleEventsUsageDescription— 意味着可脚本化控制其他 App(对应computer-use/desktop-controlskill)NSMicrophoneUsageDescription,NSSpeechRecognitionUsageDescription— 语音转写NSContactsUsageDescription,NSCalendarsUsageDescription,NSRemindersUsageDescription,NSPhotoLibraryUsageDescription,NSLocationWhenInUseUsageDescription,NSBluetoothAlwaysUsageDescription,NSCameraUsageDescription— 按需求弹窗,不用不给即可
Electron 内部放宽:
allow-jit,allow-unsigned-executable-memory,disable-library-validation,allow-dyld-environment-variables— 所有 Electron 应用的标配,但意味着 Hardened Runtime 的代码注入防护被解除,在 Electron 生态里属可接受,但在威胁模型中要记一笔。
2.5 发现的风险与观察项
| # | 风险/观察 | 级别 | 说明与建议 |
|---|---|---|---|
| 1 | 自动更新走 HTTP (`upgcdn.wind.com.cn`) | ⚠ 中 | Squirrel 默认校验代码签名可缓解,但仍建议厂商迁移 HTTPS;企业/高风险用户可在边界禁用或代理审计 |
| 2 | `NSAllowsArbitraryLoads = true` + `127.0.0.1`/`localhost` HTTP 明文豁免 | ⚠ 低 | 本地 MCP/子进程常用,非对外暴露,但会放宽整包 ATS |
| 3 | 声明了 Apple Events / 全设备权限 | ⚠ 中 | 产品的确有 `desktop-control` / `computer-use` 能力;用户应在"系统设置→隐私与安全性"按需关闭 |
| 4 | 4 个 Electron `disable-library-validation` 类 entitlement | ⚠ 低 | Electron 生态标配,风险可接受 |
| 5 | 构建产物泄漏内部路径:`/Users/pguo/Documents/gitDev/AB1Claw/windows/...` | ℹ 信息泄漏 | 暴露开发者用户名与内部代号,建议 CI 里清理 |
| 6 | Info.plist 残留旧名 "ClawX" | ℹ 瑕疵 | 多处权限描述仍写 `ClawX requires ...`,与 `WindClaw` 不一致 |
| 7 | 业务包极大(Resources 344 MB,含 600+ JS 与 385+ node_modules) | ℹ 信息 | 攻击面相应增大,第三方依赖众多;未做 SCA 扫描 |
| 8 | 桌面自动化 + 钉钉/微信插件组合 | ⚠ 需知情 | 具备可自动发消息/调 IM 能力,企业部署时应评估合规 |
| 9 | 捆绑 `uv` + 允许动态下载 Python 依赖 | ℹ 信息 | Skills 运行时可能在首次运行拉取外部 Python 包;建议在隔离网络评估 |
未发现:
- ❎ 未发现恶意代码迹象
- ❎ 未发现未签名的 Mach-O 二进制
- ❎ 未发现明显后门域名(仅
wind.com.cn子域) - ❎ 未发现破坏 SIP / 要求 root 的脚本
2.6 版本与时间线
| 项 | 值 |
|---|---|
| App 版本 | 0.9.19 |
| openclaw 内核版本 | 2026.3.13 |
| 签名时间 | 2026-04-17 16:09:42 |
| SDK | macOS 15.5, Xcode 16F6 |
| Electron Runtime | 26.1.0 |
版本号 0.9.x 暗示产品仍属 公测/早期阶段。
三、证据清单(原始数据片段)
3.1 sha256
fdd77d68ebc7a2443eed82f7fe24826c323e82e49281907979c89a04bf3b4955 WindClaw-mac-arm64.dmg
3.2 签名链
Developer ID Application: Shanghai Wind Information Co., Ltd. (VGTWX38GBJ)
└─ Developer ID Certification Authority
└─ Apple Root CA
3.3 Entitlements
<key>com.apple.security.cs.allow-dyld-environment-variables</key><true/>
<key>com.apple.security.cs.allow-jit</key><true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key><true/>
<key>com.apple.security.cs.disable-library-validation</key><true/>
<key>com.apple.security.device.audio-input</key><true/>
<key>com.apple.security.files.downloads.read-write</key><true/>
<key>com.apple.security.files.user-selected.read-write</key><true/>
<key>com.apple.security.network.client</key><true/>
3.4 自动更新
provider: generic
url: http://upgcdn.wind.com.cn/Windnet/RUNIMAGE.cosmos/10060
useMultipleRangeRequest: false
updaterCacheDirName: windclaw-updater
3.5 内部构建路径泄漏
/Users/pguo/Documents/gitDev/AB1Claw/windows/node_modules/.pnpm/
openclaw@2026.3.13_.../openclaw
3.6 目录大小
293M Resources/openclaw
11M Resources/openclaw-plugins
1.7M Resources/openclaw-extensions
44M Resources/bin/uv
19M Resources/app.asar
四、建议
对普通用户
1. 从官方渠道下载(claw-x.com / wind.com.cn),并比对 sha256:
fdd77d68ebc7a2443eed82f7fe24826c323e82e49281907979c89a04bf3b4955
2. 首次启动后,在"系统设置 → 隐私与安全性"里按需授权:建议仅开启必要项(网络、麦克风/语音),其余(通讯录、位置、相册、蓝牙、照片库)默认拒绝,等真正用到再开。
3. Apple Events("自动化")授权涉及"控制其他 App",如不使用 computer-use / desktop-control skill,建议拒绝。
对企业/合规用户
1. 自动更新的 HTTP 通道建议通过企业代理代为审计,或在边界阻断,统一由 MDM 下发版本。
2. 钉钉/微信插件具备发消息能力,需走企业 IM 合规评审。
3. uv + skills 可能动态拉取 Python 依赖,应在出口控制里记录到 PyPI 的访问;必要时隔离运行。
4. 已泄漏的构建路径信息可反馈给厂商,以改进 CI。
对开发方(可反馈)
1. 升级自动更新到 HTTPS;
2. CI 里清理 .bundle-fingerprint.json 与 dist 中的本机绝对路径;
3. 统一 Info.plist 里的产品名(仍有 ClawX 残留);
4. 版本号从 0.9.x 提升并完善变更说明。
五、附录
5.1 顶层文件树(节选)
WindClaw.app/
└── Contents/
├── Info.plist
├── MacOS/WindClaw
├── Frameworks/
│ ├── Electron Framework.framework/
│ ├── Mantle.framework/
│ ├── ReactiveObjC.framework/
│ ├── Squirrel.framework/
│ ├── WindClaw Helper.app/
│ ├── WindClaw Helper (GPU).app/
│ ├── WindClaw Helper (Plugin).app/
│ └── WindClaw Helper (Renderer).app/
├── Resources/
│ ├── app.asar
│ ├── default_app.asar
│ ├── app-update.yml
│ ├── icon.icns
│ ├── bin/uv
│ ├── cli/openclaw
│ ├── openclaw/ (dist, node_modules, skills, docs, extensions)
│ ├── openclaw-extensions/ (wind_financial_data, wind_web_search, ab1-mcp, skills)
│ ├── openclaw-plugins/ (dingtalk, openclaw-weixin)
│ └── resources/ (cli, context, icons, licenses, skills, dmg-background.png)
├── PkgInfo
└── _CodeSignature/
5.2 关于 "openclaw"
- 自述 "Multi-channel AI gateway with extensible messaging integrations";
- MIT;
- GitHub
openclaw/openclaw; - plugin-sdk 支持 telegram / discord / slack / signal / imessage / whatsapp / line / msteams 等多通道;
- 本 DMG 中仅启用了钉钉、微信两个插件 + Wind 自家扩展。
5.3 关于 "投资小龙虾"
产品在 IDENTITY.windclaw.md 中为 Agent 赋予了拟人化形象(Emoji 🦞):数据驱动、结构化表达、侧重投资/行业研究、强调效率。其 AGENTS.windclaw.md 工作流强制 Skill 优先与工具调用限额,这是典型的 Anthropic Skills 式架构。
报告结束。
分析全程在本地只读挂载环境下进行,已卸载 (hdiutil detach /tmp/windclaw_mnt → "disk8" ejected),未运行任何 WindClaw 二进制。