建立钓鱼URL的数据库,当用户访问钓鱼网站时进行拦截。
原文作者:Ben Law
原文来源:medium
原文标题:钱包卫士:Web3安全插件工作原理
在DeFi的黑暗森林中,用户每天面临着各种安全威胁。据报道每年有超过十亿美元的加密资产被骗走。用户迫切地需要一种钱包卫士来守护资产。上篇文章提到了如 FoxEye这种Web3安全插件,本帖来解释下它们的工作原理。
当谈到反钓鱼时,一个常见的安全模型是基于URL的反钓鱼,因为大部分攻击向量都依赖钓鱼网站,如:
面向URL的反钓鱼
建立钓鱼URL的数据库,当用户访问钓鱼网站时进行拦截。
面向URL的反钓鱼只能建立在静态的URL黑名单之上(虽然这个名单可以更新),这种措施有用但比较老套也不够全面:
面向URL的反钓鱼不能满足用户需求,因为它覆盖的不是最终的安全敞口:待签名交易(或消息)。
面向交易的反钓鱼
殊途同归,所有的钓鱼都需要发起交易。如果我们能动态地解析交易或签名(签名也需要之后在本地或远程交易),并拦截有害的那一部分,就可以实现用户端的安全闭环。
典型的交易过程
本段包含一小部分代码,但不理解代码也可以阅读。标准的交易过程为:
ethereum.request({
method: ‘eth_sendTransaction’,
params: [{…, to, data, …}]
})
Hook交易
Hook的意思是钩子。在编程中我们把『拦截系统或软件的函数、信息、事件,并增加或改变其功能』的技术称为hook。
如果我们能hook这个eth_sendTransaction方法,那么就能在其被发送至用户钱包签名前对其进行审查。
在JavaScript中,我们使用基础对象Proxy来完成hook。
创建一个对 ethereum.request(其中包含eth_sendTransaction)的Proxy。
const proxy = new Proxy(window.ethereum.request, this.proxyHandler);
window.ethereum.request = proxy;
其中一个参数 this.proxyHandler 中声明了监听到eth_sendTransaction后如何处理,具体细节按下不表,大体为:
显然,第二步是这一流程里最关键和最有技术含量的,包括但不限于:
每一条都可以单独写一篇文章,篇幅所限这里就不展开了。
Tips
最后有几条使用安全插件的几条建议: