《余弦:区块链黑暗森林自救手册》(一)

375 阅读30分钟

引子

在区块链黑暗森林世界里,首先牢记以下两大安全法则:

  • 零信任。始终保持怀疑的态度,不论任何情况下。
  • 持续验证。首先必须有能力去验证自己所怀疑的点,并把这种能力养成习惯。

image.png

从流程上包括三大部分:创建钱包、备份钱包及使用钱包

创建钱包

钱包从应用分类来说主要包括几种:
    PC 钱包、浏览器扩展钱包、移动端钱包、硬件钱包及网页钱包等。

从触网与否来说主要可以分为:
    冷钱包和热钱包。

Download

关键是找到正确的官网,避免下载到假的钱包。

途径有这些:

若是PC钱包,根据官网提供的下载链接,下载后需要自己去安装。但在安装之前,建议做下是否篡改的校验工作,虽然这个做法并无法防止源头就被完全篡改的情况(比如官方自己内部 作恶、内部被黑、官网被入侵替换了相关信息等等),但可以防止如:源头被部分篡改、被中间人劫持篡改等这些情况。

是否篡改的校验,实际上就是文件一致性校验。常见的方式有两种:

  • 一种是哈希校验,比如 MD5、SHA256 等,MD5 绝大多数情况下够用,但存在被哈希碰 撞的极小风险,所以业内一般选择SHA256,够用且够安全。
  • 另一种是GPG签名校验,这个其实也很流行,强烈建议掌握 GPG 工具、命令、方法。

如果是硬件钱包,简单来说,可以从官网源头的引导下购买,不要直接去在线商城,到手后也需要留意是否存在被异动手脚的情况,当然有些针对硬件包装的异动是很高明的,不一定都能看得出。此时建议:无论如何,使用时,先连续至少三次从头开始的创建,记录下生成的助记词、相关 钱包地址,不会重复就行。

如果是网页钱包,非常不建议使用这种在线的钱包。

Mnumoric Phrase

业内流行的助记词长度一般是12位,也有比较长的如24位,不过一般不会超过24位,毕竟助记词是用来帮助人类记忆的。

扩展:助记词

助记词代表长度为128到256位的熵。
然后使用熵通过使用密钥扩展函数PBKDF2来导出更长(512位)的种子。
然后,所产生的种子用于构建确定性钱包并获得其密钥。

密钥扩展功能有两个参数:助记词和盐(salt)。
密钥扩展功能中的盐的目的是使得难以构建能够进行暴力攻击的查找表。
在BIP-39标准中,salt具有另一个目的——它允许引入密码短语作为保护种子的额外安全因子。

扩展:GPG入门教程

GPG入门教程 - 阮一峰的网络日志 (ruanyifeng.com) 详细讲解参考:助记词的生成原理

Keyless

Keyless,顾名思义是无私钥的意思。在这我们把 Keyless 分为两大场景:

  • Custodial,即托管方式。比如中心化交易所、钱包,用户只需注册账号,并不拥有私钥, 安全性完全依托于这些中心化平台。
  • Non-Custodial,即非托管方式。用户唯一掌握类似私钥的权力,但却不是直接的加密货 币私钥(或助记词)。

至于 MPC 为主的 Keyless 方案是作者觉得很有前景且应该尽快普及的,优势有这些:

  • MPC算法工程实践在这些知名区块链上,越来越成熟,只需针对私钥开展即可。
  • 一套思路可以解决不同区块链的多签方案差异巨大的问题,使其在用户感知上通用,这是 我们常说的:通用多签。
  • 可以确保真实的私钥从不出现,通过多方计算解决单点风险。(也就是MPC的特性,输入数据是严格保密的。)
  • 结合知名 Cloud(或有人提的 Web2)让 MPC不仅安全,而且使用顺滑。

拓展:MPC与区块链的关系

多方安全计算(Secure Multi-Party Computation,简称MPC)。

简单的说,虽然区块链和多方安全计算都是一群人按照特定规则(协议)进行交互,但区块链主要是为了共同对完成的计算的正确性进行验证,从而实现对结果的一致认可并防止结果的记录被篡改。
而多方安全计算(MPC)的目的是为了在对输入保密的情况下,得到计算结果。
区块链重在可验证的计算,强调的是计算的可验证性,这一过程中并不考虑输入数据的保密性。
而MPC强调的是计算过程中对于输入数据的保密性。但是MPC并不能确保数据是可验证的。

