主页 > imtoken靓号地址软件 > 微软Azure以太坊节点自动化部署方案漏洞分析

微软Azure以太坊节点自动化部署方案漏洞分析

imtoken靓号地址软件 2023-10-06 05:07:16

this.host = 主机 || 'http://localhost:8545';

this.timeout = 超时 || 0;

};

在以太坊黑色情人节事件中,攻击者利用RPC接口进行恶意转账。

过程分析

我们在Blockchain Admin页面的两个输入框中分别输入转账地址和转账金额并提交。

/home/ethtest/etheradmin/app.js 定义了提交后服务器处理的方法。

命令行参数

var listenPort = process.argv[2]

var gethIPCPath = process.argv[3];

var coinbase = process.argv[4];

var coinbasePw = process.argv[5];

var consortiumId = process.argv[6];

var registrarHostEndpoint = process.argv[7];

var registrarConnectionString = process.argv[8];

var registrarDatatbaseId = process.argv[9];

var registrarCollectionId = process.argv[10];

定义 IPC 服务的使用

var web3IPC = new Web3(new Web3.providers.IpcProvider(gethIPCPath, require('net')));

·············

应用程序。 发布('/',功能(要求,资源){

var address = req.body.etherAddress;//转账地址

var amount = req.body.amount;//转账金额

如果(web3IPC.isAddress(地址)){

//如果提交的地址是以太坊地址,解锁账户

web3IPC.personal.unlockAccount(coinbase, coinbasePw, function(err, res) {

安慰。 日志(资源);

//通过ipc方法发送交易

web3IPC.eth.sendTransaction({from: coinbase, to: address, value: web3IPC.toWei(amount, 'ether')}, function(err, res){ console.log(address)});

});

req.session.isSent = true;

} 别的 {

req.session.error = "不是有效的以太坊地址";

}

水库重定向('/');

});

使用POST方式提交后,会判断我们输入的地址是否为合法的以太坊地址。 默认情况下,我们的帐户是锁定的。 这里判断地址无误后,使用personl.unlockAccount()方法解锁账户。 该方法需要的参数coinbase和coinbasePw在启动服务时已经作为参数传入命令行。 使用ps命令查看服务的进程。

以太坊全节点_以太坊经典和以太坊_sitejianshu.com 以太坊以太经典

其中f9cdc590071d9993b198b08694e5edf376979ce6是我们的钱包地址以太坊全节点,123qweasdZXC是解锁钱包需要的密码,/home/ethtest/.ethereum/geth.ipc是getIPCPath参数的内容。

personal.js 中的 unlockAccount 方法。

var unlockAccount = 新方法({

名称:'解锁帐户',

调用:'personal_unlockAccount',

参数:3,

inputFormatter:[格式化程序。 inputAddressFormatter,空,空]

});

IpcProvider.js 中发送方法的定义。

IpcProvider.prototype.send = 函数(负载){

如果(这个。连接。writeSync){

变量结果;

// 尝试重新连接,当连接消失时

如果(!this.connection.writable)

this.connection.connect({path: this.path});

var data = this.connection.writeSync(JSON.stringify(payload));

尝试 {

结果 = JSON。 解析(数据);

} 抓住(e){

抛出错误。 无效响应(数据);

}

返回结果;

} 别的 {

throw new Error('你试图同步发送“'+ payload.method +'”。IPC 提供者不支持同步请求。');

}

};

ipcprovider会调用JSONRPC.js将unlockAccount方法中的参数格式化为JSON格式。

在 node_modules/web3/lib/web3/ipcprovider.js 中设置一个断点来跟踪数据流。

以太坊全节点_sitejianshu.com 以太坊以太经典_以太坊经典和以太坊

然后通过socket写入数据。

sitejianshu.com 以太坊以太经典_以太坊经典和以太坊_以太坊全节点

以太坊全节点_sitejianshu.com 以太坊以太经典_以太坊经典和以太坊

接下来geth通过IPC接收请求方法和参数,然后使用UnlockAccount函数解锁账户,解锁后使用eth.sendTransaction方法发送交易。

以太坊经典和以太坊_sitejianshu.com 以太坊以太经典_以太坊全节点

sitejianshu.com 以太坊以太经典_以太坊全节点_以太坊经典和以太坊

sendTransaction 方法将使用解锁的本地账户的私钥进行签名以太坊全节点,并使用 SignedTransaction 方法发送已签名的交易。

我们通过geth日志获取交易hash,在控制台查看详情。

以太坊经典和以太坊_以太坊全节点_sitejianshu.com 以太坊以太经典

以太坊经典和以太坊_sitejianshu.com 以太坊以太经典_以太坊全节点

值得一提的是,我们在分析过程中发现,微软Azure提供的以太坊节点自动化部署方案依然使用1.7.3版本的geth,该版本中的UnlockAccount函数:

func (s *PrivateAccountAPI) UnlockAccount(addr common.Address, password string, duration *uint64) (bool, error) {

const max = uint64(time.Duration(math.MaxInt64) / time.Second)

可变时间.Duration

如果持续时间 == 无 {

d = 300 * 时间。 第二

} else if *duration > max {

返回错误,错误。 New("解锁时间过长")

} 别的 {

d = time.Duration(*duration) * time.Second

}

错误:= fetchKeystore(s.am).TimedUnlock(accounts.Account{Address: addr}, password, d)

返回错误==无,错误

}

wiki中personal_unlockAccount方法的定义:

解锁账户并从keystore中获取私钥,并将解锁后的私钥存入内存。 账户解锁接口允许传入超时时间,默认超时时间为300秒。 如果传入的timeout为0,则永远不会超时,账户会一直保持解锁状态,直到节点进程退出。 这也是“以太坊[走私]漏洞事件[5]”的主要原因。

3. 风险评估

在以往针对以太坊的攻击案例中,大多发生在暴露于互联网的RPC接口上,而基于本地进程通信的IPC接口被认为是相对安全可靠的,但如果类似于微软Azure自动化部署方案中的“Blockchain Admin”是基于IPC调用的程序,不经过任何认证就直接暴露在互联网上无疑是一个巨大的安全隐患。 (注:曾经暴露在互联网上的目标可以通过ZoomEye网络空间搜索引擎[7]查看。)

在实际测试分析过程中发现,微软Azure提供的以太坊节点自动部署更多的是联盟链或者私有链,公有链的部署很少见,所以这次安全事件实际上可能有一个对公链的影响相对较小。 不大。 对联盟链或私有链的影响需要根据自身情况衡量和评估。

4. 报告流程

针对以上问题,我们第一时间联系了微软:

五、总结

区块链虚拟货币安全事件频发,安全刻不容缓。 从这个案例中可以得出几点建议:

针对目前主流的以太坊应用,智创宇提供专业、权威的智能合约审计服务,避免因合约安全问题造成的财产损失,为各类以太坊应用的安全保驾护航。

知乎创宇404智能合约安全审计团队: