加密货币短地址攻击快速指南

加密货币中的短地址攻击
数字屏幕上显示的代码以红色突出显示“数据泄露”和“网络攻击”字样。 

你听说过短地址攻击吗?这是以太坊智能合约中一个值得注意的漏洞,攻击者可以利用不同长度地址的处理差异。 

为了提供更深入的见解,本文将探讨短地址攻击的机制、其影响以及关键的预防策略。通过揭穿误解并提供缓解此类攻击的见解,我们旨在为普通用户和专家提供全面的概述。

另请阅读:哪种加密货币最安全?

关键精华

  • 短地址攻击利用加密货币钱包中的智能合约漏洞,将资金发送到简短、相似的地址,诱骗用户犯错。
  • 由于某些钱包界面缺乏检查,如果用户意外地将加密货币发送到这些误导性地址,则可能会损失资金。
  • 缓解策略包括使用地址验证工具并确保钱包软件是最新的。

什么是短地址攻击?

以太坊作为一个去中心化平台,支持通过 Solidity 编程语言执行智能合约。同样,Solidity 对地址长度有严格的限制,要求地址长度必须正好为 20 字节(40 个十六进制字符)。

这确保了智能合约交易中地址处理的一致性和安全性。然而,短地址攻击是一种漏洞,攻击者通过忽略编码字符串的尾部字符来利用地址编码算法。 

通过创建与合法地址前缀匹配的编码字符串,攻击者诱骗用户使用攻击者控制的地址发送资金或进行操作。 

虽然以太坊地址通常为 20 个字节,但如果攻击者使用短于 20 个字节的地址,Solidity 会自动用零填充右侧剩余的字节,以保持正确的地址长度。 

例如,如果一个函数需要两个参数——例如地址和代币数量——合约可能会因为这种自动填充而无意地将第二个参数的一部分(代币数量)解释为第一个参数(地址)的一部分。这种错误解释使得攻击者能够发送比原计划更多的代币。

本质上,这种类型的攻击通常利用人为错误,因为用户可能不会仔细检查钱包地址中的每个字符,因为地址太复杂了。因此,攻击者会利用这一点,创建与真实地址几乎相同,但略微缩短或修改的地址。

获取 UPay 加密卡

体验最佳的在线支付和无缝加密交易。

注册

短地址攻击示例

考虑下面的用于将代币从发送者的帐户转移到另一个帐户的 Solidity 代码:

函数传输(地址_to,uint256_value)公共{

    需要(_to.length == 20);

    _to.transfer(_value);

}

此合约函数旨在将指定金额转移到指定地址。为了验证提供的地址是否为有效的 20 字节值,合约使用“length”属性检查地址的长度。 

然而,依赖“length”属性来验证地址并不可靠,因为它返回的是字节数,而不是位数。这会导致短地址攻击,攻击者可以提供一个短于 20 字节的地址,但由于其长度等于或超过 20 字节,因此仍然看起来有效。

为了说明短地址攻击如何发生,请考虑以下 Solidity 代码:

函数传输(地址_to,uint256_value)公共{

    需要(_to.length == 20);

    _to.transfer(_value);

}

函数 testAttack() 公共 {

    地址短地址 = 0x01;

    uint256值=100;

    转移(短地址,值);

}

在这种情况下,transfer函数与上一个示例中使用的函数相同。但是,合约还包含一个“testAttack”函数,该函数使用短地址和值100调用transfer函数。 

由于 transfer 函数使用 'length' 属性来验证地址,它错误地认为提供的地址是一个有效的 20 字节地址,并继续执行传输操作。然而,由于该地址实际上短于 20 字节,因此传输将失败,并且值不会被传输。

短地址攻击如何运作?

ERC20 标准规定,“transfer”函数需要两个参数:一个接收方地址和一个表示待转账代币数量的“uint256”值。短地址攻击是指攻击者提供的输入比合约预期的输入更短。