主要区别:

① 规则的安全性和可靠性假设不同。 区块链是容忍一定量的串通的恶意节点的,MPC只要有任何节点的错误(不一定是恶意),计算就没法发生。

② 规则的实现机制不一样, 在区块链里节点通过共识协议达成共识,而在MPC里节点通过隐私计算协议完成加密运算。大多数共识协议是通过冗余执行实现的,各个节点看到了相同的信息。而隐私计算的核心思想是不让其他节点看到保密信息

③ 规则的目的不一样, 区块链的目的是实现计算的可验证性,让大家一致证明交易的确发生了。而MPC的目的是确保在计算过程中对输入数据的保密性,在不暴露明文的前提下完成某种运算。

④ 规则的触发事件也不一样, 区块链的触发事件是矿工通过挖矿新产生了一个数据块,交易本身不需要保密(大部分区块链的可验证性都来源于所有验证节点能够看到交易的明文);而MPC的触发事件是很多人将自己的私有数据加密后作为输入,这些输入数据都对自身以外的其他任何人保密。

总结来说,区块链和MPC在应用中发挥的作用不同。两者并不排斥,而是可以综合使用的。区块链可以通过采用MPC技术来提升自身的数据保密的能力,以适应更多的应用场景。MPC可以借助区块链技术实现冗余计算,从而获得可验证的特性。

参考:多方安全计算(MPC)与区块链

备份钱包

这里有很多厉害的人在这里踩坑,包括作者。

助记词/私钥类型

我们所说的备份钱包,其实归根结底是备份助记词(或私钥,为了方便介绍,后文一般情况下只提助记词)。我们拿到的助记词其实可以主要分为几种类型:

  • 明文
  • 带密码
  • 多签
  • Shamir's Secret Sharing,简称 SSS

明文,顾名思义,就是以明文的方式呈现的助记词。一旦被拿到,那就哦豁。

带密码,助记词带上密码后会得到不一样的种子,这个种子就是之后拿来派生出一系列私钥、公钥及对应地址。此时,你不仅要备份好助记词,这个密码也千万别忘记了。顺便说下,带密码的形式,除了配套助记词,私钥也有相关标准(如 BIP38),还有如以太坊系列常见的Keystore文件。

多签,可以理解为目标资金需要多个人签名授权才可以使用,多签很灵活,可以设置审批策略,比如 3 个人都有钥匙(助记词或私钥),需要满足至少 2 人的签名审批,目标资金才可以使用。每个区块链都会有自己的多签解决方案,比特币系列的很好理解,知名的比特币钱包都原生支持多签。不过以太坊系列的,主要通过智能合约来实现多签,如Gnosis Safe。另外,除了这些比较普遍的多签方案,还有一类正在流行的:MPC(Secure Multi-Party Computation),即安全多方计算,和传统多签体验接近,但原理却很不一样,通过MPC,可以实现通用多签,并不需要不同链不同的多签方式。具体参考我上述的拓展。

SSS,Shamir 秘密共享方案,作用就是将种子分割为多个分片(常见的每个分片有 20个单词),恢复钱包时,需要使用指定数量的分片才能恢复。

扩展:以太坊的keystore文件

以太坊的 keystore 文件(Linux 系统存储在 ~/.ethereum/keystore 或者 Windows 系统存储在 C:\Users\Appdata/Roaming/Ethereum/keystore)是你独有的、用于签署交易的以太坊私钥的加密文件。如果你丢失了这个文件,你就丢失了私钥,意味着你失去了签署交易的能力,意味着你的资金被永久的锁定在了你的账户里。

当然,你可以直接把你的以太坊私钥存储在一个加密文件里,但是这样你的私钥容易受到攻击,攻击者简单的读取你的文件、用你的私钥签署交易,把钱转到他们的账户中。你的币会在你意识到发生什么了之前的短时间内丢失。

这就是以太坊keystore文件被创建的原因:它允许你以加密的方式存储密钥。这是安全性(一个攻击者需要 keystore 文件和你的密码才能盗取你的资金)和可用性(你只需要keystore文件和密码就能用你的钱了)两者之间完美的权衡。 为了让你发送一些以太币,大多数的以太坊客户端会让你输入密码(与创建账户时密码相同)以解密你的以太坊私钥。一旦解密,客户端程序就得到私钥签署交易,允许你移动资金。

