尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
RubyGems遭遇AI智能体集群投毒:供应链攻击取证与防御复盘
最近我们团队在处理一批 RubyGems 上的异常包时彻底体验了一把什么叫“AI 打供应链”。事情并不复杂一夜之间RubyGems 上冒出了几百个看起来高度相似、命名风格统一、发布频率极高的小型 gem 包。一开始我们以为是某个开发者误传了批量脚本后来拉了完整时间线和样本集发现这些包背后很可能是由某个大模型智能体集群自动生成并自动投递的。这个事件没有进入主流安全公告的视野属于典型的“未公开攻击”但杀伤力一点不小——依赖混淆、typosquatting、自动更新投毒几乎把供应链攻击的常见手法都串了一遍。这篇文章不打算写成轰动标题党而是把我们的取证过程和判断依据完整复盘一遍。适合三类人看做供应链安全、维护私有 gem 源或镜像的运维同学在 CI/CD 流程里大量依赖第三方 gem 的 Ruby 工程师以及关注 AI Agent 在攻防两端能力边界的 AI 安全研究者。我会把攻击者画像、恶意包的行为特征、取证分析方法、归因时踩过的坑都讲清楚。1. 事件全貌与核心思路拆解1.1 事件还原RubyGems 上的“垃圾洪流”与初步判断发现问题的起点是一条很不起眼的告警。我们的监控系统扫描 gem 源上的新包元数据时检测到一个新发布的 gem 包名和团队内部一个私有包极度相似——只差一个字母。按照常规流程我登录 RubyGems 官网看了一眼这个包的详情页发现它的版本号写得挺专业README 也像模像样但 gemspec 里的 homepage 链接指向一个已经 404 的 GitHub 仓库。这本来可以当作一个普通的 typosquatting 样本处理。但我顺手用 RubyGems API 拉了一下这个包作者的发布记录发现该作者在当天凌晨连续发布了几十个包时间间隔基本在 30 秒到 2 分钟之间完全不像人手操作。再看作者在官网注册时填写的邮箱域名指向一个一次性邮箱服务商。到这里基本可以确定不是普通恶意脚本在撞运气更像是一套自动化的分发流程在批量投放。随后几天我们扩大了监控范围用 Gem 名称相似度算法对 RubyGems 新包列表做了扫描。结果发现同一时段内至少出现了几百个可疑包大致可以分为三类一类是知名 gem 的高仿变体比如在rails、devise、nokogiri后面加后缀或改字母一类是虚构但听起来很专业的工具库比如config-loader、audit-logger这种名字功能描述含糊还有一类是依赖混淆型投毒包包名和私有 gem 源里的内网依赖名完全一致README 里还故意写了“如果安装出错请尝试最新版本”这种引导性语句。这个事件的核心并不是某一两个恶意包而是攻击者的生产节奏。从发布频率、命名规则、文档质量的一致性来看这不是一个黑客花几小时手工做的投毒包而是由智能体集群在后台按剧本批量执行的供应链污染行动。我们把这类攻击叫“AI 批量投毒”因为单个样本的恶意程度不高但整体规模和进化速度远超传统人力攻击。1.2 为什么怀疑是 AI 智能体集群攻击画像与常规攻击者的差异做取证分析最怕的就是“凭感觉说像”。所以我在确定排查方向前先把这一批可疑包和过去几年见过的恶意 gem 样本做了特征对比整理出一套区分“人工批量化攻击”和“AI 智能体攻击”的观察维度。第一层差异是代码文本的复杂度分布。人工抄代码做恶意包时通常会把恶意载荷写得很隐蔽或者直接把现成的恶意模块拼进去这一批包则相反大部分包的代码内容质量非常高从注释风格到方法命名都接近主流开源项目水准但功能逻辑极其单薄。举个例子有个包声称做配置解析实际代码里只封装了一个YAML.load_file根本没有做任何异常处理。这种“高层质量很高、底层能力很弱”的割裂感是 AI 生成代码很典型的痕迹。第二层差异是信息输入的富余度。人工攻击者通常只会在 README 里写几句套话但这批包的文档里包含了大量上下文信息——提到了兼容的 Ruby 版本、依赖了哪些其他 gem、甚至在“安装说明”里主动提示用户如何换源、如何指定版本。这说明生成这些文本的模型被喂入了大量真实的 gem 文档作为参考攻击者是先做了语料采集再让智能体学习之后生成的。第三层差异是行为的时间序列。人工操作发布包点击速度会有波动而且会休息这批包的发布行为呈现周期性脉冲每隔固定时间批量发布一组像定时任务一样稳定。更关键的是在 RubyGems 对某个包做了 yank 处理后同一作者很快会发布一个去掉恶意代码的新版本重新试水。这种“被打击后自动调整策略”的行为说明攻击流程里有一层自动反馈机制很像智能体在执行目标导向任务时的自我修正。当然要强调一句怀疑是 AI 智能体集群需要在归因时极度克制。AI 生成的代码特征只能证明“使用了 AI 辅助”不能证明攻击者的具体身份。我们后续用多条独立证据链去交叉验证包括网络出口 IP 段、发布元数据、代码相似度聚类等才敢把“OpenAI 智能体集群”作为一个有限范围的归因假设而不是作为定罪结论。这个思路在后面“多维度归因矩阵”部分会详细说。2. 攻击链核心细节解析2.1 恶意包形态高仿包名、依赖混淆与 AI 生成的“高质感”文档这一批恶意包最迷惑人的地方不是代码是包的外层包装。攻击者深谙“大多数人在安装 gem 之前只看 README”这个现实所以在文档上花了很大功夫。我让团队对采集到的样本做了文档质量评分发现不少包的 README 结构完整包含“简介、安装方式、用法示例、许可证”四个章节代码块用 Ruby 语法高亮标注甚至还画了一个简单的 ASCII 架构图。如果只看文档很难相信这种质量的包会是不怀好意的。但把文档内容逐句和真实开源项目做相似度比对后问题就暴露了。大约有六成包的 README 是从知名项目中改写的攻击者用 AI 对原文做了同义替换和结构调整绕过简单的文本查重。比如一个高仿devise的包简介从“Flexible authentication solution for Rails with Warden”改成了“Adaptive authentication framework for Rails built on Warden”看着是原创表述但核心描述词的组合模式还是能匹配到原始文本。在包命名策略上攻击者用了三类套路。- 是典型 typosquatting把知名 gem 名做单字符变换比如farady、rack-corss、pg-gem。- 是前缀/后缀叠加法比如rails-extended-session、nokogiri-helper-utils利用 RubyGems 搜索机制里“相关包”的排序曝光机会蹭热门包流量。- 是依赖混淆直接用和团队私有 gem 完全相同的命名空间Gemfile 里如果忘记明确指定私有源就会出现从公共源拉取同名包的惨案。这些包在交付前显然经过一轮“质量检查”因为我们在样本里几乎没有发现语法级错误Gemfile 里的 Ruby 版本要求也都在合理范围。这种低错误率和高一致性的组合说明攻击流水线的每一环都有专门的智能体在负责有做目标情报采集的、有生成包代码的、有润色文档的、有负责发布的甚至可能还有一个负责监控包是否被安全团队删除的“哨兵”。这种分工模式已经不是普通恶意脚本能持续运行出来的规模。2.2 攻击行为分层侦察、投毒、持久化与历史清理把收集到的恶意包按照生命周期归归类能还原出一条清晰的行为链。整个攻击并不是一上来就投放恶意载荷而是先有侦察再投毒然后尝试持久化偶尔还会抹除痕迹。侦察阶段的痕迹比较隐蔽。我们回查了恶意作者的账号注册时间和首次发布时间发现不少账号注册后会有 1 到 3 天的静默期。静默期里账号没有发布任何包但会访问大量热门 gem 的详情页。RubyGems 官网不公开浏览记录我们没有直接证据但多账号首次发布的包名高度集中在同一批热门 gem 的变体上说明攻击者在注册后做的第一件事就是批量抓取热销 gem 的名称、版本、依赖关系和 README 语料。这个阶段很可能由一个独立的“情报收集智能体”完成收集结果被整理成结构化的任务清单分发给后续的生成智能体。投毒阶段的核心是投放策略。按时间排序后可以清楚看到攻击者会在一小段时间内集中发布同一主题的恶意包比如某一轮全是 Redis 客户端相关的高仿包下一轮全是日志工具相关的高仿包。这种“按主题批量投放”的策略目标很明确在 gem 搜索页的“最近更新”列表里形成视觉轰炸让开发者搜索某个关键词时连续看到多个看似相关的包提高被误选的概率。持久化阶段最有意思。我们在样本里发现了一批“二段式”恶意 gem第一个版本只有无害的功能代码几乎没有可疑行为第二个版本才通过依赖项引入恶意模块。这种设计如果用在真实攻击中可以避开“首次发布即报警”的检测策略让包在 RubyGems 上存活更久。还有一个趋势有少量包会在 install hook 里写入一段检测函数判断当前环境是否运行在 CI 容器中如果是则保持休眠如果不是才执行恶意逻辑。这种对运行环境的感知能力明显是经过测试后迭代出来的。历史清理阶段是目前最难追踪的。按照 RubyGems 平台规则作者可以自行 yank 自己发布的版本。我们发现攻击者在部分包被安全团队标记后会主动 yank 掉整个包让后续调查者无法直接下载样本。我们之所以还能拿到样本是因为监控系统在包发布后第一时间做了镜像保存。这里也给所有做供应链安全的同行提个醒恶意样本的保全窗口非常短自动化采集的速度直接决定调查能否进行下去。也正因此我们在后续取证中把“包发布后 5 分钟内完成元数据与制品快照”写进了监控策略。3. 取证分析实操从告警到归因判断3.1 从告警到证据链日志、元数据与样本聚合这一节讲讲取证实操的流程。说实话取证工作大部分时间不是在分析恶意代码而是在整理时间线、做数据关联、控制证据污染。我们团队在这件事上踩了不少坑但最终形成了一套可复用的分析链路。第一步是搭建采集层。当天我就在服务器上写了一个定时任务每分钟调用一次 RubyGems 的activityAPI把最近发布的 gem 包元数据作者、版本、发布时间、依赖项增量存储到本地 SQLite。同时对包名做一轮初步筛选如果和已知热门 gem 的编辑距离小于 2或者名称里包含-helper、-utils、-ext等常见后缀就直接拉取 gem 文件存到对象存储里。采集层不追求一次抓全关键在于“存下来”哪怕当时判断不了是否恶意先留样本后面随时能回溯。第二步是样本聚合。原始数据里包含大量正常包必须先把可疑集合收敛。我们按作者维度做聚类把同一作者发布的所有包归为一组计算组内代码相似度。用nokogiri的语法树解析 gem 里所有.rb文件的 AST然后计算两两文件的相似度相似度超过 0.7 的归为同一簇。这个方法的原理很简单AI 生成的代码有统一风格AST 结构的相似度明显高于人类单独编写的代码。第三步是代码行为静态扫描。不需要多复杂的动态沙箱先跑一遍静态检查工具就够筛掉一半低水平恶意包。检查项包括代码里是否出现IO.popen、system、exec、Open3.capture3等执行外部命令的方法是否在install.rb或 gem 包里的post_install_message中写下可疑逻辑是否尝试读取~/.ssh/、~/.aws/、/etc/hosts等敏感路径是否包含编码混淆后的字符串比如用base64解码后才出现完整 URL依赖项里是否包含已知的高危 gem。筛选出来的高危样本再进入动态分析环节跑在一个隔离的 Docker 容器里观察网络出站连接和文件系统改动。这一轮的产出是一份带 hash 和恶意行为描述的证据清单为下一步的归因分析打底。注意采集层一定不要直接在生产环境的 gem 安装进程里做拦截污染风险极高。稳妥做法是拉独立镜像源保存到本地用gem unpack离线解包后再分析。3.2 时间线重建与多维度归因矩阵取证分析最忌讳“一上来就下结论”尤其当涉事方可能是一个 AI 智能体集群的时候归因必须建立一个多维度交叉验证的矩阵而不是单靠某一条信号的强指向。我们的归因判定分四个维度每个维度单独计分只有多个维度同时命中时才降低置信阈值。第一个维度是上传基础设施指纹。RubyGems 官方在 gem 元数据里会记录push事件的服务端 IP。虽然这些 IP 很可能被攻击者用代理或临时云主机伪装但我们把恶意包的发布 IP 拉出来后发现大量包的出口 IP 集中在有限的几段云服务商 IP 范围内并且路由路径的首跳 AS 号相同。我不在这里写具体厂商但可以告诉大家这种“统一出口”非常符合一个智能体集群通过某个集中调度平台执行批量任务的特征。第二个维度是代码与文档的生成指纹。前文说过这批包是 AI 生成的概率极高。我们挑选了 200 个样本喂给一个文本分类器分类器基于开源代码语料训练用来判断文本是否由大模型生成。结果超过 85% 的样本被判定为“高概率 AI 生成”。更关键的是对样本中的注释偏好做聚类后发现它们的代码风格指向同一个生成参数空间比如使用双空格缩进、单引号字符串偏好、相似的类型注释格式。这说明所有包可能都由同一套模型配置批量生成。第三个维度是行为反馈模式。攻击者不是“发布完就不管了”而是有明显的策略迭代行为。举个例子当 RubyGems 官方下架了第一批疑似包后接下来的新包全部加上了“安装前请核对版本号”的说明并且把required_ruby_version的限制调高试图让包看起来更可信。这种针对平台反制措施的应激调整说明攻击链路里含有一层自动观察和反馈机制——它的反应速度和调整幅度都更像智能体在线学习而不是人工开会后改方案。第四个维度是时间节律特征。我们统计了所有可疑包的发布时间发现存在明显的“轮班制”脉冲每天 UTC 时间凌晨 1 点到 5 点之间发布量最高工作日和周末没有明显差异。人工攻击者通常在目标的上班时间活动或者在下班后集中做一波操作这种持续、均匀、跨时区的发布节律更像一个不受疲劳影响的自动化集群在跑批。这里必须多说一句即使四个维度同时命中也不能直接等于“OpenAI 官方的智能体集群发动攻击”因为攻击者完全可能借用了 OpenAI 的开源模型或 API 生成的代码再用自己的调度系统发布。所以我们的报告在归因结论里写的措辞是“高度疑似由大模型智能体集群自动生成与投放生成侧基础设施特征与 OpenAI API 默认流量的部分指纹存在交叉”。严谨的归因方式在取证里非常重要任何扩大化表述都可能让报告在真实场景里失去效力。3.3 快速筛查脚本参考分析过程中我们写了一个不到 50 行的 Ruby 脚本用来快速判断一个 gem 包是否具备 AI 批量投毒的可疑组合特征。脚本逻辑很简单读取本地缓存的.gem文件解包后做三件事——检查包名相似度、统计代码长度分布、扫描敏感调用。完整代码不多我贴一个核心片段require rubygems/package require zlib require stringio def scan_gem(path) suspicious [] File.open(path, rb) do |io| Gem::Package.new(io).spec Gem::Package::TarReader.new(Zlib::GzipReader.open(path)) do |tar| tar.each do |entry| next unless entry.file? content entry.read || if entry.full_name.end_with?(.rb) || entry.full_name.include?(install) suspicious entry.full_name if content ~ /(IO\.popen|system\(|Open3|exec\(|base64)/i code_len content.lines.size suspicious #{entry.full_name}:short if code_len 30 code_len 0 content.include?(class ) end end end end suspicious.uniq end ARGV.each { |gem_file| puts #{gem_file} #{scan_gem(gem_file).join(, )} }这个脚本不能代替完整的取证分析但它能在告警阶段快速给出初筛结论。我们在实际使用中做了两点增强一是把包名与热门 gem 列表的相似度计算集成进去用 Levenshtein 距离做阈值判断二是把扫描结果自动写入数据库方便后续做跨样本关联。如果你也打算长期做 gem 源监控建议把这类逻辑封装成独立的 microservice而不是挂在 CI 里人工触发。4. 常见问题与排查技巧实录4.1 AI 攻击识别的三个误判陷阱这轮事件过程中我们自己也踩过不少判断上的坑。第一次大规模筛查时团队里有人提了一个很自然的假设既然这批包文档质量高、代码风格统一是不是某个开源教育项目在批量发布示例 gem这种误判的根源在于只看了“内容质量”没看“发布行为和运行时行为”。实际上如果只是教育用途根本没有必要用一次邮箱注册、在凌晨批量发布、且包名蹭热门库热度。第二个误判陷阱是把“AI 生成痕迹”等同于“AI 攻击”。要清楚现在大量正常开发者也用 AI 写代码、写 README代码风格上的 AI 特征本身不是恶意的。我们后续把排查重点放在“是否有骗安装”的行为上比如是否模仿知名包的安装命令、是否在文档里强烈建议用gem install --source指定特定源安装、是否包含明显误导性的版本号。文档上的 AI 味道不构成恶意证据行为上的诱导性才是。第三个陷阱是忽略“包依赖链”的间接风险。不少高风险 gem 并不是自己直接执行恶意代码而是通过依赖一个更新缓慢的低知名度 gem在下游加载时被触发。我们在分析一棵 gem 依赖树时发现App 引用的正常包依赖了一个可疑包可疑包又依赖了一个已被 yank 的高危包。单看任何一层都不明显但沿着依赖链排查到底层就暴露了。所以给 Ruby 项目做安全检查时建议使用bundle audit或商业 SCA 工具做全依赖树扫描不要只盯直接依赖。4.2 生产环境加固与应急响应速查处理完本次事件的恶意包清理后我们明显加大了对 RubyGems 使用环境的加固投入。写几个可以直接落地的措施适合任何维护 Ruby 项目的团队参考。第一固定版本并校验哈希。Gemfile 里不要只写gem devise, ~ 4.9至少要把精确版本号写明更稳妥的做法是在Gemfile.lock审计通过后把 gem 文件下载到私有源再分发。Rubygems 支持在.gemrc里配置私有源优先级但注意如果私有源里缺少某个依赖Bundler 仍会回落到公共源这正好是依赖混淆攻击的入口。source https://gems.example.com do gem internal-toolkit, 2.1.0 end第二开启告警与包变更监控。对 RubyGems 的新包做实时监控并不算难官方提供了基于 Atom 的公开活动订阅流配合 Lambda 函数可以做到分钟级采集。我们使用的事件监控方案是把 RubyGems 活动流接入日志平台按“新作者 高相似度包名 发布频率”三个条件组合出告警规则。上线以来误报率能控制在每天两三条人工确认成本很低。第三建立恶意包应急响应清单。建议团队内部准备一份“供应链投毒应急 SOP”核心步骤包括拉取疑似包到隔离环境做静态与动态检测检查 Gemfile.lock 中所有受影响依赖的版本与来源评估生产环境是否已经拉取过受影响 gem查容器镜像历史和宿主机包缓存轮换可能泄露的密钥与凭据尤其是 CI 环境里配置的各类 token在下游节点临时屏蔽可疑包名模式防止新发布的环境再次拉取按 RubyGems 的 yank 流程由管理员快速下架确认的恶意包。第四给 CI/CD 管道加一道“依赖准入”门槛。我们在 Jenkins 流水线里挂了一个脚本在bundle install后检查 Gemfile.lock 里的每一个直接依赖确认其homepage、source_code_uri指向真实存在的仓库并对包名与已知热门 gem 做相似度比对。超过阈值的依赖直接构建失败由安全团队人工确认后才能放行。这套流程从评估到落地大约花了两天时间投入产出比很高。4.3 对 AI 智能体攻击的几点预测复盘完 RubyGems 这次事件我自己有个比较强烈的感受AI 智能体集群做供应链攻击最可怕的不是单次攻击的破坏力而是它的“可扩展性”和“可进化性”。这次攻击的包数量在几百量级如果攻击者愿意完全可以把同样的流程扩展到 npm、PyPI、Maven 等所有主流包管理器而且可以同时跑多个“生产流水线”每小时产出成千上万个变体样本。传统依赖安全检测依据的是签名和已知恶意样本库面对这种大规模 AI 生成的变异样本会明显乏力。我觉得后续对抗的方向有两个。一个是在包管理器侧建立“行为信誉系统”类似邮件反垃圾的评分机制对新作者、新包、高发布频率等特征做动态评分分数低的包默认需要人工审核才能上线。另一个是通过运行时监控来兜底在应用的依赖加载层注入轻量审计记录require的文件路径和 hash当某个文件 hash 命中恶意样本库时立即中止加载并告警。这两个方向都能在现有生态里落地也是我们团队下一步计划在开源工具里尝试的功能。写在最后这次事件从头到尾复盘下来我最想提醒同行的是两句话。第一取证分析一定要克制尤其在面对“疑似 AI 攻击”这种自带流量的题目时证据没闭环之前不要急着对外下结论。第二供应链攻击的防守是系统工程不能指望某一次人工排查解决所有问题必须把“采集、分析、告警、阻断、复盘”做成自动化的闭环。最后再分享一个小细节我们在分析过程中发现恶意包的authors字段里写着 “OpenAI” 字样但并没有显著增加攻击成功率真正让开发者中招的还是包里那句加了--source的误导性安装命令。所以建议大家把野包的安装指引当成高危信号来看别因为某段文字看起来很专业就放松警惕。
RELATED

相关推荐

静态代码分析工具大盘点:从ESLint到SonarQube的实践指南

静态代码分析工具大盘点:从ESLint到SonarQube的实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/15 1:54:01
LangChain4J:Java生态的LLM集成利器与应用实践

LangChain4J:Java生态的LLM集成利器与应用实践

1. LangChain4J核心定位解析LangChain4J是专为Java开发者设计的开源库,旨在简化大型语言模型(LLM)在JVM生态中的集成应用。与Python生态的LangChain不同,它从底层设计就遵循Java语言习惯:类型安全、POJO对象、依赖注入等特性一应俱全。我在实…

📅 2026/9/15 1:54:01
Flutter与OpenHarmony手语学习App开发实践

Flutter与OpenHarmony手语学习App开发实践

1. 项目概述这个基于Flutter和OpenHarmony的手语学习App项目,通过游戏化设计提升学习趣味性。核心功能"限时挑战"采用60秒倒计时机制,包含开始界面、答题界面和结果界面三个状态流转。项目亮点在于将传统枯燥的手语学习转化为紧张刺激的挑战模…

📅 2026/9/15 1:54:01
MORE NEWS

更多资讯

📰

ArduPilot 硬件移植实战:PixPilot-C3 飞控板完整配置指南(STM32F427 双 IMU 架构)

ArduPilot 硬件移植实战:PixPilot-C3 飞控板完整配置指南(STM32F427 双 IMU 架构) 【免费下载链接】ardupilot ArduPlane, ArduCopter, ArduRover, ArduSub source 项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot 导读 …

📰

LCD1602显示进阶:DDRAM地址映射、光标定位与局部滚屏实战

我第一次用LCD1602调东西的时候,犯过一个特别蠢的错误——第二行数据显示在第14列之后的所有内容,全部跑到屏幕右边去了。当时以为是排线接触不良,换了一块屏,还是这样。查了半晚上才发现,不是我代码写错了&#xff0c…

📰

JSP+Servlet+JDBC学生管理系统:从登录到增删改查的JavaWeb实战解析

简介:一份基于JavaWeb的学生信息管理系统完整源码与数据库文件,适合Java初学者和高校学生用于课程设计或毕业设计参考,覆盖学生信息录入、查询、修改、删除等常见管理功能。压缩包共44个文件,约322KB,包含JSP动态页面、…

📰

Effect 平台在 Deno 上启用 HTTP 客户端:DenoHttpClient 与 fetch 架构解析

Effect 平台在 Deno 上启用 HTTP 客户端:DenoHttpClient 与 fetch 架构解析 【免费下载链接】effect Build production-ready applications in TypeScript 项目地址: https://gitcode.com/GitHub_Trending/ef/effect 导读 本文围绕 effect/platform-deno 包…

📰

NS2网络仿真环境搭建与trace文件解析实战指南

简介:本资源是一套面向网络仿真初学者与教学实践者的NS2代码学习包,聚焦TCP/IP协议模拟、路由算法实现、拥塞控制机制、移动性建模及OOPSI扩展开发等核心知识点,助力读者从零掌握NS2事件驱动模拟原理与Tcl/C协同编程方法。压缩包共28个文件&a…

📰

RubyGems遭遇AI智能体集群投毒:供应链攻击取证与防御复盘

最近我们团队在处理一批 RubyGems 上的异常包时,彻底体验了一把什么叫“AI 打供应链”。事情并不复杂:一夜之间,RubyGems 上冒出了几百个看起来高度相似、命名风格统一、发布频率极高的小型 gem 包。一开始我们以为是某个开发者误传了批量脚本…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