feat: add AiLPHA security platform service - #160
Conversation
|
Review 阻塞:这个 service package PR 有测试文件,但我没有在 PR 描述、评论或改动文件中找到真实的测试截图证据(图片链接或提交的图片文件)。请补充能证明该 service package 跑通的截图,例如 |
9de87b1 to
9346dc0
Compare
|
PR Title: feat: add AiLPHA security platform service Commit: 本次 PR 新增多个 OctoBus 服务包(TopSec WAF、AiLPHA Platform、Alibaba Cloud SWAS Firewall、CloudAtlas、DefectDojo、Elastic Kibana、QiAnXin Hunter、Slack GroupRobot、ThreatBook NGTIP),并在
建议优先修复 TopSec WAF 的并发安全与全局 TLS 污染问题,以及统一各服务包 fetch 的超时实现方式(使用 |
…tform-service # Conflicts: # services/bin/octobus-tentacles.js # services/package.json
…a undici dispatcher
|
MonkeyScan 正在评审本次 push 新增到 PR 的变更,完成后会更新到本评论中,请稍后刷新查看。 |
|
PR Title: feat: add AiLPHA security platform service Commit: 本次 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 等)基本正确。 |
| const tlsOptions = () => (skipTlsVerify ? { dispatcher: getInsecureTlsDispatcher() } : {}); | ||
|
|
||
| const buildQuery = (pairs) => { | ||
| const parts = []; |
There was a problem hiding this comment.
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). |
There was a problem hiding this comment.
上游非 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'); |
There was a problem hiding this comment.
超时测试用例模拟了与真实运行时结构不符的异常
测试用例在模拟 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。
接入设备
AiLPHA 安全分析与管理平台(SIEM/SOC,安全运营协同)。服务包
services/ailpha__platform,proto 包AiLPHA_Platform。设备版本
AiLPHA V5.1,
/openapi/v1.0+/openapi/v2.0路由(依据产品《API 接口文档》)。认证方式
API Key(登录令牌),以
apiKeyHTTP 头发送(secret.apiKey)。Key 通过用户管理 → 用户编辑 → 新增API Key创建。实现方法
方式:RPC(gRPC,6 个方法)
ListMergeAlarmsGET /openapi/v2.0/merge-alarmsGetMergeAlarmDetailGET /openapi/v1.0/merge-alarm/detailUpdateMergeAlarmStatusPOST /openapi/v2.0/merge-alarms/statusListLinkageStrategiesGET /openapi/v1.0/linkage-strategiesBlockIpPOST /openapi/v1.0/linkage-strategies/{ids}/accessIpUnblockIpDELETE /openapi/v1.0/linkage-strategies/{ids}/blockIpgoogle.protobuf.Struct原样透传;$page/$size映射为 page/size。INVALID_ARGUMENT,401→UNAUTHENTICATED,403→PERMISSION_DENIED,404→NOT_FOUND(UnblockIp 除外,幂等),4xx→FAILED_PRECONDITION,5xx/网络→UNAVAILABLE,非 JSON→UNKNOWN。x-request-id/x-engine-instance)。测试命令
已知限制
connect_type=ALL等价于省略该查询参数。真实设备验证
(截图:AiLPHA 控制台告警列表 / 联动策略状态变化)