Skip to content

feat(shodan-internetdb): add Shodan InternetDB IP intelligence service package#348

Open
dingzhejianjian wants to merge 3 commits into
chaitin:mainfrom
dingzhejianjian:feat/shodan-internetdb
Open

feat(shodan-internetdb): add Shodan InternetDB IP intelligence service package#348
dingzhejianjian wants to merge 3 commits into
chaitin:mainfrom
dingzhejianjian:feat/shodan-internetdb

Conversation

@dingzhejianjian

@dingzhejianjian dingzhejianjian commented Jun 27, 2026

Copy link
Copy Markdown

接入设备

Shodan InternetDB — 免费、无需注册、无需 API Key 的 IP 情报查询服务,由 Shodan(知名网络设备搜索引擎公司)提供。

认证方式

无需认证,secret.schema.json 为空。

实现方法

RPC 方法 后端 API 类型 说明
LookupIP GET /{ip} 查询 IP 地址的端口、主机名、CVE 漏洞、标签

联调证据

MCP 工具列表

POST http://10.2.37.168:9000/capsets/threat-intel/mcp
{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}

返回工具:shodan-internetdb__shodan-test__lookup_i_p

Connect RPC 验证

curl -s -X POST 'http://127.0.0.1:9000/capsets/threat-intel/connect/shodan-test/Shodan_InternetDB.Shodan_InternetDB/LookupIP' \
  -H 'Content-Type: application/json' \
  -d '{"ip":"8.8.8.8"}'
{"message":"ok","ip":"8.8.8.8","hostnames":["dns.google"],"ports":[53,443]}
POST .../LookupIP
{"ip":"1.1.1.1"}
{"message":"ok","ip":"1.1.1.1","hostnames":["one.one.one.one"],"ports":[53,80,443,2083,8880],"cpes":["cpe:/a:cloudflare:cloudflare"]}

测试结果

ℹ tests 6
ℹ pass  6
ℹ fail  0

Closes #347

@monkeyscan

monkeyscan Bot commented Jun 27, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: 79a9400

这个 PR 新增了一个 Shodan InternetDB 的 OctoBus 服务包,提供了基于 Shodan InternetDB API 的 IP 情报查询功能(端口、主机名、CVE 等)。主要变更包括服务实现、Proto 定义、测试、配置以及根级服务的注册。

整体代码结构清晰,使用了 AbortController 处理超时,错误映射也较为合理。但在测试代码中发现了一个会导致测试无法运行的 API 误用问题,另外存在上游错误响应体泄露到 gRPC 错误消息中的风险,以及缺少对输入 IP 格式的验证。

@dingzhejianjian

Copy link
Copy Markdown
Author
348-1

Comment thread services/shodan__internetdb/src/shodan-internetdb.js
Comment thread services/shodan__internetdb/src/shodan-internetdb.js
Comment thread services/shodan__internetdb/test/shodan-internetdb.test.js
@monkeyscan

monkeyscan Bot commented Jun 27, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: 7763ec6

本次修改在 services/shodan__internetdb/src/shodan-internetdb.js 中完成了两件事:1) 引入 node:netnet.isIP() 对输入 IP 进行格式校验,弥补了此前仅做非空检查的不足,可直接拒绝非法 IP 请求;2) 在 mapHttpError 中移除了将上游 HTTP 错误响应体完整拼接到 gRPC 错误消息中的行为,修复了信息泄露风险。整体方向正确,但 mapHttpError 中计算了 snippet 却未在错误消息中引用,形成了死代码,且与提交信息所述“truncate error body”的意图不符,需要修正。

Comment thread services/shodan__internetdb/src/shodan-internetdb.js Outdated
@monkeyscan

monkeyscan Bot commented Jun 27, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: 3aed232

本次 PR 仅移除了 mapHttpError 函数中未使用的 snippet 变量。该变量在先前的提交中被引入,但从未在错误消息中引用,属于纯粹的死代码。删除后函数行为完全一致,错误码与错误消息均未改变,不存在回归风险。整体评估:安全的清理性改动,可直接合入。

@monkeyscan

monkeyscan Bot commented Jun 27, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: 3400e69

No changed files to review.

@monkeyscan

monkeyscan Bot commented Jun 27, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: 3c48fbe

