18 年的时候在北航听陈博士讲课的时候,就曾经晓得什么是重入破绽,然而那是还没有很深刻重入破绽。明天回顾了一下慢雾的重入破绽的介绍,发现讲得曾经十分简洁的分明了。
慢雾重入破绽:
https://mp.weixin.qq.com/s/4j…
自从 0.8.9 更新了平安的函数代码库之后,有一段代码会被审计成“平安”,而且越来越少人关注重入破绽了。
function update() {uint value = deposits[msg.sender];
safeTransferETH(msg.sender, value)
deposits[msg.sender] = 0;
}
剖析发现这一段代码的性能是:
获取用户的贷款数额
应用 safeTransferETH 函数发送用户的贷款
把用户的贷款数额置为零
个别的审计会认为这段代码是平安的,因为其应用的是 safeTransferETH 个别意义上是平安的函数。
然而这其实是仍然是能够被重入攻打的。
具体能够看:https://www.anquanke.com/post…
总结
(1)作为开发人员
站在开发者的角度咱们须要做的是写好代码,防止重入破绽的产生。
- 写代码时须要遵循先判断,后写入变量在进行内部调用的编码标准(Checks-Effects-Interactions);
- 退出防重入锁。
(2)作为审计人员
作为审计人员咱们须要关注的是重入破绽的特色:所有波及到内部合约调用的代码地位都是不平安的。这样在审计过程中须要重点关注内部调用,而后推演内部调用可能产生的危害,这样就能判断这个中央是否会因为重入点而产生危害。
(3)切记切记:所有代码中,先转账,再更改状态的代码,都有被重入的可能。