背景

getcookies包存在后门代码, 目前已经被发现并从 npmjs.org 中删除.

相关报道

基本信息

恶意包包括: getcookies, express-cookies, http-fetch-cookies, 其中后门代码在getcookies中.

由于 npm 已经删除了上述恶意包, 无法正常获取信息. 但是作为镜像的 npm.taobao.org 当前仍旧可以获取信息. 此后的信息都是从 npm.taobao.org 获取. 同时为了避免失效, 获取到的信息都有留存.

发布人的信息: dustin87 <[email protected]> https://npm.taobao.org/~dustin87

image

留存

三个包的留存

getcookies

包信息: https://registry.npm.taobao.org/getcookies 备份 版本备份: https://github.com/isayme/blog/blob/master/issues/13/getcookies/

express-cookies

包信息: https://registry.npm.taobao.org/express-cookies 备份 版本备份: https://github.com/isayme/blog/blob/master/issues/13/express-cookies/

http-fetch-cookies

包信息: https://registry.npm.taobao.org/http-fetch-cookies 备份 版本备份: https://github.com/isayme/blog/blob/master/issues/13/http-fetch-cookies/

三个包的基本信息

getcookies

首次上传时间: 2018-03-22T07:45:55.796Z, 上传人邮箱: [email protected] image

包内的 History.md 文件描述此包创建于2012-05-28. 其实这个包是从 cookie@0.3.1 修改而来, History.md 的信息都是cookie的记录, 存在误导.

express-cookies

首次上传时间: 2018-03-22T07:46:26.847Z, 上传人: [email protected] image

包内的 History.md 文件描述此包创建于2014-02-15. 其实这个包是从 cookie-parser@1.4.3 修改而来, History.md 的信息都是cookie-parser的记录, 存在误导.

http-fetch-cookies

首次上传时间: 2018-04-12T12:44:43.189Z, 上传人: [email protected] image 此包为空包, 暂无更多信息.

谁在用这些包?

expess-cookies 依赖 getcookies; http-fetch-cookies 依赖 expess-cookies; mailparser 依赖 http-fetch-cookies;

mailparser
└── http-fetch-cookies
     └── express-cookies
          └──getcookies

其中 mailparser 存在一定的文档下载量: image

mailparser 2.2.1 2.2.2 2.2.3 三个版本分别依赖了 http-fetch-cookies1.0.0 1.0.0 1.0.1 版本, 目前 mailparser 的这三个版本已经删除, 备份: https://github.com/isayme/blog/blob/master/issues/13/mailparser/ 其中 [email protected] 发布于 2018-04-12T12:45:09.611Z, [email protected] 发布于 2018-04-12T12:46:40.121Z, [email protected] 发布于 2018-04-12T12:52:13.451Z. 有趣的是: mailparser2018年3月11日 GMT+8 下午6:18 就已经标记deprecated.

后门机制

image

攻击者通过headers构建上传恶意代码并执行:

  1. 匹配 req.headers 中 gCOMMANDhCODE;
  2. COMMAND0xfffe 时重置 code buffer;
  3. COMMAND0xfffe/0xfffa 以外的值时加载CODE 至 code buffer;
  4. COMMAND0xfffa 时执行 code buffer 的代码, 其中 code buffer 返回一个函数.

示例 code buffer:

var codebuffer = `(function() {
        return function (...args) {
            console.log(args)
        }
    })()`

require('vm')['runInThisContext'](codebuffer)('we', 'can', 'do', 'anything', 'here')
require('vm')['runInThisContext'](codebuffer)(module.exports, require, req, res, next)