刚刚一个群友的私钥被不小心上传到了GitHub,5分钟之内用一个新的 commit 覆盖了之前上传的记录,结果所有币都还是丢了。
现在有很多机器人盯着 GitHub 找那些被错误上传的私钥/apiKey/数据库密码,一定要注意自己的数据安全,如果要用私钥,起码要加个盐在本地加密/解密一次,千万不要直接传明文。
另外,新的 commit 只能覆盖掉latest的显示记录,但是过去的所有commit都还还能回溯。如果希望删除过去的commit历史记录,可以使用BFG Repo-Cleanner,但如果是传私钥这么严重并且实效性很强的问题,直接删repository应该才是更好的选择。
ETH被盗的过程很正常,让我比较震惊的是ERC20和ERC721(Uniswap V3: Position NFT)的丢失过程(个人感觉应该是被三个不同水平的黑客转走的)。
ERC20被盗:
群友从币安提币到了自己的钱包地址,本打算手动转币,却被黑客在下一个区块直接转走了钱包里最值钱的那个币种。
同时,黑客选择的手续费开销策略是把钱包里的所有ETH全部用来支付拿笔ERC20的转账,只要黑客发送这笔交易足够快,后来者就不可能出更高的gasPrice来抢跑黑客的这笔交易。(图1)。
ERC721被盗:
黑客直接通过自己的钱包发送`permit()`交易(https://etherscan.io/tx/0x44e46a6040f256666d8e95c423cae0048b25eea7326d8fb9726e8f249f0e25f5),来获得了目标钱包被黑的ERC721代币的授权。
再通过自己的钱包直接调用`transferFrom()`函数转移走了被黑钱包的ERC721代币(https://etherscan.io/tx/0x7a43606e232950e41dd823ea48b42587a6cd0a1bd6fa1a04f85c8f85f44ad172),全程不需要被黑钱包里有任何ETH来执行交易。
而这个是Uniswap V3的ERC721Permit(文档:https://docs.uniswap.org/reference/periphery/base/ERC721Permit)给ERC721附加的特性。只需要有目标钱包的私钥,并通过私钥签名得到`digest`对应的`v`, `r`和`s`,就能不需要目标钱包发送授权转账,而代替目标钱包直接进行授权。
我之前都没有认真读Uniswap V3的文档,第一次知道还有这个特性...黑客真不是盖的,努力又勤奋,真是让弟弟大开眼界。
如果不觉得自己比黑客聪明,就好好保存自己的私钥吧。
Loli依旧笑春风:git push -f 能覆盖么。
CryptoBlanker:不行的,新的commit是记录在下一个hash了,没办法复写前一个hash的内容[哈哈]只能用BFG去删之前的commit,或者直接删库。
_Danny0:Uni V2的LP Token也有类似的Permit方法,所以可以通过RemoveLiquidityWithPermit 移除流动性。
俗人王五:私钥都提交到了Github,不应该是里马转走钱包里面的所有币种吗?还在讨论用什么方法覆盖,这是搞笑吗?
CryptoBlanker:他一开始只是想着新commit上去就能把历史记录挡掉,肯定更不知道有bot在扫私钥了[汗]。
观海bit:有私钥就可以直接本地签名了,不需要授权的。我在本地也跑过uniswap交易。
CryptoBlanker:要授权才能做`transferFrom()`,微博里面说的这个也是先授权的,只是Uniswap的LP可以通过其他地址来执行。