Skip to content

iFlyCode Agent Webpack Bundle 完整分析

版本: 3.4.2-222 | 分析日期: 2026-05-11 | 文档编号: 66

1. 概述

本文档详细分析 iFlyCode Agent 的 webpack bundle(index.js,3.6 MB),包括加密体系、API 路由、数据库架构、Tree-sitter 解析器、WebSocket 通信和中文错误消息。

2. 基本信息

属性
包名iflycode-agent
版本3.4.2
Bundle 大小3.6 MB (index.js) + 976 KB (worker.js)
Node 版本要求<=12
入口bin/index.js
配置bin/config.json

2.1 配置文件 (config.json)

json
&#123;
  "agent.version": "3.4.2",
  "agent.wasmCheck": 10,
  "agent.url": "https://saas.api.example.com",
  "agent.update": true
&#125;

2.2 平台特定 Node 二进制

文件大小平台
x86_64_darwin_node93 MBmacOS x86_64
x86_64_darwin_arm_node89 MBmacOS ARM64
x86_64_linux_node92 MBLinux x86_64
x86_64_windows_node.exe71 MBWindows x86_64
x86_64_windows7_node.exe30 MBWindows 7

3. 加密体系完整分析

3.1 加密模块架构

encrypt(data, type, ...args)

    ├── switch(type):
    │   ├── "SM2" → encryptSM2(data, key)
    │   ├── "SM4" → encryptSM4(data, key)
    │   ├── "RSA" → encryptRSA(data, key)
    │   ├── "AES" → encryptAES(data, key, iv)
    │   └── "MD5" → cryptoMd5(data)

    └── decrypt(data, type, ...args)
        ├── "SM4" → decryptSM4(data, key)
        ├── "AES" → decryptAES(data, key, iv)
        └── default → return data

3.2 硬编码密钥(全部从源码提取)

密钥用途
RSA_PUB_KEY已脱敏 (1024-bit, 已脱敏)RSA 加密(1024-bit)
SM2_PUB_KEY已脱敏国密 SM2 加密
SM4_KEY已脱敏国密 SM4 加密
AES_KEY已脱敏AES-256-CTR 加密
AES_IV已脱敏AES-256-CTR IV

3.3 各加密算法实现

encryptRSA