本次 PR 对 fetchJson 函数进行了重构:

  1. res.text()mapHttpErrorparseJson 的调用移入 try 块内部,使得 fetch 成功后的响应读取和解析阶段的异常也能被统一的 catch 块处理。
  2. catch 块中新增 if (err instanceof GrpcError) throw err;,确保 mapHttpErrorparseJson 抛出的 GrpcError 不会被错误地重新包装为 UNAVAILABLE

整体评估:这是一个正确的错误处理改进。将 res.text() 移入 try 块有助于统一异常处理路径;GrpcError 的直接透传也避免了语义错误码被覆盖。经审查,该改动没有引入新的正确性、安全性或可靠性问题。

@monkeyscan

monkeyscan Bot commented Jun 27, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: 4c39313

本次修改仅涉及 services/shodan__internetdb/src/shodan-internetdb.js 中的 unwrapString 辅助函数。为其增加了递归深度限制(depth limit),防止在处理带有 .value 属性的深层嵌套对象或循环引用时发生栈溢出。

关键设计决策:为 unwrapString 增加内部 depth 参数(默认 0),当递归深度超过 10 时提前返回空字符串。该函数仅用于提取请求中的 IP 字符串,深度限制对正常业务数据无影响,属于防御性修复。

总体评估:修复合理且必要,降低了因异常输入导致服务崩溃或堆栈溢出的风险。代码逻辑简洁,未发现引入新的行为回归或安全缺陷。

@monkeyscan

monkeyscan Bot commented Jun 29, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: 029ae91

本次 PR 在 mapHttpError 中新增了对 HTTP 429(Too Many Requests)的显式处理,将其映射为 UNAVAILABLE,从而与普通的 4xx 客户端错误(映射为 FAILED_PRECONDITION)区分开来。代码改动简洁、语义正确:429 属于上游限流/临时不可用场景,映射为 UNAVAILABLE 有助于调用方识别并执行重试等容错策略。变更仅涉及 1 行新增代码,无引入明显正确性、安全性或可靠性风险。

@dingzhejianjian
dingzhejianjian marked this pull request as draft June 29, 2026 02:31
@monkeyscan

monkeyscan Bot commented Jun 29, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: 92bd49b

本次 PR 在 services/bin/octobus-tentacles.js 的 services 注册表中新增了 8 个服务条目:alibaba-cloud-simple-application-server-firewall、defectdojo、elastic-kibana-7-17-26、imperva-waf-gateway-v13-6-90、sangfor-xdr-v2-0-45、slack-group-robot、threatbook-claudsandbox-v3、topsec-waf-v3-2294-20238。变更仅涉及静态配置对象的扩展,未修改运行时逻辑。新增条目的路径和键名与现有模式保持一致。但发现其中一个新增条目可能存在拼写错误:threatbook-claudsandbox-v3 中的 "claudsandbox" 极有可能是 "cloudsandbox" 的笔误,若实际目录名为 cloudsandbox,则会导致模块加载失败。

@monkeyscan

monkeyscan Bot commented Jun 29, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: e977dd1

