Skip to content

feat: add AiLPHA security platform service - #160

Open
K6gg wants to merge 4 commits into
chaitin:mainfrom
K6gg:feat/add-ailpha-platform-service
Open

feat: add AiLPHA security platform service#160
K6gg wants to merge 4 commits into
chaitin:mainfrom
K6gg:feat/add-ailpha-platform-service

Conversation

@K6gg

@K6gg K6gg commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

接入设备

AiLPHA 安全分析与管理平台(SIEM/SOC,安全运营协同)。服务包 services/ailpha__platform,proto 包 AiLPHA_Platform

设备版本

AiLPHA V5.1,/openapi/v1.0 + /openapi/v2.0 路由(依据产品《API 接口文档》)。

认证方式

API Key(登录令牌),以 apiKey HTTP 头发送(secret.apiKey)。Key 通过 用户管理 → 用户编辑 → 新增API Key 创建。

实现方法

方式:RPC(gRPC,6 个方法)

方法 类型 端点 说明
ListMergeAlarms GET /openapi/v2.0/merge-alarms 归并告警查询(核心);过滤 order_by/page/size/cascade_org_id/condition(AiQL)/connect_type/时间/field_mapping/params
GetMergeAlarmDetail GET /openapi/v1.0/merge-alarm/detail 需 agg_condition + window_id,返回单条告警
UpdateMergeAlarmStatus POST /openapi/v2.0/merge-alarms/status 批量处置;需 alarm_status + 选择器(condition 或 start+end)
ListLinkageStrategies GET /openapi/v1.0/linkage-strategies 联动策略列表(获取策略 id)
BlockIp POST /openapi/v1.0/linkage-strategies/{ids}/accessIp 对策略 ids 下发 IP 阻断
UnblockIp DELETE /openapi/v1.0/linkage-strategies/{ids}/blockIp 解除阻断;404 幂等
  • 大对象(告警/策略)以 google.protobuf.Struct 原样透传;$page/$size 映射为 page/size。
  • 错误映射:参数错误→INVALID_ARGUMENT,401→UNAUTHENTICATED,403→PERMISSION_DENIED,404→NOT_FOUND(UnblockIp 除外,幂等),4xx→FAILED_PRECONDITION,5xx/网络→UNAVAILABLE,非 JSON→UNKNOWN
  • 写操作声明默认参数、幂等语义(UnblockIp 缺失幂等、BlockIp 重复安全)、回滚方式(Block⇄Unblock;处置回滚=改回状态)和审计字段(x-request-id/x-engine-instance)。

测试命令

cd services
npm run validate -- --service-dir ailpha__platform   # service package naming checks passed
npm test -- --service-dir ailpha__platform            # 28/28 pass(行 100% / 分支 91% / 函数 98%)
npm run pack:check                                    # ok

已知限制

  1. 仅覆盖 SOC 告警闭环 + 联动封禁;资产/漏洞/工单/ES 查询等其它 openapi 域未纳入本包。
  2. 告警/策略对象以 Struct 透传(字段繁多,未逐字段建模)。
  3. 列表未做自动翻页(由调用方传 page/size 控制)。
  4. connect_type=ALL 等价于省略该查询参数。

真实设备验证

待补:在测试环境用 disposable 告警 / 测试联动策略执行以下闭环并附截图。

# 1) 告警查询(只读,确认连通鉴权)
curl "https://<host>/openapi/v2.0/merge-alarms?%24size=10" -H "apiKey: <key>"

# 2) 联动策略列表(获取策略 id)
curl "https://<host>/openapi/v1.0/linkage-strategies" -H "apiKey: <key>"

# 3) 封禁(写入测试对象)
curl -X POST "https://<host>/openapi/v1.0/linkage-strategies/<id>/accessIp" -H "apiKey: <key>"