这会导致接收合约误解数据,因为字段可能对齐错误。由于某些对交易数据进行编码的第三方应用程序可能无法正确处理填充或执行正确的长度验证,合约可能会处理格式不正确的交易,从而导致意外行为。

以下是该过程的简化分解:

地址操纵

攻击者提供的是合法钱包地址的缩写版本。在某些情况下,攻击者可能会使用工具或恶意软件在交易过程中自动填充或显示错误的地址。

例如,攻击者向转账函数发送一笔短地址为0x123456、金额为 1000 的交易。

填充

以太坊客户端在短地址中添加零,以将其扩展至所需的 20 个字节。这种填充会导致交易中后续参数错位,从而导致智能合约误解交易数据。

例如,以太坊客户端将0x123456填充为0x1234560000000000000000000000000000000000。这会改变预期的 1000 金额参数,导致合约错误地解释数据。

人为错误

发起交易的用户没有注意到钱包地址不完整或不正确。这种情况经常发生,因为地址很长,而用户认为复制粘贴就一定准确。

参见  加密卡用户的 5 个安全提示

资金转账

用户将加密货币发送到缩短或错误的地址。由于区块链交易不可逆,资金会丢失或被发送到攻击者的地址。

2022 年年中,一位知名的加密货币网红公开透露计划转账 250 个以太币(当时价值约 500,000 万美元),这是短地址攻击中最引人注目的案例之一。攻击者监控了这位网红的交易记录,并将收款人钱包地址的缩写替换到了交易字段中。

这位网红误以为地址准确,在不知情的情况下将资金转入了攻击者的地址。尽管迅速尝试撤销交易,但区块链的不可逆性最终导致了永久性的损失。

这一事件凸显了验证钱包地址的重要性,尤其是在处理大笔资金或进行公开交易时。

但是请注意,从Solidity 0.5.0 版本开始,编译器引入了运行时检查,以确保调用数据的大小对于静态大小的参数而言符合预期长度,或者至少达到动态大小参数所需的最小长度。这些检查有助于防范诸如短地址攻击之类的操纵技术,攻击者可能会试图利用数据长度差异。

此外,它还确保了合同执行期间的数据一致性。

“区块链是一项非常有趣的技术,未来几年将为社会带来一些非常深远的应用。”——肯尼斯·格里芬

获取 UPay 加密卡

体验最佳的在线支付和无缝加密交易。

注册

短地址攻击的影响

短地址攻击可能不像网络钓鱼或诈骗那样普遍,但其影响却很重大,尤其是在高价值交易中。

此外,由于短地址攻击依赖于微妙的操作,它们通常可以绕过标准安全检查,这对于不熟悉验证交易每个细节的用户来说尤其危险。

大多数短地址攻击都发生在去中心化金融(DeFi)平台和缺乏严格验证措施的钱包服务上。这些平台尤其容易受到攻击,原因在于其点对点交易的特性,以及缺乏可以验证钱包地址准确性的中介机构。

Chainanalysis报道,2022 年第一季度,黑客从交易所、平台和私人实体窃取了 1.3 亿美元,其中很大一部分损失对 DeFi 行业造成了不成比例的影响。

 图表显示了 2015 年至 2022 年期间按受害者类型划分的盗窃总数和被盗价值。

此外,请注意,虽然任何人都可能成为受害者,但大多数受害者通常属于新手或缺乏经验的加密货币用户。钱包地址的复杂性以及对交易协议的不熟悉增加了他们易受攻击的可能性。

“即使是一些规模较大的加密货币公司,也可能缺乏足够完善的网络防御措施来抵御黑客攻击。加密货币行业发展如此迅速,因此很难跟上这种防御措施也就不足为奇了。”——卢克·威尔莫特 (Luke Willmott),加密汽车交易平台 AutoCoinCars 联合创始人兼首席运营官

如何检测短地址攻击漏洞

