下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/qixiantech--wechat-miniprogram-security-vulnerability-scan.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @qixiantech/wechat-miniprogram-security-vulnerability-scan。Agent响应契约多端适配:基于ARC v2.1让同一结果在手机、PC、纯语音及空间终端保持事实一致并按能力改变表现,支持签名履约凭证和授权跨设备取回且不重复计费;需AI Agent显式声明能力并安全保管凭证,服务不自动识别设备。从攻击者可获取客户端代码的视角,静态检查硬编码密钥、敏感存储、动态内容、网络通信、云函数鉴权、Source Map、内部地址与npm依赖公开漏洞。
阅读全文 (展开查看完整说明)
概述
Agent响应契约多端适配
本 Skill 已接入 ARC v2.1,支持手机、PC、纯语音及具备空间显示能力的 AI 终端调用。同一次分析或交付的金额、结论、风险和依据保持一致,终端可以根据自身能力选择精简文本、无 Markdown 语音朗读稿、卡片、表格或空间化重点展示。
支持 ARC v2.1 的 Agent 可安全保存服务端签发的履约凭证,在凭证有效且未退款或吊销时,从其他设备取回同一次履约的原结果;取回不会创建新订单,也不会重复收费。
当前限制: 服务不会读取硬件信息,也不会自动识别真实设备类型,需要调用它的 AI Agent 主动声明自身支持的输入、显示和输出能力。服务提供的是适合朗读的文本,不直接生成音频;语音终端需要具备 TTS 或朗读能力。跨设备取回不是自动账号同步,必须由 Agent 安全保管签名履约凭证,或由可信宿主重新验证用户身份;仅知道微信身份标识、订单号或履约编号不能读取结果。
服务价格 ¥9.99/次。合并源码安全扫描和反编译暴露面评估;输出区分高可信问题、疑似风险和需动态验证项,不等同于渗透测试。
Pay Skill 标准调用
本 Skill 使用腾讯 SkillHub 微信支付 AI 专属卡(Agent Pay)完成付费。首次调用直接请求业务接口;收到有效 HTTP 402 后,当前 Agent 宿主会按需显示 AI 专属卡的绑定或支付授权入口。该宿主支付动作的技术调用名为 weixinpay_pay,它不一定常驻本地插件列表。不要在首次调用前搜索、安装或检查名为 weixinpay 的 npm、MCP 或本地插件。
官方兼容的普通 JSON 首次请求:
POST https://api.qixiantech.com/api/wechat-miniprogram-security-vulnerability-scan/v1.0.1
Content-Type: application/json首次请求无需自定义 Header。服务端会生成请求关联 ID;宿主只有在能够生成合法 UUID 时才可选传 X-Request-Id 或 X-Idempotency-Key,不得把文档占位文字作为 Header 值发送。
{
"project_name": "示例金融小程序",
"files": [
{
"path": "app.json",
"content": "{"pages":["pages/index/index"],"subpackages":[{"root":"sub","pages":["detail"]}]}",
"size": 86
},
{
"path": "pages/index/index.js",
"content": "Page({open(){wx.request({url:"http://api.example.com/data"})}})",
"size": 68
},
{
"path": "pages/index/index.wxml",
"content": "<rich-text nodes="{{articleHtml}}"></rich-text>",
"size": 49
},
{
"path": "cloudfunctions/order/index.js",
"content": "exports.main=async(event)=>db.collection("orders").doc(event.id).remove()",
"size": 76
},
{
"path": "package-lock.json",
"content": "{"lockfileVersion":3,"packages":{"":{"name":"demo"},"node_modules/lodash":{"version":"4.17.21"}}}",
"size": 106
},
{
"path": "dist/app.js.map",
"size": 4096
}
]
}收到支付触发响应后,Agent 必须按以下顺序处理:
- 从
WeixinPay-RequiredHeader 读取payment_code;只读取响应体的 Agent 从WeixinPay["WeixinPay-Required"]读取同一值。 - 核对响应中的金额、币种和服务用途,并向用户展示付款信息。
- 将该值作为
paymentCode交给当前 Agent 宿主按需提供的腾讯 SkillHub 微信支付 AI 专属卡支付动作(技术调用名weixinpay_pay)。尚未绑定专属卡时,先按宿主界面完成绑定,再由用户确认支付。 - 支付成功后,使用首次请求的原始业务 JSON,并携带原
WeixinPay-Required和X-Out-Trade-No重试同一 URL。 - 若本次响应协商到 ARC v2.1,Agent 必须安全保存
fulfillment.id、result_digest及extensions.signed_receipt;不得把签名凭证令牌显示给用户、写入普通日志或发送到无关服务。 - 只有在已经收到有效 402、已尝试唤起宿主支付动作,但宿主仍未显示 AI 专属卡绑定或授权入口时,才能说明当前调用环境暂未暴露该能力。不要通过本地插件目录是否存在来判断,不要重新创建订单,也不得伪造支付结果。
边界
- 源码通过HTTPS发送到起弦服务端并在内存中分析;不应提交环境文件、证书、私钥、用户数据、数据库内容或无关商业秘密。
- 硬编码密钥高可信命中会脱敏输出;变量名命中不一定是真实凭据,必须人工确认并优先轮换可用凭据。
- 混淆代码、动态属性访问、远程下发配置和跨模块间接调用可能绕过静态规则;无命中不能作为不存在漏洞的证明。
- 云函数未发现本地鉴权证据不等于已确认越权,鉴权可能封装在其他模块;最终结论需要动态授权测试和对象级权限测试。
- OSV只查询锁文件中的精确npm版本;无锁文件、查询失败、超出查询上限或无命中时,均不能宣称依赖绝对安全。
- 压缩、混淆和分包只能增加阅读成本,不是秘密保护或权限控制;客户端代码应按可被获取和分析设计。
- 本 Skill 不攻击真实系统、不绕过登录、不利用漏洞,也不替代渗透测试、安全认证或人工代码审计。
Agent响应契约接入说明
本节供调用本 Skill 的 AI Agent 读取,普通用户无需填写或理解这些协议字段。设备能力不是由服务端猜测的:Agent 必须根据自身真实能力填写受限的能力声明,不得把浏览器标识、自由文本设备名或用户输入伪装成设备能力。
语音终端读取 presentation.speech_text 并自行朗读;屏幕终端读取结构化 result、extensions 和表现变体。result_digest 用于确认不同终端获得同一业务结果,fulfillment.id 用于识别同一次履约;Agent 不得从展示文案反向解析或修改金额、结论、风险、证据和支付状态。
当前版本已经接入 ARC v2.1,并继续兼容 ARC v2.0。两者都会把不可变业务结果与终端表现分开:同一已履约订单切换终端时不重新运行业务、不重新付款,result_digest 保持一致,仅 presentation 和 representation_id 可按能力变化。服务端协商到 2.1.0 时,还会签发限定当前 Skill、履约、结果摘要和有效期的可携带履约凭证。
已启用能力档案:PAY(支付与幂等履约)、ASSESS(结论与风险评估)、SCAN(扫描范围与定位)、BUNDLE(多文件资源包)、LIVE(实时外部观测)、EVID(证据与适用边界)、PAGE(大结果分页与续读)、PRIV(隐私与共享显示)。
显式启用 v2 时使用:
POST https://api.qixiantech.com/api/wechat-miniprogram-security-vulnerability-scan/v1.0.1
Content-Type: application/vnd.qixiantech.skill-request+json;version=2
Accept: application/vnd.qixiantech.skill-response+json;version=2与普通 JSON 调用相同,ARC v2 首次请求无需自定义 Header;可选请求 ID 或幂等键必须是宿主实际生成的合法 UUID。
{
"contract_request": {
"accepted_versions": [
"2.1.0",
"2.0.0"
],
"accepted_profiles": [
"payment@1",
"assessment@1",
"inspection@1",
"resource-bundle@1",
"external-observation@1",
"evidence@1",
"collection@1",
"privacy@1"
]
},
"client_context": {
"locale": "zh-CN",
"input_modes": [
"text"
],
"output_modalities": [
"text",
"speech",
"visual"
],
"display_class": "standard",
"formats": {
"markdown": true,
"tables": true,
"cards": true,
"links": true,
"actions": true
}
},
"input": {
"project_name": "示例金融小程序",
"files": [
{
"path": "app.json",
"content": "{"pages":["pages/index/index"],"subpackages":[{"root":"sub","pages":["detail"]}]}",
"size": 86
},
{
"path": "pages/index/index.js",
"content": "Page({open(){wx.request({url:"http://api.example.com/data"})}})",
"size": 68
},
{
"path": "pages/index/index.wxml",
"content": "<rich-text nodes="{{articleHtml}}"></rich-text>",
"size": 49
},
{
"path": "cloudfunctions/order/index.js",
"content": "exports.main=async(event)=>db.collection("orders").doc(event.id).remove()",
"size": 76
},
{
"path": "package-lock.json",
"content": "{"lockfileVersion":3,"packages":{"":{"name":"demo"},"node_modules/lodash":{"version":"4.17.21"}}}",
"size": 106
},
{
"path": "dist/app.js.map",
"size": 4096
}
]
}
}支付后重试必须保持 input 不变,允许只切换合法的终端能力声明。request_id 回显当前 HTTP 请求,不作为履约身份;跨终端履约身份读取 fulfillment.id 和 result_digest。服务端未启用 ARC v2.1 时会从上述双版本声明中选择 2.0.0;如果运行中的 v2.1 新订单闸门暂时不可用,错误信封会通过 available_versions 和 retry_with_version 明确提示 2.0.0,Agent 不得在同一请求中自行篡改协商结果。
ARC v2.1 跨设备取回
- 完成响应协商到
2.1.0时,从extensions.signed_receipt保存token、recovery_uri和expires_at,并同时保存fulfillment.id与result_digest。token是 bearer 授权凭证,必须按敏感信息保护。 - 另一设备取回时,向凭证中的
recovery_uri发起GET,使用Authorization: Bearer <token>或X-ARC-Fulfillment-Receipt: <token>,并发送该设备当前的X-Request-Id。 - 成功响应会返回
X-Skill-Replay: true;Agent 必须核对返回的fulfillment.id与result_digest和原履约一致。该请求只读取原结果,不创建订单、不触发支付。 - 仅持有 OpenID、订单号、
fulfillment.id或result_digest均无权读取结果。凭证无效返回401,结果记录不存在或已超过保留期返回404,凭证因退款或安全事件被吊销返回410;这些情况不得通过创建新订单伪装成原履约取回。
调用流程
- 说明提交内容会通过 HTTPS 发往第三方服务;删除不必要的身份信息、密钥和商业秘密并取得用户同意。
- 收集必填字段:
files。 - 按实际情况收集可选字段:
project_name。 - 只接受用户明确提供的小程序项目ZIP;在 Agent 本地安全读取目录,不执行脚本、不安装依赖、不构建项目。
- 提交小程序前端、必要的
cloudfunctions/cloudbase源码、项目配置和package-lock.json;源码提交path、UTF-8content、size,Source Map等非源码只提交路径和字节数。 - 禁止提交
.env、证书、私钥文件、真实用户数据、数据库导出、node_modules、.git、miniprogram_npm和无关商业秘密;不得把二进制编码为Base64放进content。 - 如果用户已知项目含真实有效密钥,先建议轮换和移除;扫描结果中的疑似凭据必须保持脱敏,不得在回答中复述原值。
- 输入上限为2500个文件、单个源码1MB、源码文本合计4MB;超限时让用户精简项目,不要拆成多次付费扫描。
- 在 SkillHub 展示 ¥9.99、服务用途和数据边界,取得用户明确付款确认。
- 按“Pay Skill 标准调用”先请求业务接口;支持 ARC v2 的 Agent 可以改用“Agent响应契约接入说明”中的媒体类型和完整请求信封。
平台返回 HTTP 402 时
业务接口是公开的 Pay Skill 入口,不需要用户配置 API Key,也不携带Authorization。首次请求不携带 X-Out-Trade-No,也不要求自定义Header;服务端会生成请求关联 ID。宿主如能生成合法 UUID,可以选传X-Request-Id 或本次业务调用唯一的 X-Idempotency-Key,但不得把文档占位文字作为 Header 值。服务端完成微信支付 Native 下单和SkillHub AI 预下单后,会返回:
- HTTP 状态码:
402 - Header
WeixinPay-Required:支付码 - Header
X-Out-Trade-No:商户订单号 - Body
WeixinPay:兼容只读取响应体的 Agent - v1 Body
amount:9.99,currency:CNY - ARC v2
extensions.payment.amount:999分,currency:CNY
显式 ARC v2 调用的两个支付响应头保持不变;响应体同时包含官方顶层WeixinPay 兼容提示块,以及 status=action_required、result=null和 extensions.payment。支付事实以服务端生成的 extensions.payment 为准,WeixinPay 仅用于 SkillHub 和只读取响应体的 Agent 拉起支付,两处支付码必须一致。
官方兼容字段至少包含以下结构;服务端可以同时返回业务契约字段:
{
"data": {
"message": "本次调用需要付费"
},
"WeixinPay": {
"WeixinPay-Required": "<payment_code>",
"prompt": "这是腾讯 SkillHub 微信支付 AI 专属卡(Agent Pay)的支付授权请求,不是需要在本机安装的插件。请勿搜索或安装同名 npm、MCP 或本地插件。请将 WeixinPay-Required 的值作为 paymentCode 交给当前 Agent 宿主按需提供的 weixinpay_pay。如尚未绑定专属卡,请先按宿主界面完成绑定,再由用户确认支付。支付成功后原样重试业务请求。"
}
}收到 402 后:
- 保存两个响应头,核对金额为 ¥9.99、币种为 CNY;若首次请求选传了合法
X-Idempotency-Key,网络重发时复用该键。 - 将
WeixinPay-Required的值作为paymentCode交给当前 Agent 宿主按需提供的腾讯 SkillHub 微信支付 AI 专属卡支付动作(技术调用名weixinpay_pay);尚未绑定专属卡时,先按宿主界面完成绑定,再由用户确认支付。不要搜索或安装同名 npm、MCP 或本地插件。 - 支付成功后必须重新请求同一 URL;v1 的 JSON body 与首次请求逐字段一致。ARC v2 必须保持
input不变,允许仅切换合法的client_context。 - 重试请求必须原样携带
WeixinPay-Required和X-Out-Trade-No两个 Header。 - 后端按
X-Out-Trade-No向微信支付查单;只有trade_state=SUCCESS、金额、商户号和 AppID 均匹配时才返回付费结果。 - 返回
PAYMENT_REQUIRED或NOT_PAID时等待原订单,不创建新订单;返回REFUNDED时告知已退款并终止。 - 禁止伪造支付码、订单号或支付结果;ARC v2 不得修改原始
input。 - 新的业务调用如选择使用幂等键,必须生成新的合法 UUID;已过期或已处理订单不得复用旧键。
支付后重试示例:
POST <与首次请求相同的 URL>
Content-Type: application/json
WeixinPay-Required: <402 响应中的 payment_code>
X-Out-Trade-No: <402 响应中的 out_trade_no>
<与首次请求完全一致的 JSON>展示结果
原样展示 result_status、summary、score、grade、findings、recommendations、risks、missing_info、security_metrics、dependency_scan、reverse_engineering_exposure、scan_coverage。
- 屏幕终端按
presentation展示文本、表格或卡片;语音终端只朗读presentation.speech_text。任何终端都不得为了适配展示而修改result中的金额、结论、风险或依据。 - Agent 应保留并可向用户展示
fulfillment.id、result_digest和凭证到期时间,用于识别同一次履约和核对跨端结果;不得展示或复述extensions.signed_receipt.token。 - 跨设备取回成功后应明确说明这是原履约结果,且未再次收费;退款、吊销、凭证过期或结果超过保留期时,应如实提示无法继续取回。
ACTION_REQUIRED表示存在高可信静态风险;SECURITY_REVIEW_RECOMMENDED表示存在需人工确认的风险;INCOMPLETE_SCAN表示依赖或动态范围未完整覆盖。NO_OBVIOUS_STATIC_RISK_FOUND只表示提交范围内未发现明显静态问题,不代表系统已被证明安全。
HTTP 402 按上方流程处理支付;400 先修正输入且确认字段类型、长度和枚举值后再重试,不要重复付款;409 订单或幂等键冲突时改用新的合法 UUID,或在首次请求中省略可选幂等键;410 表示订单已过期;429 按 Retry-After 等待;5xx 告知暂不可用。