我正在从你的网站上收集信用卡号码和密码。以下是

2020-07-31 15:31:50

以下是一个真实的故事。或者它可能仅仅是根据一个真实的故事改编的。也许这完全不是真的。

这是安全恐慌的疯狂一周,似乎每天都有新的漏洞。对于我个人来说,当被家人问及这件事时,要假装明白发生了什么,这真的是一件很艰难的事情。

看到我身边的人都对被“粉身碎骨”的前景感到不安,我真的看清了事情的来龙去脉。

所以,怀着沉重的心情,我决定坦白告诉大家,在过去的几年里,我是如何从你们的网站窃取用户名、密码和信用卡号码的。

恶意代码本身非常简单,当它在满足以下条件的页面上运行时,它会发挥最大的作用:

该页面包含诸如“信用卡”、“结账”、“登录”、“密码”等词。

然后,当密码/信用卡字段出现模糊事件或听到表单提交事件时,我的代码:

简而言之,如果它看起来像是对我有一点价值的数据,我会将其发送到我的服务器。

当然,当我在2015年第一次写这段代码的时候,它坐在我的电脑上根本没有任何用处。我需要把它带到这个世界上。进入你的网站。

如果攻击者成功注入任何代码,游戏就差不多结束了。

对我来说幸运的是,我们生活在这样一个时代,人们安装NPM软件包就像他们在吃止痛药一样。

因此,NPM将成为我的分销方式。我需要想出一些边缘有用的软件包,人们会不假思索地安装它-我的特洛伊木马。

人们喜欢漂亮的颜色--这是我们和狗的不同之处--所以我写了一个软件包,让你可以用任何颜色登录控制台。

在这一点上我很兴奋-我有一个令人信服的套餐-但我不想等着人们慢慢地发现它并传播消息。因此,我开始对现有的包进行公关,将我的五颜六色的包添加到它们的依赖项中。

我现在已经制作了数百个PR(不同的用户帐户,不,没有一个是“David Gilbertson”)到各种前端包及其依赖项。“嘿,我修复了问题x,还添加了一些日志记录。”

有很多明智的人告诉我,他们不想要新的依赖,但这是意料之中的,这是一个数字游戏。

总体而言,这项活动取得了巨大的成功,我丰富多彩的控制台代码现在直接依赖于23个软件包。其中一个套餐本身就依赖于一个相当广泛使用的套餐-我的摇钱树。我不会提到任何名字,但你可以说这是在填补金库的空隙。

我现在每月的下载量约为12万次,我很自豪地宣布,我的肮脏代码每天都在数千个网站上执行,包括少数Alexa排名前1000的网站,给我发送了大量的用户名、密码和信用卡详细信息。

回过头来看这些黄金岁月,我不敢相信人们会花费如此多的精力来摆弄跨站点脚本,仅仅是为了将代码放到单个站点中。只要我的网络开发人员朋友提供一点帮助,就可以很容易地将恶意代码发送到数千个网站。

你会在哪里注意到他们?当DevTools打开时,我的代码不会发送任何内容(是的,即使未停靠)。

我称之为海森堡策略:通过尝试观察我的代码的行为,您可以改变我的代码的行为。

在localhost或任何IP地址上运行时,或者域包含dev、test、qa、uat或staging(由\b字边界包围)时,它也会保持静默。

他们几点上班?我的代码在工作日早上7点到晚上7点之间不发送任何内容。我的收获减半了,但是95%的机会降低了我被抓的几率。

我只需要你的证件一次。因此,在我发送了对设备的请求后,我会将其记下来(本地存储和cookie),并且再也不会发送对该设备的请求。复制并不容易。

即使一些勤奋的小笔试试者不断地(在周末)清除cookie和本地存储,我也只会断断续续地发送这些请求(大约七分之一的时间,略微随机-这是引发精神错乱的理想故障排除频率)。

此外,URL看起来与您的站点向广告网络发出的300个其他请求非常相似。

也许你有一个24/7全天候填写付款表格和检查可疑网络请求的自动设置。祝你好运。您使用的是PhantomJS、Selenium、WebDriver还是Friends?抱歉,它们都向Window添加了易于检测的属性,因此我不会为这些设置发送任何内容。

关键是,仅仅因为你看不到,并不意味着它没有发生。已经两年多了,据我所知,从来没有人注意到我的一个请求。也许它一直都在您的站点中:)。

(有趣的是,当我检查我收集的所有密码和信用卡号码并将它们捆绑在一起在黑暗的网络上出售时,我必须搜索我的信用卡号码和用户名,以防我捕获了自己。这不是很有趣吗!)。

但是,恐怕完全有可能将代码的一个版本提供给GitHub,而将另一个版本提供给NPM。

在我的Package.json中,我定义了files属性来指向一个lib目录,该目录包含精简、丑化的肮脏代码-这就是NPM Publish将发送给NPM的内容。但是lib在我的.gitignore中,所以它永远不会到达GitHub。这是一种非常常见的做法,因此如果您在GitHub上通读这些文件,甚至看起来都不可疑。

这不是NPM问题,即使我没有向NPM和GitHub交付不同的代码,谁能保证您在/lib/Package.min.js中看到的是缩小/src/Package.js的实际结果呢?

好了,现在你只是在编造异议。但是您可能在想,您可以编写一些聪明的东西,自动检查代码是否有任何可疑之处。

您仍然不会在我的源代码中找到很多有意义的东西,我没有FETCH或XMLHttpRequest这个词,也没有我要发送到的域。我的提取代码如下所示:

“gfudi”只是“取”,每个字母上移一位。硬核密码术就在那里。Self是Window的别名。

要点是:在混淆的代码中很难发现恶作剧,您没有机会。

(尽管如此,我实际上并没有使用像FETCH那样普通的东西,我更喜欢在可能的地方使用新的Eventsource(UrlWithYourPreciousData)。这样,即使您疑神疑鬼,使用serviceWorker监听获取事件来监视出站请求,我也会悄悄溜过去。我只是不为支持serviceWorker但不支持eventsource的浏览器发送任何内容。)。

有没有人告诉你,这会阻止恶意代码将数据发送到某个卑鄙的域?我不想成为坏消息的传播者,但是下面四行代码即使是最严格的内容安全策略也会顺利通过。

(在这篇文章的前一次迭代中,我说过可靠的内容安全策略将使您(我引用)“100%安全”。不幸的是,在我学会上述技巧之前,有13万人阅读了这本书。因此,我想这其中的教训是,你不能信任互联网上的任何人或任何事情。)。

但CSP并非完全无济于事。上述功能只能在Chrome上运行,而一个像样的CSP可能会阻碍我在一些较少使用的浏览器上所做的努力。

如果您还不知道,内容安全策略可以限制可以从浏览器发出哪些网络请求。它的设计目的是限制您可以带到浏览器中的内容,但也可以(作为副作用)限制发送数据的方式(当我将密码“发送”到服务器时,它只是GET请求的查询参数)。

在我无法使用预取技巧获取数据的情况下,CSP对我的信用卡收款公司来说是很棘手的。不仅仅是因为他们阉割了我邪恶的意图。

您知道,如果我尝试从具有CSP的站点发送数据,它会提醒站点所有者失败的尝试(如果他们指定了report-uri)。他们最终会追踪到我的代码,可能会打电话给我母亲,然后我就会有大麻烦了。

因为我不想引起别人的注意(除非是在舞池上),所以在试图发送东西之前,我会检查一下您的CSP。

为此,我向当前页面发出一个虚拟请求并读取头。

在这一点上,我可以想办法越过你的CSP。Google登录页面有一个CSP,如果我的代码在该页面上运行,它将允许我轻松地发送您的用户名和密码。他们没有显式地设置connect-src,也没有设置catch-all default-src,所以我可以把您的凭据发送到任何我想要的地方。

如果你邮寄给我10美元,我会告诉你我的代码是否在谷歌登录页面上运行。

亚马逊在你输入信用卡号码的页面上根本没有CSP,eBay也没有。

Twitter和PayPal都有CSP,但从他们那里获取数据仍然非常容易。这两个允许以相同的方式在幕后发送数据,这可能是其他人也允许的迹象。乍一看,一切都很彻底,他们都像应该的那样设置了default-src catch-all。但这里有一个关键:这种包罗万象的做法并不能包罗万象。他们还没有锁定形式行动。

因此,当我检查您的CSP(并检查两次)时,如果其他所有内容都已锁定,但我在其中看不到表单操作,我就会去更改所有表单上的操作(当您单击“登录”时,数据将在其中发送)。

砰,谢谢你把你的贝宝用户名和密码发给我,伙计。我会寄给你一张感谢卡,里面有我用你的钱买的东西的照片。

很自然,我每台设备只做一次这个把戏,然后把用户弹回推荐页面,在那里他们会耸耸肩,然后再试一次。

(用这种方法,我接管了特朗普的Twitter账户,开始发出各种奇怪的狗屎。到目前为止,还没有人注意到这一点。)。

编辑:我已经在后续文章第2部分:如何阻止我从您的站点获取信用卡号码和密码中详细介绍了这一点。

在任何收集您不希望我(或其他攻击者)拥有的数据的页面上,不要使用NPM模块。或Google Tag Manager,或广告网络,或分析,或任何不属于您的代码。

正如这里所建议的,您可能希望考虑在IFRAME中提供用于登录和信用卡收集的专用轻量级页面。

你仍然可以让你的ol‘Reaction应用程序带有938个npm包的页眉/页脚/导航/任何东西,但是如果你想做客户端验证,用户输入的页面部分应该在一个安全的iframe中,并且它应该只运行手工制作(我建议,不要缩小)的JavaScript。

我很快就会公布我2017年的年度报告,在报告中我申报了我从窃取信用卡号码并将其出售给戴着凉帽的歹徒的收入。法律要求我出示我浏览的信用卡最多的网站--也许你的网站在名单上?

因为我是一个优雅的人,名单上的任何人如果在1月12日之前成功阻止我获取他们的数据,都不会受到公众的羞辱。

我知道,有时我无情的讽刺很难被英语学习道路上的人(以及需要放松的人)解开。因此,为了清楚起见,我没有创建窃取信息的NPM包。这篇文章完全是虚构的,但完全可信,我希望至少能有一点教育意义。

虽然这些都是编造的,但让我担心的是,这些都不是难事。

外面不乏聪明、肮脏的人,还有58万个NPM套餐。在我看来,这些包中至少有一个包含一些恶意代码的可能性似乎更高,如果它做得很好,你甚至永远不会知道。

这是一个有趣的思维实验:上周我写了一个NPM包,一个小的放松功能。与这篇帖子完全无关,我以绅士的身份向你保证,里面没有恶意。你会有多紧张把它添加到你的网站上?

那么,像这样的帖子有什么意义呢?难道只是我指着说“哈,你真是个笨蛋!”

没关系,您请。(嗯,一开始是这样,但后来我意识到我也是个笨蛋,所以我改变了语气。)。

我的目标(结果是)只是简单地指出,任何包含第三方代码的网站都非常容易受到攻击,而且是完全无法检测到的。