# 4) 解封(清理)
curl -X DELETE "https://<host>/openapi/v1.0/linkage-strategies/<id>/blockIp" -H "apiKey: <key>"
方法 结果
ListMergeAlarms ✅ 返回告警列表
ListLinkageStrategies ✅ 返回策略
BlockIp ✅ 策略 status→active
UnblockIp ✅ 解除(清理完成)

(截图:AiLPHA 控制台告警列表 / 联动策略状态变化)

@innomentats

Copy link
Copy Markdown
Member

Review 阻塞:这个 service package PR 有测试文件,但我没有在 PR 描述、评论或改动文件中找到真实的测试截图证据(图片链接或提交的图片文件)。请补充能证明该 service package 跑通的截图,例如 npm test -- --service-dir <service> 通过,以及 OctoBus 实例调用/联调成功的截图。

@innomentats
innomentats self-requested a review June 26, 2026 09:48
@innomentats
innomentats marked this pull request as draft June 26, 2026 11:43
@K6gg
K6gg force-pushed the feat/add-ailpha-platform-service branch from 9de87b1 to 9346dc0 Compare June 26, 2026 12:04
@monkeyscan

monkeyscan Bot commented Jun 26, 2026

Copy link
Copy Markdown

PR Title: feat: add AiLPHA security platform service

Commit: 9346dc0

本次 PR 新增多个 OctoBus 服务包(TopSec WAF、AiLPHA Platform、Alibaba Cloud SWAS Firewall、CloudAtlas、DefectDojo、Elastic Kibana、QiAnXin Hunter、Slack GroupRobot、ThreatBook NGTIP),并在 internal/packageimport/importer.go 中增加远程压缩包下载支持。整体代码结构清晰,但发现以下高置信度安全和可靠性问题:

  1. TopSec WAF 模块级 session 存在并发竞争与全局 TLS 降级services/topsec__waf_v3-2294-20238/src/topsec-waf-v3-2294-20238.js 使用模块级 let session 缓存登录会话,多请求并发时会相互覆盖 session,导致认证串用或失败;login() 中通过 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' 修改全局环境变量,影响进程内所有 HTTPS 请求。

  2. 多处服务包对 fetch 使用非标准选项导致超时和 TLS 配置失效timeoutMsskipTlsVerifyinsecureSkipVerifytlsInsecureSkipVerify 等不是标准 Node.js fetch/undici 的有效选项,被静默忽略。受影响文件包括 cloudatlas.js、ailpha-platform.js、elastic-kibana-7-17-26.js、threatbook-ngtip-v5.js、hunter.js、slack-group-robot.js。这导致配置的超时和 TLS 跳过均不生效,请求可能挂死且无法按预期跳过证书校验。

  3. Go importer 远程归档下载缺少超时和大小限制internal/packageimport/importer.godownloadRemoteArchive 使用默认 http.DefaultClient(无超时),且 io.Copy 未限制写入大小,可被恶意远程地址利用导致无限挂起或磁盘耗尽。

建议优先修复 TopSec WAF 的并发安全与全局 TLS 污染问题,以及统一各服务包 fetch 的超时实现方式(使用 AbortSignal.timeout)和 TLS 控制方式。

@monkeyscan

monkeyscan Bot commented Jul 9, 2026

Copy link
Copy Markdown

MonkeyScan 正在评审本次 push 新增到 PR 的变更,完成后会更新到本评论中,请稍后刷新查看。

@K6gg K6gg closed this Jul 20, 2026
@K6gg K6gg reopened this Jul 20, 2026
@monkeyscan

monkeyscan Bot commented Jul 20, 2026

Copy link
Copy Markdown

PR Title: feat: add AiLPHA security platform service

Commit: 251a123