参考文章:什么是以太坊私钥储存(Keystore)文件?

拓展:Gonosis Safe

Gnosis Safe 是一个DAO上的去中心化资产管理平台灵活,安全的资产管理工具。

Gnosis Safe 钱包设置了一个安全的资金管理标准,可以持有多种资产类型以及 NFT,支持离线签名,硬件账本,并允许用户配置所有者和所需签名的数量。

目前 Gnosis Safe 支持多条公链,包括 ETH,Polygon,BSC,XDAI ,AVAX 等。

Encryption

在我们备份钱包时,每个环节都要假设可能会被入侵,哪怕是物理环境,提防一些心理上的“我认为这是绝对安全的”。例如保险箱。

备份时一定要考虑备灾,主要就是避免单点风险。

备份位置的几个基本形态:

  • Cloud
  • Paper
  • Device
  • Brain

许多人谈云备份色变,似乎黑客真的就上天入地,来无影去无踪的。其实攻防对抗永远都是成本对抗,看谁投入的大,无论是人才还是钱。对于我来说,我会比较信任 Google、Apple、微软等提供的相关云端服务,因为我知道他们的安全团队是如何实力,安全投入是如何之大。但除了对抗外部黑客入侵,我还很关心内部安全风控的能力及隐私数据保护有关的约束力。我比较信任 的几个,都算是把这些我在意的安全风险规避得不错的。但凡事绝无绝对。如果我选择这些云来备份我非常重要的数据(如钱包),我一定还会给钱包再做至少一次加密的。

Paper,就是摘抄到纸上。

Device,就是各种设备,电子设备是其中一种。例如,电脑,ipad,iPhone,U盘,移动硬盘等。比较让作者有安全感的是AirDrop,USB这类比较少有中间人劫持的情况。

Brain,记脑子里。

使用钱包

OK,正式进入这个黑森林。

AML

AML(Anti Money Laundering)即反洗钱风控。也就是说你此刻持有的加密货币可能是不干净的,甚至如果足够倒霉,还可能存在被直接在链上冻结的情况。

我们现在经常听到的加密货币冻结实际上绝大多数并不是发生在链上的,而是发生在中心化平台里,如中心化交易所(Binance、Coinbase 等)。你的加密货币在这些中心化平台里,意味着你并不是真正意义上持有这些加密货币,中心化平台冻结的其实是你的账号,尤其是你的交易、提币权限。 冻结这个概念其实很容易对圈外人造成误解,于是出现一些很烂的自媒体胡乱解读及散播比特币的各种阴谋论。

虽然你的比特币、以太坊等不会在链上被冻结,但如果你的这些加密货币本身就涉及到相关执法单位在处理的案件,一旦你的加密货币转移进中心化平台,这些中心化平台就有可能因为 AML 等要求将你的加密货币冻结。

为了比较好地避免 AML 问题,需要选择口碑好的平台、个人等作为你的交易对手。不瞎搞的话基本问题不大。如果要深度地解决这些问题实际上也是有不少办法的,比如以太坊系列上,几乎所有坏人及特别在意隐私的人都会选择 Tornado Cash 进行混币。

Cold Wallet

冷钱包本身是不联网的,如果仅仅是接收加密货币,那么配合一个观察钱包,如imToken、Trust Wallet等都可以直接添加钱包地址,成为目标钱包地址对应冷钱包的观察钱包。

如果冷钱包要发送加密货币,常见的方式有几种:

  • QRCode
  • USB
  • Bluetooth

这几种都需要专门的应用(这里称之:Light App)搭配冷钱包使用,这个Light App 是联网的,包括前面提到的观察钱包。我们只需明白其中本质原理就会明白这些方式了。

本质是:最终只需想办法把签名后的内容广播上链

大概解析下过程:

  • 待签名的内容由 Light App 通过这些方式传输给冷钱包。
  • 签名由拥有私钥的冷钱包搞定后再通过这些方式传输回 Light App。
  • Light App 将签名后的内容广播上链。 所以这里无论是二维码(QRCode)、USB、还是蓝牙(Bluetooth)等方式,用途就是如上所说。

当然不同的方式会有不同的细节,比如二维码信息容量是有限的,遇到签名数据很大的时候就得拆分。 这样使用似乎麻烦了点,不过习惯了就好,甚至满满安全感。

但是,言归正传,这里还是有风险的,已经许多案例是因为这些风险而导致损失惨重。风险点如:

  • 转币的目标地址没严格检查,导致币转给了其他人。人都是有惯性或惰性的,比如很多时候检查一个钱包地址主要就看开头、结尾几位是不是正确的,而没有几乎完整检查。于是坏人就激动了,专门用程序来跑出头尾几位一样的地址,然后通过一些手法把你的转币目标地址给替换为他控制的地址。
  • 授权相关币种给了未知地址,通常来说授权是以太坊系列智能合约代币的机制,就是那个approve函数,一个参数是授权给目标地址,另一个参数是数量。许多人不了解这个机制,20于是就可能把无限数量的代币授权给目标地址,此时目标地址就有权限把这些代币转走了。这就是所谓的授权盗币。
  • 一些看去不重要的签名,实际上藏着巨大的陷阱。
  • 冷钱包可能并没给你足够的必要信息展示,导致你大意了、误判了。

这一切都可以归结为两点:

  • 所见即所签这种用户交互安全机制缺失。
  • 用户的有关知识背景缺失。

Hot Wallet

冷钱包的风险热钱包也会有,但热钱包多了个“助记词”。此时的热钱包要考虑的安全就多了,比如运行环境的安全,如果运行环境有相关病毒,那么就有被盗风险。还有热钱包如果存在某些漏洞,通过漏洞也可以直接盗走助记词。

热钱包除了常规的转币功能外,如果要与那些 DApp(DeFi、NFT、GameFi 等)交互,要么直接用自带的浏览器访问,要么通过 WalletConnect 协议与PC浏览器打开的DApp交互。

从作者的安全审计及安全研究历史数据来看,存在钱包助记词被目标页面恶意 JavaScript 直接盗取的风险。但这个情况比较罕见,因为这实际上属于极其低级的错误,知名钱包都不大可能会犯这种错误。

在这里,作者比较关心的问题就是,在每次知名钱包的迭代过程中,是怎么做到不会被植入恶意代码或者后门?毕竟不可能每一次迭代都要去验证一次。

这里的恶意代码或后门所造成的盗币事件已经有好几起了,比如曾经的CoPay,近期的AToken等。

这种情况的作恶方式主要有以下几种:

  • 钱包运行时,恶意代码将相关助记词直接打包上传到黑客控制的服务端里。
  • 钱包运行时,当用户发起转账,在钱包后台偷偷替换目标地址及金额等信息,此时用户很难察觉。
  • 破坏助记词生成有关的随机数熵值,让这些助记词比较容易被破解。

安全这东西,无知者无畏、知者敬畏,许多点是细思恐极的。所以对于存有重要资产的钱包,我的安全原则也简单:不做轻易更新,够用就好。谨记。

DeFi安全到底是什么

业内几乎都只看智能合约部分,似乎智能合约安全了也就没事了。其实远远并非如此。

DeFi 安全至少包括如下几部分:

  • 智能合约安全
  • 区块链基础安全
  • 前端安全
  • 通信安全
  • 人性安全
  • 金融安全
  • 合规安全

智能合约安全

对于高级玩家来说,如果智能合约部分本身安全性可控(无论是自己能安全审计还是读懂专业 机构的安全审计报告),那么也就无所谓其他部分的安全了。可控是个很有差异的理解,有的得看玩家实力。比如说智能合约权限过大的风险,玩家是有要求的,除非项目方本身实力雄厚及口碑良 好,完全中心化也都无所谓。但对于那些不大知名的、有争议的或新出现的项目,如果你说这个项 目的智能合约有权限过大的风险,尤其是这种权限还可以影响你的本金或收益,你肯定就不愿意了。

权限过大这种风险是很微妙的,很多时候权限这东西是方便项目方做相关治理及风险应急的。但对我们来说,这就是人性考量了,万一项目方作恶呢?于是业内有了折中的实践:增加时间锁 (Timelock)来解决一些权限过大的风险,比如:

