「更加安全」的区块链为何频繁发生事故? 原文标题:《区块链安全和传统安全有什么不同》 撰文:卫剑钒 说起传统安全,很多朋友都比较熟悉,基本而言,就是针对漏洞(管理、技术、人性)的攻击,和针对攻击的防护。 但说起区块链安全,很多人就不太了解了。有人说区块链本身是安全的,传统攻击根本奈何不了它;但也经常看到区块链里的安全事件,似乎一点也不少。 那到底和传统安全有什么区别呢? 本文就是讲一讲这个。 1. 总体而言区块链在设计上大量采用密码学技术,在业务层、通信层、数据层均使用了加密、签名、Hash 等技术,再加上区块链的去中心化设计,使得区块链所承载业务的保密性、完整性、可用性,达到了史无前例的高度。 但从本质上讲,区块链仍然是一个软件系统,软件可能存在的安全问题,区块链一样有。 即便区块链在底层无懈可击,其上层运行的各种 Dapp、Web3 应用仍可能漏洞百出。 这就好比,地基做得再安全,也不能保障其上的建筑没有安全问题。 本文的结构:
2. 安全主要看什么?其实,安全说来说去,就三个东西,至今没有超越: 保密性、完整性、可用性。 这三性简称 CIA(三个英文单词的首字母缩写)。 即便有其他的说法,也都不在一个层次上,比如认证性、可控性、可审计性、防抵赖性等等,这些都是 CIA 的附属或延伸,都是为 CIA 服务的。 如何深刻理解 CIA? 熟悉 UNIX 的同学会比较容易理解一些,在 UNIX 的思维里,一切都是文件,而文件的安全,最终落实到读、写、执行(rwx)上。用户对某个文件的访问权限,就是是否可读、是否可写、是否可执行。这大体就对应了保密性、完整性、可用性。 保密性,就是不想让别人知道的就不让别人知道。 实现的思路无外这么几种:
完整性的概念不太好理解,最简单的理解就是,如果没有授权,对一个东西的任何部分都不能添加、减少、更改,如果非授权地做了这些,就破坏了完整性。 此外,完整性还有一个比较直观的含义:一致性。也即系统数据和真实世界一致,正如完整性的英文 integrity 本身有「诚实」含义一样,数据被篡改就肯定破坏了一致性。 可用性相对比较好理解,系统瘫了、慢了,数据不可用了,都是可用性出了问题。凡是系统提供的服务给人「用不成」、「没法用」、「不起作用」、「不好使」的感觉,那就是可用性出问题了。 信息系统,要保障的就是这三点。 而通常用来保障 CIA 的做法,就是认证、授权、访问控制、校验、加密、检测、备份、多活等等。当然,这些工作往往没有做好,会有各种各样的漏洞,一方面,发现了赶紧补上,另一方面,从源头做起,尽量减少漏洞的发生。 传统安全的主体差不多就是这些。 3. 传统安全的问题在哪里?如果你已经是安全圈的老手,可以跳过这一节。 安全漏洞有很多种,本文不会一一列举,只是简单举一些例子,让大家看看大致情况。 从最高层面上讲,漏洞的共同特点是:攻击者的行为,使得软硬件的行为,超出了系统设计者的预期,产生了负面的效果。 例 1:SQL 注入所谓 SQL 注入,就是在页面输入栏中或者在 URL 等处,黑客没有按照程序员预期的内容输入正常数据,而是在夹杂了 SQL 关键字,程序在处理输入数据时,用到了 SQL,并把输入内容作为 SQL 语句的参数。这样,SQL 语句可能就会执行黑客巧妙插入的 SQL 内容,使得黑客可以执行程序员预期外的数据库操作。 程序员应该多检查一下的,绝不能允许输入中含有这类攻击尝试,但大多数程序员并没有安全知识,即便有一点,也未必能做好,黑客就还有可能绕过。 黑客破坏了什么安全性质?黑客写入了系统预期外的数据,破坏了系统的完整性。黑客如果通过 SQL 语句还拖了库,就进一步破坏了系统的保密性。 程序什么地方没有做好?访问控制,就不该让什么数据都进来的。 例 2: 缓冲区溢出漏洞缓冲区是内存中存放数据的地方,通常都会有一个预设的大小。在将用户输入的数据放到内存中时,如果不做好检查,就可能超出内存预先设定的空间,发生缓冲区溢出。由于程序的运行代码也在内存中,如果黑客设计得足够精巧,就可以通过溢出覆盖掉原先的代码,使计算机最终执行了黑客的代码。 这和 SQL 注入有异曲同工之妙,黑客利用输入数据的机会,写入了可执行代码,而受害主机居然执行了它! 后来,为了抑制此类攻击,CPU 厂商提供了 DEP(Data execution protect)功能,在内存页标志了是否可执行,操作系统如果利用这个功能,就能在很大程度上防范此类攻击。此外,操作系统推出 ASLR 技术,通过对堆、栈、共享库映射等线性区布局的随机化,增加攻击者预测目的地址的难度。不过,使用这两项技术不代表攻击者就无法绕过。 黑客肆意乱写内存区,一样是破坏了系统的完整性。 程序则没有做好访问控制。 例 3:文件上传漏洞比如一个网站给了用户上传 jpg 照片的入口,由于未做检查,黑客成功上传了 JSP 文件,然后黑客找到该上传文件的 URL,就可以执行他写好的脚本,这个脚本完全可以是一个木马。 和前面一样,由于检查不严,让黑客钻了空子,写了设计者预期外的文件,运行了设计者预期外的程序。 程序的访问控制没有做好。 例 4: 中间人劫持漏洞劫持有很多种,比如 TCP 劫持、HTTP 劫持、DNS 劫持、证书劫持、密钥协商劫持等等。 共同的特点是,A 以为自己是在和 B 交互,B 以为自己在和 A 交互,但实际上,他们都是和中间的 C 在交互。A 和 B 的所有内容都经过了 C,C 看得见 A 和 B 通信的内容,C 还可以修改 A、B 间通信的内容。 这至少破坏了 A 和 B 通信的保密性,如果 C 还修改了数据,就破坏了完整性。 程序的认证没有做好。 例 5: 口令暴力破解如果用户口令比较弱,黑客尝试多次后,可能破解出口令并进入系统。 这种事,有人可能认为责任在用户,但一般而言,现代的应用系统都会对用户所设口令的强度进行强制要求。 因为黑客一旦得手,系统的完整性会遭到破坏(系统接受黑客就表明一致性失效),并可能造成进一步的破坏,比如黑客进入后看到了不该看的东西,保密性被破坏。 系统的认证没有做好。 例 6: 越权漏洞在某个网站里,用户 A 和 B 都是普通用户,按道理只能操作自己的个人信息,A 如果通过某种黑客手法,可以操作 B 的个人信息,这就是平行越权;如果 A 是普通用户,B 是管理员,A 如果能通过某种黑客方法,执行 B 才能做的操作,这就是垂直越权。 越权漏洞通常是权限校验逻辑不够严谨导致的。 程序的权限管理没有做好。 例 7: 高峰期网站瘫掉明星在网站官宣新闻,导致大量群众涌入围观,以至于该网站瘫掉或者响应很慢。 这是典型的系统可用性出现问题。 系统什么没有做好?可扩展性没有做好。 例 8: 自然灾害导致系统数据丢失2015 年,谷歌位于比利时的数据中心由于遭遇了 4 次闪电袭击,导致磁盘受损,虽然谷歌对这些磁盘进行了紧急修复,但部分数据仍然永久丢失了。谷歌特别强调,丢失的数据非常非常少,只占该数据中心的 0.000001%。即便如此,一些谷歌用户永远失去自己的部分个人数据。 这典型地破坏了数据的可用性。 系统的容灾备份没有做好。 4. 区块链解决了什么安全问题?区块链和传统系统的最大区别就是两点:一是使用了大量的密码技术,二是使用了去中心化的结构。 前者使得保密性和完整性大为增强,后者使得可用性大为增强。 先说一下密码技术使用带来的好处。 在早期的 WEB 世界里,比如在 IP 协议里,在 HTTP 中,在 FTP、TELNET 中,都不太使用密码学技术。因为当时互联网处于早期,主要目的是互联互通, |