检测短地址攻击漏洞需要多层次的方法,包括全面的代码审查、自动化工具和增强的安全实践。以下是一些在智能合约中检测此类漏洞的方法:

代码审计和形式验证

检测短地址漏洞最有效的方法之一是通过手动代码审计和形式化验证流程。具有智能合约安全经验的审计人员可以识别合约在地址处理方面的潜在弱点。 

形式验证使用数学模型来证明合约在所有情况下都按预期运行,包括涉及格式错误或缩短的地址的情况。

自动化安全工具

有几种自动化工具旨在检测智能合约中的漏洞,包括那些容易受到短地址攻击的漏洞。一些流行的工具包括:

  • 神话X:这是一个以太坊智能合约安全分析工具,有助于识别潜在的漏洞,包括短地址问题。
  • 保护:一种审计工具,可对智能合约执行自动安全检查并标记与地址格式相关的问题。
  • Remix IDE 插件:以太坊开发人员可以使用带有安全插件的 Remix IDE 来自动标记易受攻击的代码。

这些工具分析合约的逻辑并突出显示任何可能通过短地址攻击利用的不安全做法。

代码中的长度验证

智能合约开发者必须实现地址长度验证,以确保所有地址在处理交易之前长度均为 20 个字节。具体做法是明确检查地址参数的长度,并拒绝地址过短或格式错误的交易。

例如,在 Solidity 中,开发人员可以使用以下函数来验证地址:

函数 isValidAddress(address _addr) public pure 返回 (bool) {

    返回 _addr != 地址(0)&& _addr == 地址(uint160(_addr));

}

这个简单的检查确保在处理交易之前地址长度是正确的,从而防止潜在的短地址攻击。

测试网模拟和渗透测试

在以太坊主网上部署智能合约之前,开发者应该进行测试网模拟和渗透测试,以识别潜在的漏洞。这些测试模拟了真实的攻击场景,可以揭示开发过程中可能难以察觉的问题。 

参见  虚拟加密卡用户的 KYC 流程

通过在测试网上模拟短地址攻击,开发人员可以评估他们的合约是否正确处理地址格式并确保安全交易。

另请阅读:加密货币安全漏洞统计数据:趋势与洞察

如何防止短地址攻击

一张数码图像,显示一只手在笔记本电脑上打字,屏幕上显示一把挂锁

预防短地址攻击需要技术解决方案和用户意识的双重保障。以下几种有效策略有助于降低遭受此类攻击的可能性:

输入验证

在用户界面或链下组件中使用强大的输入验证机制,以验证地址是否符合预期的长度和格式。例如,许多加密钱包现在提供地址验证工具,可在交易进行前自动验证完整地址。 

这些工具可确保用户无法将资金发送到不完整的或错误的地址。例如, Tokenview是一款广泛使用的加密钱包地址检查工具,它简化了跨多个区块链验证钱包地址的过程。

它使用户能够确认地址的真实性,同时还提供持有的代币、交易历史和其他相关详细信息。

用户教育

由于许多短地址攻击都利用了人为错误,因此对用户进行教育至关重要。加密货币交易所和钱包提供商可以通过教导用户如何验证地址,并鼓励他们在发送资金前仔细检查交易来降低风险。 

简单的步骤,例如将完整地址复制粘贴到记事本中以手动验证,可以防止许多攻击。

校验和机制 

校验和是从原始数据派生出的一串数字和字母,可用于检测错误。请确认所有地址均为有效的校验和以太坊地址。 

实施校验和有助于验证它们是否符合以太坊地址格式,从而最大限度地降低短地址操纵的风险。

审计与测试

定期对智能合约进行审计和全面测试可以发现安全漏洞。因此,结合使用自动审计工具和手动代码审查,可以有效防止此类攻击。

获取 UPay 加密卡

体验最佳的在线支付和无缝加密交易。

注册

正式验证 

形式化验证是指从数学角度证明智能合约的正确性。通过这种方式可以保证输入参数的正确处理,从而防止短地址攻击。

Solidity SMTChecker就是一个形式化验证工具的例子。当它集成到 Solidity 编译器中时,会使用形式化方法来检测逻辑错误。

安全数学库

使用像OpenZeppelin 的 SafeMath这样的安全数学库可以加强对短地址攻击的防御。这些库提供的函数在执行数学运算时内置了安全检查,确保在发生溢出或下溢时触发错误。

其他常见的智能合约漏洞

一张数码图像,显示一名黑客,背景中有代码。

智能合约的一个关键优势在于,它允许我们验证底层软件及其操作,而无需信任服务提供商。

然而,智能合约的存在也吸引了那些试图利用潜在漏洞的人。隐藏在幕后的人正在寻找机会利用代码中的弱点。

近年来,由于智能合约漏洞,数十亿美元的加密货币损失惨重。例如,2022年8月,总部位于美国的加密货币公司Nomad报告称,由于Nomad代币桥遭到黑客攻击,导致价值1.9亿美元的加密货币被盗。

这凸显了加强安全措施的迫切需要。让我们快速浏览一下您应该注意的其他一些智能合约漏洞:

整数上溢/下溢

整数上溢和下溢是 Solidity 智能合约中常见的问题,当算术运算超出数据类型可存储的最大值或最小值时,就会出现这种情况。这些问题会影响“uint”和“int”数据类型,可能导致意外行为或资产损失。 

例如,如果合约为每个整数使用 32 位内存,则它只能存储 [0, 2,147,483,647] 范围内的值。如果算术运算的结果超过 2,147,483,647,变量将自动回绕为 0,这可能会导致严重问题。

弱手币证明(PoWHC)攻击就是一个例子。PoWHC 是一个基于以太坊、使用 Solidity 语言构建的庞氏骗局,由 4chan 论坛上的一个团体创建。在这个案例中,智能合约的编写者未能考虑到下溢和溢出的情况,导致合约中 866 个以太币被未经授权地提取。

推荐

使用 Solidity 中的 SafeMath 库来防止整数溢出和下溢。该库提供了执行算术运算的函数,可以自动验证这些条件,并在检测到溢出或下溢时抛出异常。

重入攻击

重入漏洞是 Solidity 智能合约中的一个安全漏洞,攻击者可以利用该漏洞反复调用合约中的函数,从而可能导致资金或资产被盗。当攻击者在初始执行完成之前多次调用合约函数时,就会发生此漏洞,从而操纵合约状态并盗用代币。

重入攻击是恶意黑客常用的攻击手段,在 2023 年上半年,60 起因漏洞导致的黑客攻击事件中有 5 起是重攻击,造成总计 850 万美元的损失。一个值得注意的例子发生在 2016 年 6 月,当时此类攻击导致“DAO”的资金被盗,促使以太坊开发者对区块链进行分叉。

参见  虚拟加密卡的最佳安全功能

推荐

为了减少这种漏洞,一个有效的解决方案是利用 OpenZeppelin 的 ERC20 实现提供的“nonReentrant”修饰符。 

需要注意的是,由于只有一个“nonReentrant”保护,因此标有此修饰符的函数无法直接相互调用。不过,可以通过将这些函数设为私有函数,并提供标记为“nonReentrant”的外部入口点来规避此限制。

为了缓解重入攻击,另一个有效的策略是实施“检查-影响-交互”模式。此方法首先验证输入和条件,然后更新状态变量,最后与外部合约进行交互。 

通过确保在发生任何外部交互之前完成所有状态修改,该模式可以有效地防止重入漏洞。

错误的数据存储

智能合约开发中经常出现的一个错误是使用未优化的内存数据存储,这会导致交易 Gas 成本增加。内存在合约执行期间充当变量的临时存储区域,并在每次函数调用后被清除。

推荐

对于只需要读取值的函数,建议使用 calldata。Calldata 是一个只读存储区域,用于保存传递给合约的函数参数,从而优化 gas 成本并确保输入参数的不变性。