javascript
function encryptRSA(data, key = RSA_PUB_KEY) &#123;
  const buf = Buffer.from(data, "utf8");
  const chunkSize = 64;  // 64字节分块
  const chunks = [];
  const results = [];
  // 分块加密(RSA 只能加密有限长度数据)
  for (let i = 0; i < buf.length; i += chunkSize) &#123;
    chunks.push(buf.slice(i, i + chunkSize));
  &#125;
  chunks.forEach(chunk => &#123;
    results.push(
      crypto.publicEncrypt(
        &#123; key, padding: crypto.constants.RSA_PKCS1_PADDING &#125;,
        chunk
      ).toString("base64")
    );
  &#125;);
  return results;  // 返回数组(每块一个 base64 字符串)
&#125;

关键: RSA 使用 PKCS1_PADDING,64 字节分块加密,返回 base64 数组。

encryptSM2

javascript
function encryptSM2(data, key = SM2_PUB_KEY) &#123;
  const hexKey = Buffer.from(key, "base64").toString("hex");
  const encrypted = smCrypto.sm2.doEncrypt(data, hexKey, 1);  // mode=1 (C1C3C2)
  return Buffer.from("04" + encrypted, "hex").toString("base64");
&#125;

关键: SM2 使用 sm-crypto 库,mode=1(C1C3C2 模式),结果前缀 "04"。

encryptSM4

javascript
function encryptSM4(data, key = SM4_KEY) &#123;
  const hexKey = Buffer.from(key, "base64").toString("hex");
  const encrypted = smCrypto.sm4.encrypt(data, hexKey, &#123; padding: "pkcs#5" &#125;);
  return Buffer.from(encrypted, "hex").toString("base64");
&#125;

关键: SM4 使用 PKCS#5 填充。

encryptAES

javascript
function encryptAES(data, key = AES_KEY, iv = AES_IV) &#123;
  const cipher = crypto.createCipheriv(
    "aes-256-ctr",
    Buffer.from(key, "base64"),
    Buffer.from(iv, "base64")
  );
  let result = cipher.update(data, "utf8", "base64");
  result += cipher.final("base64");
  return result;
&#125;

关键: AES-256-CTR 模式,密钥和 IV 都是 base64 编码的硬编码值。

decryptSM4

javascript
function decryptSM4(data, key = SM4_KEY) &#123;
  const hexKey = Buffer.from(key, "base64").toString("hex");
  const hexData = Buffer.from(data, "base64").toString("hex");
  return smCrypto.sm4.decrypt(hexData, hexKey);
&#125;

decryptAES

javascript
function decryptAES(data, key = AES_KEY, iv = AES_IV) &#123;
  const decipher = crypto.createDecipheriv(
    "aes-256-ctr",
    Buffer.from(key, "base64"),
    Buffer.from(iv, "base64")
  );
  let result = decipher.update(data, "base64", "utf8");
  result += decipher.final("utf8");
  return result;
&#125;

3.4 加密使用场景

场景加密类型说明
登录(用户名+密码)RSAencrypt(username, "RSA")[0] + encrypt(password, "RSA")[0]
权限数据缓存SM4encryptSM4(JSON.stringify(permissions))
代码补全数据上报SM4encrypt(prefixCode, "SM4") + encrypt(completeCode, "SM4")
消息加密AESencryptAES(message, AES_KEY, AES_IV)

3.5 安全性评估

维度评估说明
密钥硬编码严重RSA、SM2、SM4、AES 密钥全部硬编码在 bundle 中
RSA 1024-bit1024-bit RSA 已被认为不安全,现代标准要求 2048-bit+
AES-256-CTR中等算法本身安全,但 IV 硬编码导致相同密钥+IV 加密不同数据
SM2/SM4中等国密算法本身安全,但密钥硬编码
PKCS#5 padding标准SM4 使用 PKCS#5 填充,无安全问题
分块加密注意RSA 64字节分块加密,返回数组而非单值

4. API 路由完整列表

4.1 Starspark API (43 路由)

Chat 相关 (16)

路径方法说明
/api/starspark/v1/agent/chat/async/askPOST异步 AI 对话
/api/starspark/v1/agent/chat/sync/askPOST同步 AI 对话
/api/starspark/v1/agent/chat/inline/chatPOST内联聊天
/api/starspark/v1/agent/chat/reviewPOST代码评审
/api/starspark/v1/agent/chat/optimizeCodePOST代码优化
/api/starspark/v1/agent/chat/splitFunctionPOST函数拆分
/api/starspark/v1/agent/chat/optimizeSqlPOSTSQL 优化
/api/starspark/v1/agent/chat/generateSqlPOSTSQL 生成
/api/starspark/v1/agent/chat/sync/generateSqlPOST同步 SQL 生成
/api/starspark/v1/agent/chat/sync/optimizeSqlPOST同步 SQL 优化
/api/starspark/v1/agent/chat/generateCommitMessagePOST生成 commit message
/api/starspark/v1/agent/chat/interLineCommentCodePOST行注释
/api/starspark/v1/agent/chat/feedbackPOST反馈
/api/starspark/v1/agent/chat/evaluatePOST评估
/api/starspark/v1/agent/chat/convertDmTableDDLPOSTDM 表 DDL 转换
/api/starspark/v1/agent/chat/recommendationsPOST推荐

Code 相关 (4)

路径方法说明
/api/starspark/v1/agent/code/codeCompletePOST代码补全
/api/starspark/v1/agent/code/generateUnitTestPOST单元测试生成
/api/starspark/v1/agent/code/generateUnitTestCaseTemplatePOST单测模板
/api/starspark/v1/agent/code/queryUnitTestQueueInfoPOST单测队列查询

Collect 相关 (6)

路径方法说明
/api/starspark/v1/agent/collect/chatDataContentPOST聊天数据收集
/api/starspark/v1/agent/collect/codeAcceptPOST代码接受收集
/api/starspark/v1/agent/collect/commitCodeDataPOST提交代码数据
/api/starspark/v1/agent/collect/commitUnitTestDataPOST提交单测数据
/api/starspark/v1/agent/collect/generateUnitTestDataPOST生成单测数据
/api/starspark/v1/agent/collect/unitTestStatisticsPOST单测统计
/api/starspark/v1/agent/collect/uploadRequestTimePOST上报请求时间

Permission & Settings (8)

路径方法说明
/api/starspark/v1/agent/permission/queryUserFuncModelListGET查询用户功能模型
/api/starspark/v1/agent/permission/queryUserPermissionPackageInfoGET查询权限包
/api/starspark/v1/agent/authSetting/queryGET查询认证设置
/api/starspark/v1/agent/authSetting/queryPluginLinkGET查询插件链接
/api/starspark/v1/agent/pluginSetting/queryGlobalSettingGET查询全局设置
/api/starspark/v1/agent/pluginSetting/queryTokenSettingGET查询 Token 设置
/api/starspark/v1/agent/prompt/queryGET查询 Prompt
/api/starspark/v1/agent/wordWriter/configGET写作配置

Action & Feedback (3)

路径方法说明
/api/starspark/v1/agent/action/rejectCodePOST拒绝代码
/api/starspark/v1/agent/action/saveUserActionPOST保存用户操作
/api/starspark/v1/agent/feedback/queryCategoryGET查询反馈分类

User & Auth (5)

路径方法说明
/api/starspark/v1/chat/user/logOutPOST登出
/api/starspark/v1/chat/user/validGET验证用户
/api/starspark/v1/user/authorizationQueryGET授权查询
/api/starspark/v1/user/packageQueryGET套餐查询
/api/starspark/v1/platform/code/assistPOST代码辅助

Login (1)

路径方法说明
/api/usercenter/v1/user/common/loginPOST统一登录

4.2 RAG Server API (14 路由)

Code Search (4)

路径方法说明
/api/ragserver/v1/code/searchPOST代码搜索
/api/ragserver/v1/code/getLanguagesGET获取语言列表
/api/ragserver/v1/code/getUserReposGET获取用户仓库
/api/ragserver/v1/code/onlineSearchPOST在线搜索

RAG (2)

路径方法说明
/api/ragserver/v1/rag/incbatchloadPOST批量加载
/api/ragserver/v1/web/parseurlPOSTURL 解析

RestAPI RAG (8)

路径方法说明
/restapi/ragserver/v1/code/searchInRepoPOST仓库内代码搜索
/restapi/ragserver/v1/codeknowledge/reVectorizedPOST重新向量化
/restapi/ragserver/v1/doc/knowledgeListGET文档知识列表
/restapi/ragserver/v1/doc/searchPOST文档搜索
/restapi/ragserver/v1/rag/codeK/codeKnowledgeListGET代码知识列表
/restapi/ragserver/v1/rag/codeK/personal/authPOST个人知识库认证
/restapi/ragserver/v1/rag/codeK/personal/init/statusGET初始化状态
/restapi/ragserver/v1/rag/codeK/updateGitTokenPOST更新 Git Token

RAG Enable (2)

路径方法说明
/restapi/ragserver/v1/rag/repoKeyDialogEnableGET仓库密钥对话框开关
/restapi/ragserver/v1/rag/repoKeyEnableGET仓库密钥开关
/restapi/ragserver/v1/rag/repoLangExtEnableGET语言扩展开关

4.3 Unit Test API (6 路由)

路径方法说明
/restapi/unit/v1/createUnitTaskPOST创建单测任务
/restapi/unit/v1/cancelUnitTaskPOST取消单测任务
/restapi/unit/v1/queryUnitTaskGET查询单测任务
/restapi/unit/v1/deleteUnitTaskDELETE删除单测任务
/restapi/unit/v1/exportByTaskIdGET导出单测结果
/restapi/unit/v1/isPendingTaskGET查询待处理任务

4.4 其他路由

路径方法说明
/ws/onMessageWebSocketWebSocket 消息
/sso/loginPOSTSSO 登录
/commitCollectPOST提交收集
/indexGET首页

4.5 API 总计

服务路由数
Starspark43
RAG Server14
Unit Test6
其他4
总计67

注意: 之前文档(doc 31)记录了 92 条 API 路由,实际从 bundle 中提取了 67 条。其余路由可能在 webpack bundle 的动态路由注册中,或通过 WebSocket 命令间接调用。

5. 数据库架构

5.1 数据库引用统计

数据库引用次数说明
Knex184SQL 查询构建器(主数据库接口)
MySQL/MySQL2112远程 MySQL 数据库
SQLite368本地 SQLite 数据库
DMDB87达梦数据库(国产)
PostgreSQL62PostgreSQL 数据库
NeDB16本地嵌入式数据库

5.2 数据库连接配置

从源码提取的数据库配置模式:

javascript
// MySQL/MySQL2 连接
&#123;
  host: conn_prop_host,
  port: conn_prop_port || 1433,
  user: connectionSettings.user,
  password: d.password,
  database: d.database
&#125;

// DMDB (达梦) 连接
&#123;
  connectString: `$&#123;host&#125;:$&#123;port&#125;`,
  loginEncrypt: false,
  user: username,
  password: password
&#125;

5.3 数据库用途

数据库用途
SQLite3本地缓存、知识库索引
NeDB本地嵌入式存储
MySQL远程持久化
PostgreSQL远程持久化(备选)
DMDB达梦数据库(国产替代)

6. Tree-sitter 解析器

6.1 WASM 文件

文件说明
tree-sitter.wasmTree-sitter 核心
tree-sitter-c.wasmC 语言
tree-sitter-c_sharp.wasmC# 语言
tree-sitter-cpp.wasmC++ 语言
tree-sitter-go.wasmGo 语言
tree-sitter-java.wasmJava 语言
tree-sitter-javascript.wasmJavaScript
tree-sitter-python.wasmPython
tree-sitter-tsx.wasmTSX
tree-sitter-typescript.wasmTypeScript

6.2 Tree-sitter 引用统计

关键词引用次数
wasm534
TreeSitter24
tree-sitter7
tree_sitter7
treeSitter6

7. WebSocket 通信

7.1 WebSocket Server

  • WebSocketServer: 4 处引用
  • wss.: 1 处引用
  • 路径: /ws/onMessage

7.2 Express Server

  • app.listen: 1 处(监听端口)
  • 默认端口: 6832

8. 外部依赖

8.1 运行时依赖 (package.json)

依赖版本用途
@opentelemetry/exporter-trace-otlp-http0.49.1APM 链路追踪
@opentelemetry/instrumentation0.49.1APM 自动埋点
@opentelemetry/sdk-trace-base1.24.1APM SDK
@seald-io/nedb^4.0.4本地嵌入式数据库
adm-zip^0.5.12ZIP 文件处理
cheerio1.0.0-rc.12HTML 解析
dmdb^1.0.24984达梦数据库驱动
eventsource-parser^1.1.2SSE 解析
fast-glob^3.3.2文件搜索
fast-xml-parser^4.3.5XML 解析
featureprobe-server-sdk-node^2.2.0功能开关
fs-extra^10.1.0文件操作增强
iconv-lite^0.6.3编码转换
jschardet^3.1.4编码检测
knex2.5.1SQL 查询构建器
lodash^4.16.6通用工具
log4js^6.9.1日志
lru-cache7.18.3LRU 缓存
marked1.2.9Markdown 渲染
mysql23.2.0MySQL 驱动
node-abort-controller^3.1.1AbortController
node-fetch^2.7.0HTTP 客户端
pg^8.11.3PostgreSQL 驱动
portfinder^1.0.32端口查找
sm-crypto^0.3.13国密 SM2/SM4 加密
sqlite3^5.1.7SQLite 驱动
toml^3.0.0TOML 解析
uuid^9.0.1UUID 生成
web-tree-sitter0.22.2Tree-sitter WASM
word-extractor^1.0.4Word 文档解析
ws^8.18.0WebSocket

8.2 Node.js 内置模块引用

模块用途
crypto加密/解密
child_process子进程管理
fs文件系统
http/httpsHTTP 服务
net网络操作
path路径处理
stream流处理
worker_threadsWorker 线程
cluster集群
dnsDNS 解析
os操作系统信息
urlURL 解析

9. 中文错误消息

9.1 错误类 (top 20)

消息频次说明
用户未登录3未登录错误
提交的信息或参数无效3参数错误
网络异常,请检查网络3网络错误
未授权,请重新登录2授权过期
数据源不存在2数据源错误
连接已断开2WebSocket 断开
连接池连接有效性检查失败:没有结果集.2数据库连接错误
警告:批量执行部分行产生错误2批量执行错误
升级文件下载失败2更新失败
文件读取失败1文件错误
任务处理超时1超时错误
请选择代码片段1用户操作提示
指令操作已经结束1操作完成
数据迁移出错3数据迁移错误
解析文本2文本解析

9.2 图表类型

消息频次说明
流程图2Flowchart
序列图2Sequence diagram
甘特图2Gantt chart
类图2Class diagram
状态图2State diagram
实体关系图2ER diagram
用户旅程图2User journey
派生图2Pie chart
时序图1Timeline

9.3 总计

  • 1098 个独特中文字符串(包含日文汉字排序表等非业务字符串)
  • 业务相关中文字符串约 200+ 个

10. HTTPS URL 端点

URL说明
https://pro.api.example.com生产 API
https://saas.api.example.com星火 SaaS API
https://saas.api.example.com/v1/tracesAPM 链路追踪

11. 开发环境泄露

从 package.json 的 scripts 中发现多个内部开发服务器地址:

地址说明
http://10.0.0.1开发服务器
http://10.0.0.2开发服务器79
http://10.0.0.3开发服务器232
http://10.0.0.4:8080开发服务器181
http://10.0.0.5:4318APM 服务器

12. 关键发现

  1. 5 种加密算法: RSA、SM2(国密)、SM4(国密)、AES-256-CTR、MD5,全部密钥硬编码。

  2. RSA 1024-bit: 使用 1024-bit RSA 公钥,已被认为不安全。64 字节分块加密,返回 base64 数组。

  3. 国密 SM2/SM4: 使用 sm-crypto 库实现国密加密,SM2 使用 C1C3C2 模式,SM4 使用 PKCS#5 填充。

  4. AES-256-CTR: 密钥和 IV 硬编码,CTR 模式不提供认证加密,存在安全风险。

  5. 67 条 API 路由: Starspark 43 条 + RAG Server 14 条 + Unit Test 6 条 + 其他 4 条。

  6. 5 种数据库支持: SQLite3(本地)、NeDB(本地)、MySQL2(远程)、PostgreSQL(远程)、DMDB(达梦,国产)。

  7. 9 种 Tree-sitter 解析器: C、C#、C++、Go、Java、JavaScript、Python、TSX、TypeType。

  8. 1098 个中文字符串: 包含错误消息、图表类型、AI 提示词等。

  9. featureprobe 功能开关: 使用 FeatureProbe SDK 实现灰度发布。

  10. 开发环境泄露: package.json 中包含 4 个内部开发服务器 IP 地址和 APM 服务器地址。

  11. Node <=12 版本要求: Agent 要求 Node.js <=12,说明可能使用了较老的 Node.js API。

  12. worker.js: 976 KB 的 worker 文件,可能用于 Tree-sitter 解析的 Worker 线程。

  13. DMDB (达梦数据库): 支持国产达梦数据库,说明产品面向国内政企市场。

  14. word-extractor: 支持 Word 文档解析,可能用于需求文档导入。

  15. 登录加密: 用户名和密码使用 RSA 加密后传输,但 RSA 1024-bit 安全性不足。

本项目仅供学习研究,逆向分析内容归原厂商所有。