原文标题:《区块链安全和传统安全有哪些不同》
撰文:卫剑钒
说起传统安全,不少朋友都比较熟知,基本而言,就是针对漏洞(管理、技术、人性)的攻击,和针对攻击的防护。
但说起区块链安全,不少人就不太知道了。有人说区块链本身是安全的,传统攻击根本奈何不了它;但也常常看到区块链里的安全事件,好像一点也不少。
那到底和传统安全的不同之处呢?
本文就是讲一讲这个。
1. 总体而言
区块链在设计上很多使用密码学技术,在业务层、通信层、数据层均用了加密、签名、Hash 等技术,再加上区块链的去中心化设计,使得区块链所承载业务的保密性、完整性、可用性,达到了史无前例的高度。
但从本质上讲,区块链仍然是一个软件系统,软件可能存在的安全问题,区块链一样有。
即使区块链在底层无懈可击,其上层运行的各种 Dapp、Web3 应用仍可能漏洞百出。
这就好比,地基做得再安全,也不可以保障其上的建筑没安全问题。
本文的结构:
安全主要看什么?
传统安全的问题主要在哪儿?
区块链,解决了什么安全问题?没解决什么?
2. 安全主要看什么?
其实,安全说来讲去,就三个东西,到今天没超越:
保密性、完整性、可用性。
这三性简称 CIA(三个英文单词的首字母缩写)。
即使有其他的说法,也都不在一个层次上,譬如认证性、可控性、可审计性、防抵赖性等等,这类都是 CIA 的附属或延伸,都是为 CIA 服务的。
怎么样深刻理解 CIA?
熟知 UNIX 的同掌握很容易理解一些,在 UNIX 的思维里,所有都是文件,而文件的安全,最后落实到读、写、实行(rwx)上。用户对某个文件的访问权限,就是是不是可读、是不是可写、是不是可实行。这大体就对应了保密性、完整性、可用性。
保密性,就是不想让其他人了解的就不让其他人了解。
达成的思路无外这么几种:
不记录,不留任何书面记录,只留在脑海里,且不露声色。
锁起来,无论是物理性还是技术性的锁,达成对访问者的访问控制,被授权者才能访问。
藏起来,只让授权者了解在哪儿,别的人不了解在哪儿,隐写术也可以归到此类中。
加密,用编码(code)或者密码(cipher)的方法,有密码本或者密钥才能访问。
完整性的定义不太好理解,最容易的理解就是,假如没授权,对一个东西的任何部分都不可以添加、降低、更改,假如非授权地做了这类,就破坏了完整性。
除此之外,完整性还有一个比较直观的意思:一致性。也即系统数据和真实世界一致,正如完整性的英文 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: 自然灾害致使系统数据丢失
2022 年,Google坐落于比利时的数据中心因为遭遇了 4 次闪电袭击,致使磁盘受损,虽然Google对这类磁盘进行了紧急修复,但部分数据仍然永久丢失了。Google特别强调,丢失的数据很很少,只占该数据中心的 0.000001%。即使这样,一些Google用户永远失去我们的部分个人数据。
这典型地破坏了数据的可用性。
系统的容灾备份没做好。
4. 区块链解决了什么安全问题?
区块链和传统系统的最大不同就是两点:一是用了很多的密码技术,二是用了去中心化的结构。
前者使得保密性和完整性大为增强,后者使得可用性大为增强。
先说一下密码技术用带来有哪些好处。
在早期的 WEB 世界里,譬如在 IP 协议里,在 HTTP 中,在 FTP、TELNET 中,都不太用密码学技术。由于当时网络处于早期,主要为了互联互通,而且主要在高校和科研机构之间用,并没太多精力和心思去考虑恶意攻击。技术员在这类方面一直心思纯净的,总以为其他人都是可以信赖的,一直认为无人「那样无聊」。
后来他们才发现,现实世界充满了攻击、破坏、仿冒和入侵,技术员们不能不引入各种安全技术,密码学也被因此被引入,SSL、SSH、HTTPS、IPSec 这类新一代的互联网协议纷纷出现。
但这类大都处于传输层,主如果给传输数据加密的,并没上升到业务层面或用户层面,最后用户并不可以感觉到密码学有哪些好处。啥是用户层面的加密?举例:office 文档的口令加密、winrar 加密、truecrypt 全盘加密、网上银行中的 U 盾等等。
而区块链在设计的刚开始,就内置了的加密算法,这使得:
1、区块通过 hash 链接起来,从第一个区块,直到最后一个区块,所有区块是不是正确,都可以比较容易地验证,这保证了所有区块数据的完整性。
2、伪造区块的 hash 并困难,只有符合特定困难程度的 hash,才会被认同,伪造如此的 hash,需要付出很多的计算,和挖矿相匹敌的算力。
3、每一个用户有一个私钥,用私钥对应的公钥生成一个可以公开的地址。攻击者没办法通过暴力破解的办法获得私钥。
4、因为用户体系是打造在公钥体制之上的,对用户的认证、用户的签名,对称密钥的打造(假如需要)都变得极为容易和便利。
5、区块中的每一个买卖,都要提供签名才能完成。攻击者没私钥,没办法签名,没办法伪造买卖;同时,有了签名,用户没办法抵赖自己发出过的买卖。
可以看到,区块链对 hash 和公钥体制的内置使用,直接提供了密码学级别的完整性、保密性。
而密码学技术,经过近一个世纪的进步,已经打造起相当坚实的基础,现代密码学的一些公开算法提供着全球顶尖级别的安全保障。这类算法中的佼佼者,现在没任何国家力量可以破解(即使有一些后门传闻,都还仅限于传闻之中,没明确的证据表明传闻属实)。
然后看看去中心化有哪些好处:
1、多一个节点,多一个备份。
以BTC为例,全球接近 10000 个节点提供服务,致使BTC系统自诞生以来,一直稳定地运行,其他人都未能让它停摆。由于即使有 8000 个节点同时失效,还有 2000 个在工作。事实上,即使全网只有几个节点工作,这个互联网就仍然可以运转。
2、部分变节,仍可工作。
系统的稳健性并不打造在某个操作系统或某种数据库的安全之上,而是打造在其独特的区块式数据结构之上,部分节点即使失陷,即使故意作恶,也不影响大局。具体能容忍多少个失陷变节,要看具体的共识算法。
3、不依靠于某人或机构
只须你想,下载一份软件(代码都是开源的),你就能加入BTC或ETH或任何一个公链,你不需要征求其他人建议,也不会由于其他人的失踪和退出而担忧这个软件的前途,你只不过依据你的判断、你的兴趣和你的利益运行它,也就是说,没单人、单机构可以控制它。
去中心化,大大增强了可用性。
5. 区块链没办法解决什么安全问题?
从最基本的逻辑讲,区块链只不过大大提高了安全性,但并不可以确保没问题。
大家已经在区块链安全经典案例「922 亿个BTC」和「The DAO 失窃」中看到:
BTC由于技术员未能注意到整数溢出的问题,闹了大笑话,说好的总量 2100 万个BTC,居然在某个买卖中出现了 1845 亿个BTC!
构建在ETH之上的 The DAO,因为开发者对重入攻击一无所知,致使用户众筹而来的 300 多万ETH让人盗走,落得尴尬结束。
这至少告诉大家两点:
1、作为区块链本身,虽然在设计上用了很多密码学算法,但假如设计或编码不慎,就或许会有大漏洞。
2、即使区块链本身经过千锤百炼,提供了被人完全放心的安全,其上的智能合约也不可以保证安全。
由于智能合约代码中的逻辑,假如和需要、设计、编码的预期不符,就会出问题。
这和传统安全没任何不同。
除此之外,还有一点很重要:
3、区块链所用的密码学技术,可能本身也有漏洞。
毕竟,密码学也是人搞出来的。
只须是人做出来的东西,就总会有漏洞。