some tips about web3

Your development environment is very insecure

您的开发环境非常不安全

前提

  • 本文主要探讨开发环境安全,而不是生产环境安全。
  • 本文特别面向 web3 开发者,因为他们的开发环境可能存在更多敏感数据,特别是私钥。
  • 本文最后会给出一些简单的解决方案,但是最重要的是希望大家意识到你的开发环境非常不安全。

怎么不安全?

  • 当前正在运行的项目中依赖的 npm 包,可能会偷偷读取当前进程的环境变量,并将其上传至指定的服务器,整个过程是无感知的,不需要任何权限确认。
  • 当前正在运行的项目中依赖的 npm 包,可能会扫描你的硬盘,读取你硬盘上的文件,寻找譬如 .env 或者 .local.env 等类型的配置文件,并获取其中内容,上传至指定的服务器,只要扫描得当,整个过程是无感知的,不需要任何权限确认。
  • 系统中的其他程序或者进程,读取环境变量,扫描开发文件夹内的所有文件,寻找配置文件,读取内容,上传至指定的服务器。

为什么细思极恐?

在 web2 时代,出现在开发环境中的配置通常是开发环境的一些数据库配置,或者一些测试环境系统的秘钥配置之类的,这些信息通常在公网上不具备太大的使用价值,所以不会带来太大的安全问题。

但是在 web3 时代,或者其他和加密相关的开发领域,类似钱包私钥等信息,是用户非常核心的资产,掌握了一个钱包的私钥,基本上就掌控了这个账户的所有权限,其危害性还不止账户内的资产本身,还包括这个账户拥有 owner 权限的合约的安全。

另外,钱包地址和私钥是一对一绑定的,没有类似于普通账户中的恢复密码的机制,一旦秘钥泄露,你只能弃用这个钱包地址,而无法为其分配新的私钥。

使这个问题变得尤为突出的还有以下不良习惯:

  • 没有做钱包隔离,习惯在 testnet 和 mainnet 使用同一个账号进行测试,但是他们的私钥是一样的,泄露后直接影响 mainnet 的账户。
  • 没有私钥保护的意识,在本地环境中,直接使用主账户私钥,将其写入配置文件和环境变量。

即使你有比较良好的管理钱包和私钥的意识,仍然可能会出现问题:

  • 使用隔离环境执行正式环境的脚本,使用正式环境的私钥,但是无法防止当前执行的进程中依赖了恶意的 npm 程序包进来。