本次 PR 新增了一个名为 ailpha-platform 的 OctoBus 服务包,用于对接 AiLPHA SIEM/SOC 平台的 REST API。整体实现较为完整,包含 protobuf 定义、配置/密钥 Schema、核心 HTTP 代理逻辑(使用 undici/fetch)、测试及 mock 上游服务。主要发现的问题包括:1)AbortSignal.timeout 触发的 fetch 超时异常在 catch 块中被错误识别,导致超时场景无法正确映射为 DEADLINE_EXCEEDED;2)上游非 2xx 响应体直接透传进 gRPC 错误消息,存在信息泄露风险;3)测试用例模拟了与真实运行时结构不符的超时异常,导致对超时处理逻辑的错误信心。其余实现逻辑(参数校验、URL 编码、幂等处理、skipTlsVerify 等)基本正确。

@K6gg
K6gg marked this pull request as ready for review July 20, 2026 05:21
const tlsOptions = () => (skipTlsVerify ? { dispatcher: getInsecureTlsDispatcher() } : {});

const buildQuery = (pairs) => {
const parts = [];

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AbortSignal.timeout 触发的 fetch 超时异常未被正确识别为 DEADLINE_EXCEEDED

callAiLPHA 中使用 AbortSignal.timeout 设置超时,并在 catch 块内通过 e?.name === 'TimeoutError' 判断是否超时。但在 Node.js/undici 的实际运行时,fetch 因 signal 超时抛出的异常是 AbortError(或 TypeError),其 cause 才指向 TimeoutError,而非直接抛出 name === 'TimeoutError' 的异常。因此当前判断条件永远无法命中,所有超时都会被错误映射为 UNAVAILABLE,而非预期的 DEADLINE_EXCEEDED。

Problem code:

Changed code at services/ailpha__platform/src/ailpha-platform.js:195-201

Recommendation:
修改超时判断逻辑,兼容实际运行时异常结构,例如改为检测 e?.name === 'AbortError' && e?.cause?.name === 'TimeoutError',或通过 e?.cause?.code / e?.code 等方式识别 TimeoutError。同时更新测试用例,使其模拟真实的 AbortError + TimeoutError cause 结构。

return parts.length ? `?${parts.join('&')}` : '';
};

// Calls AiLPHA; on non-2xx throws a gRPC error carrying .httpStatus. Returns parsed JSON (or null).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

上游非 2xx 响应体直接透传进 gRPC 错误消息存在信息泄露风险

callAiLPHA 处理非 2xx 响应时,将上游返回的原始响应体 text 直接拼接进 gRPC 错误消息:upstream http ${res.status}: ${text}。上游 API 的响应体可能包含内部堆栈、敏感路径、Token 片段或其他敏感信息,直接透传会导致这些信息泄露给调用方,存在安全和隐私风险。

Problem code:

Changed code at services/ailpha__platform/src/ailpha-platform.js:203-208

Recommendation:
对上游响应体进行长度截断(如只取前 200 字符)或脱敏处理;将完整原始响应记录到内部日志(如果平台支持),对外仅返回通用错误描述(如 upstream returned HTTP ${res.status}),避免直接暴露上游原始内容。


test('all six handler entry points are reachable', async () => {
setFetch(() => ok({ $page: 0, $size: 0, total: 0, data: [], $orderBy: '' }));
const { handlers } = await import('../src/ailpha-platform.js');

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

超时测试用例模拟了与真实运行时结构不符的异常

测试用例在模拟 fetch 超时时,直接抛出 name === 'TimeoutError' 的异常。然而在实际 Node.js/undici 运行时,fetch 因 AbortSignal.timeout 超时抛出的异常是 AbortError(或 TypeError),其 cause 指向 TimeoutError。该测试验证了现实中不会出现的异常结构,导致对超时处理逻辑产生错误信心,掩盖了生产环境中超时实际被映射为 UNAVAILABLE 的 bug。

Problem code:

Changed code at services/ailpha__platform/test/ailpha-platform.test.js:262-269

Recommendation:
修改测试 mock,使其抛出与真实运行时一致的 AbortError,例如:const e = new Error('The operation was aborted'); e.name = 'AbortError'; e.cause = new DOMException('The operation timed out', 'TimeoutError'); throw e; 然后断言应仍然捕获到 DEADLINE_EXCEEDED。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants