HLF_TxTime_spoofing —— 一个概念验证项目,涵盖了 Hyperledger Fabric 区块链中交易时间操纵的问题(使用 GetTxTimestamp() 或 GetHistoryForKey())。已在 v2.5.5 和 v3.0.0-beta 版本上测试。
项目由以下几部分组成:
在所有情况下(即各链码中),存款年利率均为 20%。
有助于理解业务逻辑的附加函数: CalcDividents() - 返回给定天数及初始存款金额下累积的股息 subtractTimestamp() - 返回当前时间与初始存款时间之间的差值
调用 Stake_insecure() 以初始存款金额添加存款。调用 CheckDividents_insecure() 确认存款金额未改变。在客户端上更改本地时间,然后再次调用 CheckDividents_insecure()。
金融攻击:将时间向前调整 1 年,即可获得 20% 的年利息。
金融攻击成功
同样地,我们确认在 GetHistoryForKey() 中交易时间也可以被操纵。
在该链码变体中,我们根据从 NTP(网络时间协议)服务器获得的时间(使用 ntp 客户端包)检查交易时间。每个链码拥有各自的 NTP 服务器地址(即 不同的链码包)用于分发。如果出现时间偏差,将显示错误:"wrong time"。注意,NTP 流量数据可能被欺骗(数据以明文传输)。
金融攻击失败
在该链码变体中,我们根据从 NTS(网络时间安全)服务器获得的时间(使用 nts 客户端包)检查交易时间。每个链码拥有各自的 NTS 服务器地址(即 不同的链码包)用于分发。如果出现时间偏差,将显示错误:"wrong time"。
金融攻击失败
在该链码变体中,我们根据本地时间(即对等节点上的时间)检查交易时间。如果出现时间偏差,将显示错误:"wrong time"。注意,所有对等节点上需要正确的时间设置。
金融攻击失败
hlf-time-oracle 是一个为 Hyperledger Fabric 区块链提供精确时间给其他链码的链码。hlf-time-oracle 基于 ntp 包 和 nts 包。从而解决了区块链客户端可能操纵交易时间的安全问题。该链码提供 GetTimeNtp() 和 GetTimeNts() 函数。调用这些函数会向 NTP(网络时间协议)和 NTS(网络时间安全)服务器发出请求。从任一服务器获取的时间可用于验证客户端定义的交易时间的正确性。区块链链码的开发者可以使用 hlf-time-oracle 替代独立编写与 NTP 和 NTS 服务器交互的代码。hlf-time-oracle 在运行过程中不会向区块链保存任何数据。