Corda数据篡改问题

5

背景: 我们知道,corda并非防篡改,而是具有防篡改迹象的功能。因此,如果其中一个节点直接在数据库中操纵状态,则其他节点将能够检测到并标记它,如果该状态在随后的交易中被使用。然而,我们的测试结果不符合我们的预期。 Corda没有标记被篡改的状态,事实上,它在所有参与方节点中记录了带有篡改数据的新状态。

先决条件注释掉合同验证:我们注释掉合同代码,以检查是否能在命令级别未明确执行检查时,Corda能否检测到数据篡改。

复制步骤:

  1. 启动Obligation Cordapp。
  2. 创建Party A和Party B之间的3个债务(100 THB,256 THB和100 THB) Obligations

  3. 通过查看HEX之间的差异来编辑Party B的数据库中的VAULT_STATES表。 Vault State Hexs 左侧为不同金额的债务,右侧为两个相同金额的债务。编辑器显示当它们在相同金额时,存在2个差异(可能与linear-id和时间戳相关),当它们在不同金额时,第3个差异显示在左侧。

  4. 使用SQL覆盖较低价值金额的特定部分,在Party B的vault上更新:

h2 Update

  1. 更新后,请检查B方的保险库,所有三项义务的金额都变成了100泰铢。 edited balance

  2. 然而,A方的保险库将显示原始金额(100、256、100),因为在A方的保险库中未篡改数据。 Party A Balance

  3. 将所有义务从B方转移到C方。

  4. 义务转移结果:B方不再有任何义务。 Party B Obligations

  5. 义务转移结果:C方将获得B方的所有义务(每个义务100泰铢,即篡改的数据被传递给新的一方)。 Transferred Obligations

  6. 义务转移结果:A方的保险库也将更新为篡改的数据。它无法识别或标记篡改的数据。 Final Result

如何使Corda参与方节点检测到篡改状态?在设置节点时是否遗漏了某些配置?


我已经两次仔细阅读了你的全部陈述,但仍然没有发现问题。 - Robby Cornelissen
1
问题是,如何让 Corda 参与方节点检测篡改的状态? - Rickky13
2
只是想让您知道,我们在r3非常感兴趣地关注着这个问题,但现在正值假日季节的开始,所以请不要期望立即得到详细的回复。 - Richard Green
1个回答

5

很抱歉,我们中的大多数人从今天下午开始都在度假,所以这次讨论可能需要一些时间。

我们将尝试复制您在此处的操作。但是我不确定这是否是一个错误。

您说您注释掉了合同验证逻辑。听起来可能发生的情况是:

  1. 编辑状态表以保存已损坏的状态。
  2. 构建交易,其中INPUT=对先前正确状态的指针。OUTPUT=(已损坏的状态)+编辑以保存新所有者字段。
  3. 现在签署并转移此交易。

当尝试转移到C方时,此交易本应被视为无效并被拒绝,因为它是非法的状态转换:数字不平衡。但是你注释掉了检查这一点的代码!因此,任何地方都没有说您不能随意更改债务的大小...如果您注释包含此知识的代码,则Corda不会隐式了解这一点。因此,从IOU应用程序的角度来看,在传输时更改其大小现在是完全合法的。

这里的问题是 - 如果您保持应用程序不变,并且不修改其源代码,是否会检测到篡改?如果答案仍然是“否”,那么我们需要进行更多的调查。


当状态表已经存储了一个损坏的状态时,输入如何仍然指向先前正确的状态?除非从其他地方查询/反序列化了输入?您能否建议我如何证明和测试,如果输入以任何方式被损坏,则在实时节点上进行签名时resolveDependency检查将抛出错误,并确保溯源(这也是我注释合同代码以隔离证明此问题的原因之一)。 - Rickky13
3
每个节点会在两个地方存储其状态——一个是在它自己的保险库中,另一个则是作为生成这些状态的交易的一部分存储在交易存储中。当您构建一个交易时,并不直接包含输入。相反,您包含输入状态的引用(请参阅https://docs.corda.net/key-concepts-transactions.html#transaction-chains)。当您将交易发送给对手方时,他们会要求每个输入状态引用所对应的交易,并从中提取原始未被破坏的状态。这就是为什么对手方仍然看到未被破坏的状态的原因。 - Joel
如果构建的交易不包含实际输入状态,而只包含stateAndRef.ref,那么tx.verify(serviceHub)是否意味着对来自交易存储的状态进行合同代码验证?如果合同代码需要对输入状态字段进行一些验证,即此行val input = tx.inputsOfType<Obligation>().single(),则该交易将首先转换为LedgerTransaction,该事务基于生成状态的tx哈希从交易存储中请求状态?(而不是存储已损坏的状态的保险库) - Rickky13
没错 :) 保险库在交易验证中没有被使用。 - Joel
@ Joel SGX 可以在这里如何帮助? - balajimore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接