Compound,这个老牌知名的 DeFi 项目,它核心的智能合约模块 Comptroller 及 Governance 的 admin 权限都加了 Timelock 机制: Comptroller(0x3d9819210a31b4961b30ef54be2aed79b9c9cd3b) Governance(0xc0da02939e1441f497fd74f78ce7decb17b66529) 的 admin 地址是: Timelock(0x6d903f6003cca6255d85cca4d3b5e5146dc33925)

链上可以直接看到 Timelock 的时间锁(delay 参数)是 48小时(172800秒)。

image.png

也就是说,如果 Compound 的 admin(项目方)需要变更目标智能合约的一些关键值时, 这笔交易上链后会有记录,但必须等到 48 小时后才可以最终完成执行。这意味着,只要你愿意,你是可以审计admin 的每一次操作,你至少有48小时来反应。比如如果你不放心,你可以在 48 小时内把资金撤走。

还有一种削弱项目方权限过大风险的做法是:将 admin 多签了,比如用 Gnosis Safe 进行多签管理,这样至少不会出现一言堂。这里需要注意的是,多签可以是“皇帝的新衣”,比如一个人掌握了多把钥匙。所以目标项目的多签策略需要公示说明清楚,钥匙都由谁保管,保管钥匙的角色也一定是有口碑的。

这里需要特别注意,任何安全策略,都可能出现“皇帝的新衣”问题,表面做得好,实际上却不是,呈现出了一种虚假安全感。再举个例子,Timelock 这玩意,看去似乎挺好,实际上出现过有的项目方部署的Timelock是有后门的情况。用户一般也不会直接去看Timelock源码,而且也不一定看得懂,于是放了个后门在那,一时半会还真不一定有人留意到。

除了权限过大风险,智能合约安全的其他内容也都很关键,但理解门槛还是挺高的,这里就不展开了,我的建议是这样:至少可以逐步学会阅读安全审计报告,熟能生巧

区块链基础安全

区块链基础安全指的是区块链本身的安全性,如:共识账本安全、虚拟机安全等。如果区块链本身安全性堪忧,其上运行的智能合约项目也可以直接喝西北风了。选择一条拥有足够安全及知名 度的区块链,甚至大概率可以源远流长的区块链是多么的重要。

前端安全

这里请注意,,前端安全非常容易被忽视。作者用了“前端安全是魔鬼”这样的形容,足以说明威胁程度有多高。

前端安全里我最在意的点是:我怎么知道我在这个前端页面里的交互对象就是我以为的智能合约?造成这种不安全感主要是因为以下这两种风险:

  • 内部作恶
  • 第三方作恶

内部作恶很好理解,比如开发人员偷偷将前端页面里的目标智能合约地址替换为一个有后门的合约地址,或者直接植入个授权钓鱼脚本。当你访问该前端页面时,你钱包后续的一系列涉及加密货币的操作都可能是在陷阱里完成的。神不知鬼不觉,币没了。

第三方作恶,主要指的是两种:

  • 一种是供应链作恶,比如前端依赖的第三方模块被植入了后门,随着打包发布一起被直接带入目标前端页面了。如 SushiSwap(仅仅举例子,并不代表截图里的项目有发生这个问题): image.png

  • 一种是前端页面引入的第三方远程 JavaScript 文件,如果这个 JavaScript 文件作恶或被 黑,那么目标前端页面可能就会被影响,如 OpenSea(仅仅举例子,并不代表截图里的项目有发生这个问题): image.png

为什么这里说可能会被影响是因为,如果项目方在前端页面以下面这样的方式来引用第三方远程 JavaScript 文件的话,就可能不会被影响: image.png 这里的关键点是 HTML5 的一个不错的安全机制:标签里的 integrity 属性(SRI 机制), integrity 支持 sha256, sha384, sha512,如果第三方 JavaScript 资源不满足 integrity 的哈希完 整性校验,就不会加载,这个可以很好防止非预期的代码执行。但使用这个机制需要目标资源支持 CORS 响应。具体参考:子资源完整性 - Web 安全 | MDN (mozilla.org)

通信安全

通信安全这部分,重点看 HTTPS 安全就好。首先目标网站一定要 HTTPS,绝不允许存在 HTTP 明文传输的情况。因为 HTTP 明文传输实在太容易被中间人劫持攻击了,现在 HTTPS 这 种安全传输协议已经非常普遍。如果 HTTPS 出现中间人劫持攻击,比如植入了恶意 JavaScript 代码到目标前端页面,此时浏览器必然会出现 HTTPS 证书错误的高显目提醒。举个例子,曾经 MyEtherWallet 的坑。

MyEtherWallet 曾经是个很流行的网页钱包,现在也挺知名,不过已经不仅仅是网页钱包了。 我前面有说过,网页钱包我非常不建议使用,除了前端安全的各种猫腻之外,还可能出现 HTTPS 劫持的风险。

2018.4.24,MyEtherWallet 就出现过 HTTPS 劫持的重大安全事件,回顾可见:

www.reddit.com/r/MyEtherWa… poofing_of/ www.reddit.com/r/ethereum/… _on_google/

当时黑客是通过 BGP 这个上古协议劫持了 MyEtherWallet 大量用户所用的 DNS 服务 (Google Public DNS),这导致许多用户访问 MyEtherWallet 时,浏览器出现 HTTPS 错误证 书的提醒。其实吧,遇到错误证书了,原则上就别继续访问了,因为这表示目标页面已经被劫持了。 但是真的许多用户不懂这个安全风险,顶多犹豫下就忽略错误证书的提醒继续强制访问了。

由于目标页面已经被劫持,黑客注入了恶意 JavaScript 代码,直接就盗走了目标用户在目标 页面上的明文私钥,之后批量转走这些用户相关的加密货币(主要是 ETH)。

这绝对是个经典案例,黑客为了盗币,动用了 BGP 劫持,真是杀鸡用了牛刀。之后也出现过 几起类似的案例,这里就不提了。这里对于用户来说实际上只需要注意一点,当你真的要用网页钱 包或玩相关 DApp 时,一定要注意:当目标页面出现 HTTPS 错误证书提醒时,就立即停止继续 访问、关闭页面,那么你什么事都不会有。

安全上有个残酷现实,是这样的:当已经出现风险时,就别给用户选择,一旦给了,总会有用 户无论出于何种原因会掉坑里。其实这里项目方是需要肩负起相关责任的,比如这个 HTTPS劫持,其实现有的解决方案已经很安全了,项目方的开发人员只需配置好 HSTS 即可。HSTS 全称 HTTP Strict Transport Security,是浏览器支持的一个 Web 安全策略,如果开启了这个配置,浏 览器发现 HTTPS 证书错误后就会强制不让用户继续访问。

拓展:BGP劫持的原理以及防御

参考链接:

(2条消息) BGP劫持的原理及防御详解_bgp攻击

BGP劫持:是指攻击者恶意改变互联网流量的路由。攻击者通过错误地宣布他们实际上并不拥有、控制或路由的IP地址(称为IP前缀)的所有权来实现这一点。

通俗易懂一点,就像有人在高速路上改变路的标志,将后续的车辆引入了一条并不正确的道路。

BGP协议是什么

参考链接:

BGP是什么?BGP是如何工作的? - 华为 (huawei.com)

边界网关协议(Border Gateway Protocol,BGP)是一种用来在路由选择域之间交换网络层可达性信息(Network Layer Reachability Information,NLRI)的路由选择协议。由于不同的管理机构分别控制着他们各自的路由选择域,因此,路由选择域经常被称为自治系统AS(Autonomous System)。现在的Internet是一个由多个自治系统相互连接构成的大网络,BGP作为事实上的Internet外部路由协议标准,被广泛应用于ISP(Internet Service Provider)之间。

人性安全

金融安全

金融安全是个很需要敬畏的概念,放在 DeFi 上,涉及到金融的点,用户最关心的是币价、年化收益,一定要好,至少要稳。简而言之是,我作为用户,我玩这个DeFi,我要赚钱。如果亏了,得让我心服口服。嗯,这也是人性。这部分可能出现诟病的有:

  • 不公平启动,比如预挖、老鼠仓。
  • 巨鲸攻击,所谓的钞能力。
  • 黑庄,看谁跑得快。
  • 市场黑天鹅,比如突然的大瀑布,还有如目标 DeFi 与其他 DeFi/Token 套娃或互操作, 这个时候木桶短板可能就决定于其他 DeFi/Token 了。
  • 还有一些比较技术性的或者说科学家手法,比如抢跑、三明治攻击、闪电贷攻击等。

合规安全