本次 PR 修改了 services/package.json,主要做了两件事:

  1. bin 字段中新增了 8 个 CLI 入口(如 alibaba-cloud-simple-application-server-firewall、defectdojo、elastic-kibana-7-17-26 等)。
  2. files 字段中新增了对应的 bin/*.js 文件路径,以及对应的 __ 风格模块名,确保打包时包含这些文件。
  3. 同时新增了 @alicloud/swas-open20200601undici 两个依赖,并同步加入了 bundledDependencies

经核对,新增的所有 bin 条目均能在 files 数组中找到对应的 bin/*.js 路径,无遗漏;新增的依赖也已正确加入 bundledDependencies。整体改动为机械性、增量式的配置补充,未发现正确性、兼容性或安全性的问题。

Comment thread services/bin/octobus-tentacles.js
@dingzhejianjian
dingzhejianjian marked this pull request as ready for review June 29, 2026 14:11

@dingzhejianjian dingzhejianjian left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

✅ 已完成手动验证。LookupIP 返回 8.8.8.8 的端口和主机名数据,IP 校验正常。

@innomentats

Copy link
Copy Markdown
Member

Reviewer note: this PR currently has merge conflicts with the target branch, so it cannot be merged or reviewed safely in its current state.

Please rebase or merge the latest base branch, resolve the conflicts, and make sure GitHub Actions pass again. I am marking/keeping this PR as draft until the conflicts are resolved.

@innomentats
innomentats marked this pull request as draft June 30, 2026 15:37
@monkeyscan

monkeyscan Bot commented Jun 30, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: 15d380b

本次变更仅在 services/bin/octobus-tentacles.js 的服务注册表中新增了 15 个服务条目(cloudatlas、dbaudit、first-epss-v1、hermes-gateway、huorong-endpoint-security-management-system-v2-0-19-3、owasp-dependency-track-sca-v5-0、qianxin-hunter、tencent-tix-saas、telegram-bot-api、threatbook-ngtip-v5、volcengine-cloud-firewall、tencent-bh、alibaba-sas、misp、opencti)。所有新增条目均遵循既有模式:../<namespace>__<name>/bin/<name>.js../<namespace>__<name>/src/service.js 的路径结构,键名无重复,语法正确。未发现本次引入的正确性缺陷、安全风险或兼容性问题。历史遗留的 threatbook-claudsandbox-v3 拼写疑似错误在本次 diff 中未被触及。

@monkeyscan

monkeyscan Bot commented Jun 30, 2026

Copy link
Copy Markdown

MonkeyScan 已经开始评审,完成后会更新到本评论中,请稍后刷新查看。

@monkeyscan

monkeyscan Bot commented Jun 30, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: 54cc1b9

本次 PR 仅在 services/package.json 中批量新增了 15 个服务的 bin、files(脚本路径)及 files(模块标识符)条目。变更整体结构清晰,JSON 语法正确,新增条目与现有条目风格一致。但在审阅中发现一处命名不一致:qianxin-hunter 的 bin 键与文件名均不包含版本号,而其模块标识符却写为 qianxin__hunter_v23-1,这与同文件中其他带版本号条目的命名惯例不符,存在数据完整性风险。

Comment thread services/package.json
@dingzhejianjian

Copy link
Copy Markdown
Author

手动验证结果 ✅

步骤 结果 说明
LookupIP (8.8.8.8) 返回 ports [53, 443]、hostnames ["dns.google"]

结论:1/1 通过,可进入 review。

@dingzhejianjian

Copy link
Copy Markdown
Author

手动验证结果(完整)

LookupIP (8.8.8.8)

命令:

curl -s -X POST 'http://10.2.37.168:9000/capsets/threat-intel/connect/shodan-test/Shodan_InternetDB.Shodan_InternetDB/LookupIP' -H 'Content-Type: application/json' -d '{"ip":"8.8.8.8"}' | python3 -m json.tool

返回:

{
    "message": "ok",
    "ip": "8.8.8.8",
    "hostnames": ["dns.google"],
    "ports": [53, 443]
}

结论:1/1 通过,可进入 review。

@dingzhejianjian
dingzhejianjian marked this pull request as ready for review July 1, 2026 02:44
@dingzhejianjian
dingzhejianjian force-pushed the feat/shodan-internetdb branch from 54cc1b9 to 5ac548f Compare July 1, 2026 02:53
@monkeyscan

monkeyscan Bot commented Jul 1, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: 5ac548f

Reviewed the service SDK upgrades and new service packages. Identified four actionable issues: a critical AES-CBC IV reuse vulnerability in topsec-waf-v3, a timeout bypass in telegram-bot-api when proxy is not used, silently ineffective TLS skip options in filigran__opencti, and an undefined response access on error in dbaudit-openapi.js. All findings have been submitted with suggested fixes.

@monkeyscan

monkeyscan Bot commented Jul 6, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: 5437a4c

本次修改针对 Shodan InternetDB 服务做了两项改进:

  1. mapHttpError 中新增了 401/403 → PERMISSION_DENIED 的映射,并将原先未使用的 snippet 变量移除;
  2. fetchJson 中的 res.text()mapHttpErrorparseJson 调用全部移入 try 块内,并在 catch 中增加了 GrpcError 实例判断,避免 HTTP 错误码映射产生的 GrpcError 被二次包装为 UNAVAILABLE

测试同步补充了 401/403 的用例,覆盖了新增行为。整体逻辑正确,修复了此前 fetchJson 结构导致 mapHttpError 抛出的错误被错误捕获并转码为 UNAVAILABLE 的缺陷。未发现引入新的正确性、安全性或可靠性风险。

@dingzhejianjian
dingzhejianjian force-pushed the feat/shodan-internetdb branch from 5437a4c to f7f267e Compare July 7, 2026 02:24
@monkeyscan

monkeyscan Bot commented Jul 7, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: f7f267e

本次PR修复了Shodan InternetDB服务中的HTTP错误码映射和fetchJson异常处理问题:

  1. 新增错误码映射:将上游返回的401/403映射为PERMISSION_DENIED,429映射为UNAVAILABLE,使gRPC状态码与HTTP语义更匹配。

  2. 重构fetchJson异常处理:将res.text()mapHttpError()从try-catch块外移入块内,修复了非OK响应时AbortController定时器无法被finally清理的问题。同时通过err instanceof GrpcError判断,确保业务抛出的GrpcError不会被错误地包装为UNAVAILABLE。

  3. 补充测试覆盖:新增了401、403、429三个状态码的测试用例。

整体评估:变更逻辑正确,测试充分,没有发现可行动的问题。

@monkeyscan

monkeyscan Bot commented Jul 14, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: da104a8

本次 PR 修改了 services/package.json,主要是解决此前合并 shodan-internetdb 时产生的冲突,并同时新增多个服务入口。

具体变更包括:

  1. 合并冲突修复:旧版本中 bin 字段顶部的 "shodan-internetdb" 缺少前导缩进,疑似冲突残留;PR 将其替换为格式正确的 aliyun-waf3,并在 binfiles 数组的尾部重新以规范格式加入 shodan-internetdb
  2. 新增服务:在 binfiles 中同时新增了 aliyun-waf3dsensorfofa-network-space-mapperm01-intelligencensfocus-ngfw-v60-9900riversec-waf-26-03ruijie-behavior-firewall-r2-3-2-t0 等服务的入口与模块标识符。
  3. 依赖补充:在 dependenciesbundledDependencies 中新增 @alicloud/pop-core,用于支持 aliyun-waf3 服务。
  4. 条目重排:部分已有条目(如 tencent-bhalibaba-sasmispopencti 等)在 files 数组中的位置有所调整,属于冲突解决后的正常重排,无内容丢失。

经核对,所有 bin 键均在 files 数组中存在对应的 bin/*.js 文件路径;新增模块标识符与 bin 键的映射关系一致;依赖与 bundledDependencies 保持同步。未发现由本次变更引入的功能性、安全性或数据完整性问题。

@monkeyscan

monkeyscan Bot commented Jul 14, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: e012e50

本次 PR 修改了 services/bin/octobus-tentacles.js,主要意图是新增多个服务条目(aliyun-waf3、dsensor、fofa-network-space-mapper、m01-intelligence、nsfocus-ngfw-v60-9900、riversec-waf-26-03、ruijie-behavior-firewall-r2-3-2-t0)并调整部分现有服务的位置。但最后一次 hunk 中存在严重的合并冲突解决错误:将原本应保留在 services 对象内的 4 个服务(shodan-internetdb、tencent-bh、alibaba-sas、misp)错误地放置在了 .action() 回调函数的 runServiceMain() 调用之后,并产生了 });, 这种非法语法。这会导致整个文件无法被 JavaScript 引擎解析,程序完全无法运行。此外,这 4 个服务也因脱离 services 对象而无法被正常注册和调用。

@monkeyscan

monkeyscan Bot commented Jul 14, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: 32bca10

No changed files to review.

@monkeyscan

monkeyscan Bot commented Jul 14, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: f10c740

No changed files to review.

Comment thread services/bin/octobus-tentacles.js Outdated
kiligertee and others added 3 commits July 14, 2026 10:57
…e package

Shodan InternetDB — free, no-signup, no-key IP intelligence API.
Returns ports, hostnames, CVEs, tags, CPEs for a given IP.

1 RPC method:
- LookupIP (GET /{ip})

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- mapHttpError now handles 401 and 403 as PERMISSION_DENIED
- Removed unused snippet variable (dead code)
- Move res.text() and mapHttpError inside try block for AbortController coverage
- Added GrpcError passthrough in catch to prevent re-wrapping
- Added 401 and 403 test cases
@dingzhejianjian
dingzhejianjian force-pushed the feat/shodan-internetdb branch from f10c740 to dc3087e Compare July 14, 2026 02:59
@monkeyscan

monkeyscan Bot commented Jul 14, 2026

Copy link
Copy Markdown

PR Title: feat(shodan-internetdb): add Shodan InternetDB IP ...

Commit: dc3087e

本次 PR 新增了一个 Shodan InternetDB 服务包(services/shodan__internetdb/),用于通过 Shodan 的免费 IP 情报 API 查询端口、主机名、CVE 等信息。核心实现包括:

  • shodan-internetdb.js:主逻辑,包含 IP 校验(net.isIP)、HTTP 请求(fetchJson + AbortController 超时)、HTTP 状态码到 gRPC 错误码的映射,以及响应字段的归一化。
  • 测试文件覆盖了正常查询、空响应、缺失 IP 校验、401/403/404/429/500 错误映射,以及部分工具函数。
  • 配套添加了 proto、service.json、config/secret schema、README、入口脚本等。

整体代码结构清晰,输入校验和错误处理基本到位。主要风险点在于:测试对 net.isIP 的异常输入分支(如非法 IP 字符串)未覆盖;fetchJson 的网络异常/超时回退路径缺乏测试;handler 传入 runLookup 的请求对象与 resolveCallContextreq 的归一化逻辑存在不一致(handler 始终取 ctx.request,未使用 ctx.req ?? ctx.request 的兜底逻辑)。

export const handlers = {
[METHOD_LOOKUP_FULL]: (ctx) => makeRuntime(ctx).runLookup(ctx.request ?? {}),
};

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

handler 请求对象来源与 resolveCallContext 的归一化逻辑不一致

resolveCallContext 内部显式做了 req: ctx.req ?? ctx.request ?? {} 的归一化,意味着作者预期运行时可能通过 ctx.req 传递请求体。但 handlers 中直接调用 makeRuntime(ctx).runLookup(ctx.request ?? {}),完全绕过了该归一化结果。若实际框架使用 ctx.req 而非 ctx.request,runLookup 会收到空对象,导致 IP 必填校验直接失败。

Problem code:

Changed code at services/shodan__internetdb/src/shodan-internetdb.js:141-143

Recommendation:
在 handler 中将请求体传入改为 ctx.req ?? ctx.request ?? {},或如果框架始终使用 request,则移除 resolveCallContext 中未实际消费的 req 归一化逻辑,避免误导后续维护者。

globalThis.fetch = originalFetch;
console.log = originalConsoleLog;
console.error = originalConsoleError;
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

缺少对非法 IP 格式输入的测试覆盖

现有测试仅验证了 request: {}(缺失 ip)的场景,但未覆盖 net.isIP(ip) 返回 0 的非法 IP 格式分支,例如 'not-an-ip'、'256.0.0.1'、'1.2.3.4.5' 或空字符串。该分支是实现中的显式校验逻辑,缺乏测试意味着后续重构时可能意外削弱校验或改变错误行为。

Problem code:

Changed code at services/shodan__internetdb/test/shodan-internetdb.test.js:56-58

Recommendation:
补充非法 IP 格式的测试用例,断言其抛出 legacyCode 为 INVALID_ARGUMENT 的 GrpcError。

assert.ok(result.hostnames.includes('dns.google'));
assert.ok(result.ports.includes(53));
assert.ok(result.cpes.includes('cpe:/a:google:dns'));
assert.ok(result.tags.includes('cdn'));

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 异常/超时回退路径的测试覆盖

fetchJson 的 catch 分支负责将非 GrpcError 异常(如网络断开、DNS 失败、请求超时等)统一包装为 UNAVAILABLE。当前测试仅覆盖了 HTTP 错误状态码,未覆盖 fetch 本身抛出异常或 AbortController 触发超时的场景。该路径若在未来重构中被意外移除或修改,会导致底层异常直接外泄或错误码映射丢失。

Problem code:

Changed code at services/shodan__internetdb/test/shodan-internetdb.test.js:76-106

Recommendation:
补充 mock fetch 抛出异常(如 new Error('getaddrinfo ENOTFOUND') 或 AbortError)的测试用例,断言最终错误 legacyCode 为 UNAVAILABLE。

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.

feat(shodan-internetdb): add Shodan InternetDB IP intelligence service

3 participants