批准漏洞

批准漏洞是 ERC20 代币合约中发现的一个安全漏洞,用户授权第三方合约代表其转移无限数量的代币。这使得已批准的合约无需额外授权即可将代币从用户账户转移到任何其他账户。

这种设置的问题在于,它允许已批准的合约随时转移代币,即使用户撤销批准或合约受到攻击。因此,攻击者可以利用此漏洞,控制已批准的合约,并从用户账户向自己的账户执行未经授权的代币转移。

推荐

为了降低批准漏洞的风险,ERC20 代币合约应设计允许机制,以限制已批准合约可以代表用户转移的代币数量。这可以通过设置最大允许额度或实施在指定期限后到期的限时允许额度来实现。

此外,开发人员可以通过要求用户确认每次令牌传输或采用多因素身份验证来验证令牌传输来增强安全性。

获取 UPay 加密卡

体验最佳的在线支付和无缝加密交易。

注册

跨功能状态依赖

跨函数状态依赖漏洞类似于重入漏洞,发生在两个函数依赖于同一个合约状态时。如果一个函数在执行过程中被调用,则可能导致意外结果。 

此外,当同时调用这两个函数时,也会出现这个问题,从而导致潜在的竞争条件,威胁智能合约的完整性。

推荐

为了降低此漏洞的风险,建议采取与解决类似竞争条件相同的预防措施。具体来说,确保所有状态变更在任何以太币转移之前完成。 

通过遵循这种方法,智能合约将在启动任何以太交易之前完成所有必要的状态修改。

“没有追索权。它无法修复。你无法撤销区块链交易。”——加密货币企业家 Alx Finn 

结论:短地址攻击预防的未来

短地址攻击通常会导致巨额损失,因此备受关注。随着加密货币和区块链技术的发展,用户和平台都必须时刻警惕此类攻击。

用户教育、技术改进和平台改进相结合,可以显著降低此类攻击发生的可能性。通过提高认知度并鼓励最佳实践,加密货币社区可以为所有用户创造一个更安全的环境。

最终,防御短地址攻击的最佳方法是谨慎行事。用户必须花时间验证每笔交易,平台也必须实施先进的安全措施,以防范不断演变的威胁。 

随着加密领域的成熟,这些努力对于维护信任和保护数字资产免受欺诈攻击至关重要。

常见问题

加密货币中的短地址攻击是什么?

当恶意行为者利用加密货币交易中的缩短或缩写地址,导致用户将资金发送给非预期的收件人时,就会发生短地址攻击。 

短地址攻击是如何发生的?

这些攻击通常利用钱包界面只显示长地址的一部分。如果用户复制一个缩短的地址并发送资金,他们可能会无意中将加密货币发送到以相似字符开头的其他地址,从而导致资金损失。

我该如何保护自己免受短地址攻击?

为避免短地址攻击,请务必在发送加密货币之前验证完整地址。请使用显示完整地址的可信钱包,并考虑使用二维码或地址确认功能来确保准确性。

短地址攻击常见吗?

虽然短地址攻击不像其他类型的攻击那样普遍,但它仍然可能发生,尤其是在缺乏经验的用户中。提高安全意识并正确使用钱包可以显著降低遭受此类攻击的风险。

免责声明:本文仅供参考,不构成任何交易或投资建议。本文内容不构成任何财务、法律或税务建议。交易或投资加密货币存在相当大的财务损失风险。在做出任何交易或投资决定之前,请务必进行尽职调查。

订阅我们的新闻推送

加入我们的社区,订阅我们的新闻通讯,随时了解最新资讯、更新和独家优惠。请在下方输入您的电子邮件地址,即可直接在您的收件箱中接收我们的每月新闻通讯。

弹出图像

体验加密货币在线支付的最佳体验

UPay 提供主流加密货币支付方式。使用我们的加密货币卡,轻松购买、兑换、支付和管理资金。无跨境费用。