合规安全是个非常大的话题,前面提到的 AML(Anti Money Laundering) 只是其中一点,还有如KYC(Know Your Customer)、制裁地区限制、证券风险有关的内容等等。其实对于用户来说,这些不是我们可以对抗的,只能说当玩一个项目时,目标项目可能会受到某些国家的安全监管,因 此可能会出现我们在意的隐私信息采集的问题。你可能不在意这点隐私,但却有在意的人。

比如,2022年初出现的一件小事:钱包支持Address Ownership Proof Protocol(AOPP) 协议。当时我看了下 AOPP 的协议设计,原来支持了AOPP的钱包可能泄露用户隐私:监管机构会有能力知道一个被监管的交易所和一个不知道的外部钱包之间的关联。参考链接:Address Ownership Proof Protocol / Address Ownership Proof Protocol · GitLab

你认为一件小的隐私安全事件,可能对某些人来说是大事。

NFT安全

NFT安全在Defi安全以外,有自己独特的安全点。

  • Metadata安全
  • 签名安全

Metadata:图片,动图等内容,关于 Metadata 的具体标准建议可以参考 OpenSea 出的: docs.opensea.io/docs/metada…

这里可能带来的安全问题主要有两点:

  • 一个是图片(或动图)所在的URI是不可信的,比如随便的中心化服务,一方面不稳定, 另一方面项目方随便改图片都行,那么NFT的数字藏品能力也就没了。一般都会用IPFS、 Arweave这些去中心化存储,并且用知名的URI网关服务。
  • 另一个问题是可能造成隐私泄露,随便的URI是可以采集用户的基本隐私的(如 IP、 User-Agent 等)

拓展:URI,URL,URN

参考链接:

URI(标识、定位任何资源的字符串)_百度百科 (baidu.com)

统一资源定位符(Uniform Resource Locator,URL),统一资源名称(Uniform Resource Name,URN)是URI的子集。

Web上地址的基本形式是URI,它有两种形式:

一种是URL,这是目前URI的最普遍形式。

另一种就是URN,这是URL的一种更新形式,URN不依赖于位置,并且有可能减少失效连接的个数。但是其流行还需假以时日,因为它需要更精密软件的支持。

小心签名

签名安全是我特别需要提的,因为签名协议坑很多,已经发生了数起安全事件,尤其围绕 NFT 的。但我注意到其实太多人还是无法很好应对这部分安全问题,究其原因在于很少有人把这部分安全问题讲明白。

签名安全里首要遵守的最大安全原则是:所见即所签。即你看到的内容就是你预期要签名的内容,当你签名发出去后,结果就应该是你预期的,绝不是事后拍断大腿的。

签名安全有关的一些内容在“Cold Wallet”部分有提到,印象不深的建议回顾下,这里重点讲讲不一样的内容。 OpenSea 在 2022 年前后出现过数起用户持有的知名 NFT 被盗事件,尤其是 2022.2.20 集中爆发,根本原因在于:

  • 用户在 OpenSea 授权了 NFT(挂单)。
  • 黑客钓鱼拿到用户的相关签名。

这个相关签名要拿到其实不难,黑客需构造正确的待签名内容,哈希后,诱骗目标用户完成签 名(这里是盲签,也就是说用户实际上不知道自己到底签名的内容是什么),黑客拿到签名后的内 容,构造利用数据,完成利用。

当目标用户在NFT市场里授权了相关NFT挂单后,攻击者构造了正确的待签名内容,通过Keccak256哈希后,在钓鱼页面上弹出了待签名的内容给用户,此时用户看到的东西如下:

image.png

仔细看,MetaMask弹出的这个窗口,能看出什么?账户及余额、签名请求的来源网站、正 在签名的消息,没了...就这点内容,用户怎么会想到自己一旦点击了“签名”后,灾难就来了,自己的相关 NFT 就可以被盗走了。

这其实就是一种盲签,用户并不需要在 NFT 市场里签名,可以被诱骗在任何网站(钓鱼网站)上签名,而用户根本就不知道这些签名的实际意义,可惜的是黑客知道。对于用户来说,只需牢记:拒绝盲签。OpenSea 之前存在盲签情况,2022.2.20 后改进了,采用 EIP-712 进行了升级改进。 但即使不是盲签,还是有用户会粗心大意。

拓展:钓鱼攻击

参考链接:红蓝对抗之邮件钓鱼攻击 - 博客 - 腾讯安全应急响应中心 (tencent.com)