Coldcard 漏洞揭示:代码注释与变更比例低,开发者忽视编译器警告致风险
【一条提交信息揭示的 COLDCARD 近期漏洞】这是一篇来自知名 Core - Lightning 开发者 ddustin 的客座文章。他深入研究了 Coldcard 固件的提交历史揭示了事件的经过以及代码失败的原因。【引言】开始调查 Coldcard 黑客攻击事件时着实令人震惊下面为您解释原因。开发者处理代码时会将代码变更组织成“提交commit”的变更集目的是清晰展示代码变更历史包括内容、原因和方式这也是为应对比特币用户资金大规模被盗情况以便调查确切原因。优秀开发者会编写清晰提交信息伴随代码变更解释目的。编写时通常建议每次提交代表较小代码变更减少注释内容。开发者的好目标是提高提交信息与代码变更比例变更代码行数越多需更多注释解释原因“更多的信息”和“更少的代码变更”是不错做法。这里有个例子从自身工作随机选取提交信息 235 个字符变更 15 行代码比例约为 16。而 Coldcard 中引入低熵漏洞的提交信息仅 5 个字符“runs”变更 1534 行代码比例约为 0.003这是极其糟糕的注释与代码变更比例。虽然极少数情况下低注释比例合理但变更代码“最重要的部分”并非如此。涉及项目安全关键功能的代码需更高注释与变更比例且要严格审查。导致 Coldcard 弱熵问题的第二次提交信息仅 1 个字符“x”变更约 1000 行代码比例约为 0.001。【问题所在】在标题为“runs”的提交中比例约为 0.003他们似乎在导入并配置 C 代码让自定义 MicroPython 代码在所有 Coldcard 运行的 STM32 开发板上运行。STM32 是这类小型设备常用 CPU此类配置常见。在“runs”提交中硬件随机数生成器RNG被代码行禁用#define MICROPY_HW_ENABLE_RNG (0)这导致漏洞。将此值设为零会让默认 MicroPython RNG 代码不使用硬件 RNG 设备而用 Yasmarang RNG 代替。开发者添加内联注释“解释”变更// We have our own version of this code. Coldcard 版本的这段代码似乎参考了 rng.h 和 rng.c 中添加的函数。这些函数似乎是为覆盖 STM32 RNG 库的 pyb_rng_get_obj 函数但遇到问题。STM32 的 rng.c 文件已定义 pyb_rng_get_obj 变量并赋值同一个变量不能有两个定义还能编译通过。提交 37e4af5 添加自定义 rng.c 文件复制粘贴相同宏定义导致代码无法编译编译器报错“duplicate symbol pyb_rng_get_obj”。推测开发者沮丧中把 MICROPY_HW_ENABLE_RNG 设为 0解决了编译器错误。有时开发者无计可施会尝试随机方法设为 0 虽让编译器错误消失但“原因是错的”掩盖了两个冲突定义的编译器错误。将其设为零移除了使用硬件随机数生成器的代码产生副作用移除 pyb_rng_get_obj 第二个定义“修复”了编译器错误。编译器错误本提醒程序员重新考虑逻辑但开发者未这么做忽视并消除了警告。现在清楚了开发者试图覆盖变量遇到冲突定义面对“重复符号”错误随机修改代码让其“运行”。发现设为 0 能编译通过可能不知原因想出理论不需要那个因为有自己版本的代码。其对 pyb_rng_get 的定义完成不想运行的代码也关闭了。【令人困惑的调用链】Coldcard 的固件用 C 语言编写应用层用 Python 编写Python 代码调用 C 代码开发者覆盖了 pyb_rng_get 函数。但不幸的是其覆盖的函数并非 Coldcard v4.0.0 版本 Python 代码实际调用的函数该版本 Python 代码在 make_new_wallet() 函数中调用了 random.bytes()。将 MICROPY_HW_ENABLE_RNG 设为 0 关闭了 STM32 库提供的硬件代码允许开发者设置 pyb_rng_get_obj但 pyb_rng_get_obj 是 Python 可见的 pyb.rng() 可调用对象并非开发者在钱包函数中调用的内容。他们使用 random.bytes(32)跳过 pyb_rng_get 调用路径调用 rng_get。由于 MICROPY_HW_ENABLE_RNG 设为零rng_get 使用 MicroPython STM32 rng.c 的定义调用不安全的 Yasmarang 非硬件钱包熵。简单说固件变更覆盖了创建新钱包时未使用的函数因包含 Python 方法覆盖在所有情况下关闭硬件 RNG 使用转而用非常弱的随机数生成器。最后证据就是提交信息“runs”。开发者遇到这种情况应停下来无论报酬多少都不值得给他人带来潜在巨大破坏不要发布不理解的代码。【对 MicroPython 的反思】从核心看这似乎是多层复杂性的后果有 MicroPython 库、C 代码和 Python 应用之间的绑定还有 Coldcard 添加的新功能。打补丁的开发者是不是被迫编写和处理 C 代码的 Python 开发者呢MicroPython 给嵌入式开发者一种错觉认为无需了解 C 语言、CPU 或其他高级概念就能进行嵌入式编程这是谎言这场灾难就是相信这个谎言的后果。开发者必须理解发布的代码没有借口。层层误导会让理解更困难进行变更时要确保达到预期效果。这里的提交信息揭示了真相对代码“最关键的部分”缺乏谨慎和理解不可原谅。作为比特币开发者要花时间理解变更清晰记录并验证是否达预期效果。当人们生活受影响时不会也不应同情开发者开发者要意识到让资金面临的风险任务至关重要。希望整个行业从这次事件吸取教训开发者社区携手发布安全的代码。

相关新闻

ThinkPHP与Laravel双框架开发留守儿童心理辅导网站实践

ThinkPHP与Laravel双框架开发留守儿童心理辅导网站实践

1. 项目背景与核心需求这个留守儿童心理辅导网站项目采用ThinkPHP和Laravel双框架开发,主要面向农村地区的留守儿童群体。根据最新统计数据,我国留守儿童数量超过600万,其中约40%存在不同程度的心理问题。传统线下心理辅导存在地域限制、资源…

2026/10/7 22:21:19 阅读更多 →
Rocky Linux 8.5部署Jenkins CI/CD全流程指南

Rocky Linux 8.5部署Jenkins CI/CD全流程指南

1. 项目概述在当今DevOps实践中,持续集成与持续交付(CI/CD)已成为软件开发的标准配置。作为最流行的开源自动化服务器,Jenkins凭借其强大的插件生态和灵活性,在企业级CI/CD流水线中占据主导地位。本文将基于Rocky Linux 8.5这一企业级Linux发…

2026/10/10 20:40:04 阅读更多 →
VSCode + Cortex-Debug + OpenOCD:打造开源高效的STM32调试环境

VSCode + Cortex-Debug + OpenOCD:打造开源高效的STM32调试环境

1. 项目概述:为什么需要一套趁手的调试配置?如果你用STM32做过开发,大概率经历过这样的场景:代码在IDE里编译通过了,下载到板子上却死活没反应,或者运行到某个地方就卡死了。这时候,你需要的不是…

2026/10/13 16:08:14 阅读更多 →

最新新闻

数字电源控制器XDPP1100-Q024实战:从规格书到环路调参

数字电源控制器XDPP1100-Q024实战:从规格书到环路调参

简介:英飞凌XDPP1100-Q024中文版规格书手册是一份面向电源设计工程师、嵌入式开发及服务器/工业电源系统设计人员的技术文档。手册详细解析该芯片基于ARM Cortex-M0的100MHz处理器、64kB OTP、32kB RAM与80kB ROM配置,覆盖双电压轨控制、高速电压/电流检…

2026/10/15 8:23:32 阅读更多 →
7款有效降低AI生成文本检测率的工具评测

7款有效降低AI生成文本检测率的工具评测

1. 项目背景与核心需求去年帮学生改论文时发现一个现象:超过60%的作业被检测工具判定为"AI生成",导致不少学生被误伤。这促使我开始系统性测试市面上宣称能"降低AI率"的工具。经过三个月实测10款主流产品,最终筛选出7款真…

2026/10/15 8:23:32 阅读更多 →
电力基建工程管理系统:SSM+JSP架构设计与实践

电力基建工程管理系统:SSM+JSP架构设计与实践

1. 电力基建工程管理系统的行业背景与需求分析电力行业作为国民经济的基础性产业,其基建工程管理具有典型的资金密集、技术密集和风险密集特征。传统管理模式普遍存在以下痛点:纸质审批流程平均耗时长达15-20个工作日,工程进度跟踪依赖人工周…

2026/10/15 8:23:32 阅读更多 →
易语言取屏幕分辨率与设置分辨率:API调用与避坑指南

易语言取屏幕分辨率与设置分辨率:API调用与避坑指南

1. 屏幕分辨率操作的核心价值与场景拆解屏幕分辨率这个东西,平时用电脑的人基本不会去碰它,系统装好是什么就是什么。但一旦你开始做桌面工具、自动化脚本、或者给客户交付一套定制软件,分辨率就变成了一个绕不开的硬需求。比如你写了一个全屏…

2026/10/15 8:23:32 阅读更多 →
Ubuntu 16.04编译UE4.26.2实战指南:Clang9与Python3.7适配方案

Ubuntu 16.04编译UE4.26.2实战指南:Clang9与Python3.7适配方案

1. 项目概述:为什么在Ubuntu 16.04上编译UE4.26.2仍值得深挖虚幻引擎4(Unreal Engine 4)的Linux支持长期处于“可用但需谨慎”的状态——官方文档明确标注Ubuntu 18.04为推荐系统,而Ubuntu 16.04早在2021年4月就结束了标准支持周期…

2026/10/15 8:23:32 阅读更多 →
幼儿园国际象棋比赛全攻略:从赛事设计到教学实操的完整指南

幼儿园国际象棋比赛全攻略:从赛事设计到教学实操的完整指南

1. 一场幼儿园棋赛背后,藏着多少被低估的教育设计第一次看到“幼儿园办国际象棋比赛”这个事,我脑子里冒出来的第一个念头是:三四岁的孩子坐得住吗?棋子会不会被当成积木搭着玩?但仔细看完整个活动的组织逻辑之后&…

2026/10/15 8:22:31 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/14 7:53:34 阅读更多 →