Solana/私钥, 公钥与地址/地址伪装转账攻击与虚荣地址

Solana 作为一个高性能的区块链平台, 因其快速交易和低费用吸引了大量用户和开发者. 然而, 随着其普及, 针对用户的攻击手法也变得更加多样化. 从 2023 年开始, 一种名为 "地址伪装转账攻击" 的攻击方式开始在网络上大量出现. 这是一种利用地址相似性迷惑受害者的黑客策略.

地址伪装转账攻击

地址伪装转账攻击是指黑客生成一个与受害者已有地址前几位和后几位高度相似的 solana 地址(通常称为"虚荣地址", vanity address), 然后利用该地址向受害者发送少量代币或资产. 这种攻击旨在诱骗受害者误以为该转账来自合法来源, 进而促使受害者在后续交互中将资金转移到黑客控制的地址.

例如, 假设受害者的钱包地址是:

7x9kPqM...XyZ3mN

黑客可能生成一个伪装地址, 如:

7x9kaA2...QxZ3mN

两者的开头和结尾几乎相同, 只有中间部分略有差异. 由于用户在日常使用中往往只检查地址的首尾, 这种相似性极易导致混淆.

攻击的实施方式非常简单, 首先黑客使用专门的工具生成大量 solana 公钥私钥对, 直到找到一个与目标地址首尾相似的地址. Solana 的地址是基于公钥的 32 字节 base58 编码, 生成特定模式的地址需要较多的计算能力, 但并非不可行. 之后黑客从伪装地址向受害者发送少量 sol 或代币(如 0.001 sol), 并可能附带一个看似合法的备注, 例如"测试转账"或"退款". 受害者在钱包中看到这笔转账时, 可能误以为是自己认识的地址发来的. 受害者可能尝试"归还"这笔资金, 或在后续交互中不小心将大额资金发送到伪装地址. 黑客则通过监控链上交易, 迅速转移收到的资金.

这种攻击在 solana 生态中已被多次报告. 例如, 2023 年, 一些用户在收到不明来源的小额转账后, 因未仔细核对地址而将资金转回伪装地址, 导致损失数千美元的资产. 由于 solana 交易是不可逆的, 一旦资金转出, 用户几乎无法追回.

请仔细核对完整地址: 不要仅依赖首尾几位, 始终检查地址的完整字符串, 尤其是在发送大额交易时.

虚荣地址

我们尝试使用 pxsol 来生成一个虚荣地址. 我们的受害者是 6ASf5EcmmEHTgDJ4X4ZT5vT6iHVJBXPg5AN5YoTCpGWt, 而我们要完成的目标是获得一个公私钥对, 使其地址的前两位和后两位与受害者地址相同. 功能脚本如下.

import pxsol
import random

target = '6ASf5EcmmEHTgDJ4X4ZT5vT6iHVJBXPg5AN5YoTCpGWt'

for _ in range(1 << 32):
    prikey = pxsol.core.PriKey(bytearray(random.randbytes(32)))
    pubkey = prikey.pubkey().base58()
    if pubkey[:2] == target[:2] and pubkey[-2:] == target[-2:]:
        print(prikey)
        print(pubkey)
        break

我在一台家用机上运行此脚本, 花费了约 3 个小时获得了一个满足要求的私钥和公钥.

prikey = D44NkELmJ6pQ13qDpA983i82iPDy9yi6VPJ3xRHv3v1R
pubkey = 6Ak9ou3WLs8uxme4vqMyNsUHiyY4inK3wLRtwgCC7uWt

Python 不以性能见长: 如果您可以使用 c, rust 或者 go 语言的 ed25519 库来进行这个工作, 相信速度应该会有上千倍的提升.