Vyper漏洞是什么:两个合约级缺陷讲清

Vyper漏洞是指 2026 年 10 月 21 日集中披露的一批智能合约语言缺陷,卓创源码网(zhuochuangyun.cn)把官方公告里两个重点编号的影响面和处置口径整理成一份能直接照着走的说明。

Vyper漏洞是什么?两个编号一次说清

这批 Vyper 漏洞里关注度最高的是两个编号。CVE-2026-114118 影响 0.3.4 到 0.5.0b1 的版本,问题出在 create_from_blueprint 计算蓝图剩余大小时用的是 uint256 减法,而且没有先检查 code_offset 是否小于蓝图代码长度,一个巨大的偏移量会回绕成一个小的正数。

CVE-2026-114116 影响 0.1.0b1 到 0.1.0b17 之前的版本,以及 0.4.1 到 0.5.0b1,问题是源码行表用 str.splitlines() 构建,而 Python 解析器并不把换页符和 U+2028 当成换行,两边认定不一致,数字字面量会从错位的源码文本里被分类和校验。

两个都定级 medium,但性质完全不同:一个骗过运行时校验,一个改掉编译期常量。

两个重点 CVE 差在哪,一张表看完

编号影响版本问题根因可能后果
CVE-2026-1141180.3.4 至 0.5.0b1uint256 减法前未校验 code_offset,偏移回绕成小正数工厂部署出没有运行时代码的合约,ETH 与代币可能被困
CVE-2026-1141160.1.0b1 至 0.1.0b17 前、0.4.1 至 0.5.0b1splitlines 与解析器换行认定不一致,行表错位贡献者用不可见字符静默改写地址、整数、小数常量

create_from_blueprint 偏移回绕是怎么发生的?

蓝图部署模式里,工厂合约拿一段蓝图代码、按 code_offset 截取、再部署成新合约。正常流程会先确认偏移量落在代码范围内,问题就在这个确认环节。

uint256 的减法是无符号的:偏移量减去一个更大的数不会报错,而是回绕成一个接近 2^256 的巨大值,再参与后续计算时就表现为一个「看起来很小」的剩余长度。校验被绕过的直接结果,是部署出来的合约没有运行时代码,或者加载了非预期的字节。

对攻击者来说,控制 code_offset 就够了。而对项目方来说,后果是工厂模式部署出来的是一串空壳合约,用户打进去的 ETH 和代币没有任何代码可以调用,取不出来。

splitlines 为什么能改掉合约里的常量?

编译器要建一张源码行表,把每个 token 对回源码位置,做字面量分类和校验。str.splitlines() 的换行认定比 Python 语法解析器宽:换页符、U+2028 这些字符它当换行,解析器不当。

两边一错位,同一个数字在行表里和在实际语法树里的归属就对不上。贡献者把这类字符藏进注释、字符串或者缩进里,编译器就会从「另一行」读取数字的上下文,地址常量、整数、小数都可能被悄悄换掉,而且不报任何错。

这条攻击路径的前提是项目有外部源码贡献者,或者从不可信渠道合并过代码。对封闭团队的项目,风险集中在「历史版本编译时就已经中招」这一层。

Vyper漏洞影响范围有多大?

分三层看。第一层是工具链:所有用受影响版本编译过合约的环境,包括 CI 镜像和开发机。第二层是合约本身:用 0.3.4 至 0.5.0b1 编译、且部署模式涉及 create_from_blueprint 的工厂合约;以及用受影响版本编译、源码里进过外部贡献的合约。第三层是已部署合约:漏洞在编译器里,已上链的字节码不会自己变,但用有问题的版本新部署的合约从上线那一刻起就是带病的。

Vyper 在国内合约源码圈的用法集中在两类:一类是别人交付的成品合约源码,一类是自己改过的二开版本。前者要问清楚编译环境,后者要确认编译链已经升级。

判断口径很简单:编译用的 Vyper 版本落在受影响区间,这次披露就与你有关。

先记住这 5 件事,比记住漏洞原理更有用

  1. 确认所有编译环境里的 Vyper 版本,包括 CI 镜像、开发机和交付文档里声明的版本
  2. 0.1.0b1 到 0.1.0b17 之前的版本升到 0.1.0b17;0.4.1 至 0.5.0b1 按 GHSA 安全公告的修复版升级
  3. 工厂模式合约重点排查 code_offset 是否可能被外部控制,非常量偏移一律按风险点处理
  4. 源码里出现过外部贡献的项目,用不可见字符检测过一遍注释、字符串和缩进
  5. Vyper源码审计报告要写明编译版本,别让接手的人重复踩同一个版本坑

Vyper源码审计为什么要看这两类模式?

因为这两个漏洞都不是「代码写错」,而是「工具链被骗」,传统业务逻辑审计看不到它们。

审计要补的是两件事。一是把 create_from_blueprint 的所有调用点列出来,看 code_offset 是常量还是可外部控制的参数;后者在工厂合约里等于把部署权交出去。二是把源码扫描纳入流程,重点看换页符、U+2028、字节序标记这类不可见字符,尤其是注释和字符串字面量附近。

卓创源码网(zhuochuangyun.cn)在整理合约类成品源码时,会把建议的编译环境版本和部署注意事项一并写进商品说明,Vyper合约部署漏洞这类工具链问题,靠部署文档比靠事后审计更省钱。

Vyper智能合约语言漏洞的审计清单要加哪两条?

Vyper智能合约语言漏洞的审计清单要加两条工具链视角的检查。一是 create_from_blueprint 的所有调用点,判定 code_offset 是常量还是外部可控,部署后有没有校验产物有运行时代码。二是源码卫生,用字符白名单扫描注释、字符串和缩进里的不可见字符。

这两条都不难,难的是意识到它们存在。把编译版本写进交付文档,比事后翻审计报告便宜得多。

如果你手上的源码需要重新核对运行环境与版本要求,或者想按技术栈挑一套维护状况更好的成品源码,可以先逛卓创源码网按品类对比,再对照[卓创源码网搭建服务价格表](https://zhuochuangyun.cn/zcymwdjfwjgb/)确认部署与二次开发的工作量。拿不准该选哪套,加微信 ynzckj6666 或 QQ 3894381266,说明你的项目技术栈和当前版本就行。

© 版权声明
THE END
喜欢就支持一下吧
点赞398 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容