节点可能容易受到恶意 SOCKS 服务器的缓冲区溢出攻击。修复程序于 2017 年 11 月 6 日在比特币核心版本 0.15.1 中发布。
技术细节
CVE-2017-18350 是一个缓冲区溢出漏洞,它允许恶意 SOCKS 代理服务器在具有签名 char
类型的系统(包括常见的 32 位和 64 位 x86 PC)上覆盖程序堆栈。
该漏洞是在 60a87bce873 (SOCKS5 支持) 中引入的,并于 2012 年 8 月 27 日在比特币核心 v0.7.0rc1 中首次发布。修复程序隐藏在 d90a00eabed (“改进和记录 SOCKS 代码”) 中,并于 2017 年 11 月 6 日在 v0.15.1 中发布。
要受到攻击,节点首先必须配置为使用此类恶意代理。请注意,通过不安全网络(如互联网)使用任何代理都可能存在漏洞,因为连接可能被拦截用于此目的。
在节点发出连接请求后,恶意代理将以不同的目标域名响应确认信息,而不是请求的域名。通常,此确认信息将被完全忽略,但如果长度使用高位(即长度 128-255 包含在内),则易受攻击的版本会将其解释为负数。当负数传递给 recv() 系统调用以读取域名时,它会被转换回无符号/正数,但大小会更大(通常为 32 位),导致实际上无限地读取到 256 字节的虚拟堆栈缓冲区之外。
为了修复此漏洞,虚拟缓冲区被更改为显式无符号数据类型,避免了向负数的转换。
归属
感谢 practicalswift 发现并提供了该漏洞的初始修复程序,以及 Wladimir J. van der Laan 为该修复程序的伪装版本以及对有风险代码的一般清理做出的贡献。
时间线
- 2012-04-01:漏洞在 PR #1141 中引入。
- 2012-05-08:漏洞合并到 master git 仓库。
- 2012-08-27:漏洞在 v0.7.0rc1 中发布。
- 2012-09-17:漏洞在 v0.7.0 中发布。
- …
- 2017-09-21:practicalswift 向安全团队披露漏洞。
- 2017-09-23:Wladimir 打开 PR #11397 悄悄修复漏洞。
- 2017-09-27:修复合并到 master git 仓库。
- 2017-10-18:修复合并到 0.15 git 仓库。
- 2017-11-04:修复在 v0.15.1rc1 中发布。
- 2017-11-09:修复在 v0.15.1 中发布。
- …
- 2019-06-22:漏洞存在情况向 bitcoin-dev ML 公开。
- 2019-11-08:漏洞细节向 bitcoin-dev ML 公开。