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/8/6 13:43:52 阅读更多 →
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/8/5 22:08:33 阅读更多 →
VSCode + Cortex-Debug + OpenOCD:打造开源高效的STM32调试环境

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

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

2026/8/6 17:44:31 阅读更多 →

最新新闻

Element UI弹窗全屏化实战:从原理到避坑的完整解决方案

Element UI弹窗全屏化实战:从原理到避坑的完整解决方案

1. 项目缘起:一个看似简单却暗藏玄机的需求 最近在重构一个后台管理系统时,遇到了一个产品经理提出的“小需求”:希望某个数据量巨大的报表预览弹窗能支持全屏查看,方便用户更专注地分析数据。这个需求听起来合情合理,…

2026/8/7 14:59:13 阅读更多 →
LunaTranslator终极指南:5步掌握视觉小说翻译神器

LunaTranslator终极指南:5步掌握视觉小说翻译神器

LunaTranslator终极指南:5步掌握视觉小说翻译神器 【免费下载链接】LunaTranslator 视觉小说翻译器 / Visual Novel Translator 项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator 想要轻松玩转日系视觉小说却苦于语言障碍?LunaT…

2026/8/7 14:59:13 阅读更多 →
Ryujinx Switch模拟器终极使用指南:从零开始到完美体验的5个关键步骤

Ryujinx Switch模拟器终极使用指南:从零开始到完美体验的5个关键步骤

Ryujinx Switch模拟器终极使用指南:从零开始到完美体验的5个关键步骤 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx是一款基于C#开发的开源Nintendo Switch模拟器…

2026/8/7 14:59:13 阅读更多 →
Sunshine游戏串流服务器:5分钟打造你的私人云游戏平台,让游戏无处不在!

Sunshine游戏串流服务器:5分钟打造你的私人云游戏平台,让游戏无处不在!

Sunshine游戏串流服务器:5分钟打造你的私人云游戏平台,让游戏无处不在! 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否曾梦想过在客厅电…

2026/8/7 14:59:13 阅读更多 →
如何快速掌握Arduino ESP32开发:专业入门手册

如何快速掌握Arduino ESP32开发:专业入门手册

如何快速掌握Arduino ESP32开发:专业入门手册 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 Arduino ESP32核心库是连接Arduino生态与Espressif ESP32系列芯片…

2026/8/7 14:59:13 阅读更多 →
Self Searcher免费版:本地文件快速检索工具详解

Self Searcher免费版:本地文件快速检索工具详解

1. 项目概述:Self Searcher工具的核心价值 Self Searcher是一款专注于本地文件内容检索的轻量化工具,其免费版本在个人用户和小型团队中广受欢迎。与系统自带的搜索功能相比,它通过建立索引数据库的方式实现了毫秒级的响应速度,特…

2026/8/7 14:58:12 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →