短兵:API安全典型漏洞剖析

admin 2022年9月3日12:08:39安全文章评论7 views7249字阅读24分9秒阅读模式

短兵:API安全典型漏洞剖析


继上一篇《漫谈:API安全简史》之后,今天我们来看看近期有哪些API安全的漏洞或事件。本文约5000字,阅读时间10分钟。


作者:t0data,本文以Facebook安全应急响应中心、Hackerone漏洞赏金平台、NVD等网站上的API安全漏洞为例,结合OWASP API安全Top 10问题,对漏洞过程做详细分析,以加深读者对API安全的理解。


这个世界上每天都在发生新的漏洞,NVD作为全球最大的官方漏洞库最近三个月的数据显示,共收录漏洞数6503条,平均每天新增70多条漏洞记录。而以API为关键字进行搜索,近三个月也有276条相关记录。如果算上其他国家和各企业的SRC中未公开的漏洞,每天发现的漏洞数将会更多。
从这些乱矢纷飞的漏洞里,我们摘选几个典型的与API安全相关的漏洞,做详细分析,以加深大家对OWASP API安全Top 10的理解。


一、OAuth绕过:价值$55,000 美元的漏洞

2020年3月1日,当全世界人民都忙于与新冠病毒的斗争时,漏洞赏金猎人Amol Baikar在其博客公布了一个Facebook OAuth框架权限绕过的漏洞,并称其获取了赏金$55,000美元。按照当日的美元汇率计算,奖金金额达38万元人民币之多。那么这个漏洞是如何形成的呢?下面我们就来一探究竟。

漏洞类型:API2 - 失效的用户身份认证

漏洞难度:高

报告日期:2019-12-16

信息来源:https://cybersecuritynews.com/facebook-account-take-over-vulnerability/


Facebook的登录功能遵循了OAuth 2.0授权协议,第三方网站(Instagram、Oculus、Netflix等)交换令牌时,攻击者通过劫持OAuth流,窃取应用程序的access_token,从而达到接管用户帐户的目的。


1.1 漏洞利用过程

Facebook正常的登录url格式如下:

https://www.facebook.com/connect/ping?client_id=APP_ID&redirect_uri=https://staticxx.facebook.com/connect/xd_arbiter.php?version=42#origin=https://www.domain.com


Facebook JavaScript SDK使用"/connect/ping"获取user_access令牌,并将“xd_arbiter”应用程序默认设置为白名单的URL进行重定向 。而在后台,SDK在初始化时会创建用于跨域通信的代理iframe,通过postMessage()API 收发令牌、授权状态。

攻击者通过测试发现,通过修改“xd_arbiter.php?v=42”、“xd_arbiter/?v=42”可以进一步添加更多路径和参数,但是令牌是hash后的值,要想获取access_token,最好的办法是通过类似Facebook JS SDK一样的代理框架,以劫持的方式在未hash之前将window.location.href中的值打印出来。类似于如下代码所示:

var frameName = window.location.href.split("#")[1];window.parent.postMessage(frameName,"*");


而恰好在staticxx.facebook.com域下,存在了提供上述代码功能的 js文件,于是攻击者利用了这个链接,如下:

https://staticxx.facebook.com/connect/xd_arbiter/r/7SWBAvHenEn.js?version=42


构造出来的登录链接格式如下所示,其中124024574287414是instagram的app_id,:

https://www.facebook.com/connect/ping?client_id=124024574287414&redirect_uri=https://staticxx.facebook.com/connect/xd_arbiter/r/7SWBAvHenEn.js?version=44#origin=https://www.instagram.com


最后,攻击者定制了Facebook JavaScript SDK,代码如下:

var app_id = '124024574287414',app_domain = 'www.instagram.com';var exploit_url = 'https://www.facebook.com/connect/ping?client_id=' + app_id + '&redirect_uri=https%3A%2F%2Fstaticxx.facebook.com%2Fconnect%2Fxd_arbiter%2Fr%2F7SWBAvHenEn.js%3Fversion%3D44%23origin%3Dhttps%253A%252F%252F' + app_domain;var i = document.createElement('iframe');i.setAttribute('id', 'i');i.setAttribute('style', 'display:none;');i.setAttribute('src', exploit_url);document.body.appendChild(i);window.addEventListener('OAuth', function(FB) {  alert(FB.data.name);},   !1);


运行起来之后,在受害者不知情的情况下,获取了access_token。

短兵:API安全典型漏洞剖析漏洞在上报后,很快得到了Facebook的响应,最终Facebook做了如下几项重要的修改:

1.不再允许对xd_arbiter做任何修改/篡改,仅接受绝对文件路径xd_arbiter.php

2.所有xd_arbiter的重定向均被阻止

3.从服务器上删除7SWBAvHenEn.js文件

4.使用/dialog/oauth/作为身份认证的核心接入点,禁用/connect/ping



1.2 漏洞启示

我们再来回顾一下整个攻击过程,如下图所示:

短兵:API安全典型漏洞剖析

在攻击达成的路径上,可修改xd_arbiter是第一个关键点,提供代理劫持框架的7SWBAvHenEn.js是第二个关键点。作为防守方,仅仅使用url白名单往往还不够。在面对跨域通信,尤其是在PC端、手机端、移动平板等不同类型设备不同浏览器的复杂情况下,即使使用“X-Frame-Options”也要考虑其兼容性问题。另外,当开发人员在引入某个设计时,在实现功能前提下的遵循简单原则,要考虑功能方便实现的同时,万一功能被黑客利用了如何提前做防护措施。


二、委托授权:啊!老板你账户上的钱不见了

在漏洞赏金平台上,高赏金的漏洞每年都有。2019年7月国外hackerone平台上报告了一个用户API相关的漏洞,paypal给出的赏金是$10,500美元,让我们一起来看看这个漏洞的细节。

短兵:API安全典型漏洞剖析

漏洞类型:API1 -失效的对象级授权和访问控制

漏洞难度:高

报告日期:2019-7-30

信息来源:https://hackerone.com/reports/415081


漏洞发生在paypal.com站点,在paypal的业务中,其账户可分以下两类:

1.企业账号(Business Account),也叫商业账号,具有PayPal高级账号的所有功能权限,主要面向企业管理用户。2.子账号(Secondary Account),也叫辅助账号,主要是方便企业账号管理下属员工,方便设置不同的管理功能,比如只能查看余额/只能退款/只能提现等。


企业账号通过委托授权子账号来管理资金,比如企业内的出纳和会计,在paypal平台对应于不同的子账号,出纳可以转账提现,会计可以查询和稽核。


2.1 漏洞利用过程

从上文的背景描述我们知道,企业账号A下可以设置子账号A1,攻击者对【查看子账号】的功能进行分析,其URL为

https://www.paypal.com/businessmanage/users/1657893467745278998,其中结尾的id号1657893467745278998表示的就是子账号绑定的企业账号。在此子账号查看操作过程中产生了一个PUT请求,报文内容如下所示:

PUT /businessmanage/users/api/v1/users? HTTP/1.1Host: www.paypal.comConnection: close[{"id":"1657893467745278998","accessPoint":{"privileges":[    "MANUAL_REFERENCE_TXN","VIEW_CUSTOMERS","SEND_MONEY"],    "id":"5994224506","accounts":["[email protected]"]    },"roleID":0,"roleName":"CUSTOM",    "privilegeChanged":true,"privilegeSecondaryName":"A1"  }]


通过测试验证,上述PUT请求中第一个id字段,即1657893467745278998可以替换为任意随机数值,第二个id字段,即5994224506代表了子账户id,而这第二个id字段只是简单的可枚举值,它的数值是可递增或递减的。攻击者仅仅需要篡改id值,比如5994224507,再访问/businessmanage/users,即可以查看到另一企业账户下子账号信息。
因为权限控制的问题,攻击者只需通过这种方式把相应子账户的密码进行修改,就可以实现完美的账户接管,进行任意未授权的转账操作。
此漏洞上报后,Paypal官方及时地进行了修复,并给予赏金猎人了$10,500美元的奖励。


2.2 漏洞启示

现在我们再来回顾一下整个攻击过程,如下图所示:

短兵:API安全典型漏洞剖析

从过程中我们可以看出,整个攻击链上,有关键性的两步:1)从当前企业账户下子账号切换到被攻击对象的企业账户下子账号;2)从查看被攻击对象的企业账户下子账号,权限扩展到子账户密码修改。在OWASP API安全Top 10中,这属于典型的失效的对象级授权和访问控制问题。作为系统开发者,除了要增强id值的随机性(防止简单的数字值被枚举)外,在对象的权限访问控制上,也要校验企业账户与子账号的绑定关系,这种绑定关系的校验,不仅是查看功能,还要包含密码修改等相关操作。
软件开发虽然不像交通生产那样严格,稍有失误就会导致生命个体的死亡。但开发人员一个小小的错误,也会导致大量资金的丢失,尤其是在涉及金融支付的场景下,更应小心验证。


三、密钥泄露:一不小心,你我就是在互联网上裸奔的那个人

进入2010年代以来,个人信息泄露问题越来越成为互联网关注的隐患。甚至,有专家学者认为,信息泄露问题将可能成为压垮互联网发展的最后一根稻草。在这个案例里,我们说的就是密钥泄露导致个人信息泄露的事情。

漏洞类型:API2 - 失效的用户身份认证

漏洞难度:中

报告日期:2020-2-5

信息来源:https://medium.com/@spade.com/api-secret-key-leakage-leads-to-disclosure-of-employees-information-5ca4ce17e1ce


因为隐私问题,漏洞提交者Ace Candelario公开资料中将可能被攻击企业化名为redacted.com,整个模拟攻击过程是从子域名收集开始的。


3.1 漏洞利用过程

在收集到的子域名中,Ace Candelario发现一个叫smh.internal.redacted.com的子域名,其功能是从Google重定向以进行员工登录进行身份验证用的。如果想登录该页面,则需要一个有效的员工电子邮件账号,类似于[email protected] redacted.com。

查看页面源代码后,他发现了一个JS文件:main.js,让他感到惊喜的是,js文件并没有混淆压缩,仅仅通过检查特定的关键字,例如公司名称redacted、域(隐藏域或内部子域名)、文件扩展名或明显的API路径、‘secret’、‘access[_|-]’、‘access[k|t]’、‘api[_|-]’、‘[-|_]key’、‘https:’、‘http:’等,就找到了Base64编码的身份验证凭据,也是HR系统API密钥。

短兵:API安全典型漏洞剖析


通过API文档的阅读,他快速验证JS文件中泄漏的API密钥是否仍在工作。并通过curl命令,可以轻松地从API接口获取员工列表。另外,还可以查看、删除、更新所有的员工信息。

短兵:API安全典型漏洞剖析

当然,漏洞提交后也很快通过官方的审核,并获取了$2,000美元的奖励。


3.2 漏洞启示

现在我们再来回顾一下整个攻击过程,如下图所示:

短兵:API安全典型漏洞剖析

从漏洞过程分析中我们可以看出,在整个模拟攻击中,获取API密钥成为了至关重要的一步。拥有了API密钥之后,才能通过API接口获取到员工信息。
从攻击者的角度看,如何创建自己的密钥关键字、通过关键字找到密钥、正确地读懂API文档、及时验证密钥的可用性,这些都是攻击者能力积累的体现。从防御者的角度看,将密钥存在js文件里、采用base64编码、js文件未混淆压缩都是败笔,方便了攻击者快速地获取了密钥信息。


四、大数据组件:挖矿病毒的温柔乡

随着虚拟货币市场的疯狂发展,挖矿病毒已经成为网络不法分子最为频繁的攻击方式之一。因挖矿病毒对算力的渴求,GPU服务器和大数据应用成为了挖矿病毒者眼里的香饽饽。2018年6月份腾讯云鼎实验室公开了一例针对Hadoop Yarn REST API挖矿病毒的详细报告,我们重点从API安全的角度,一起来看分析这个漏洞。

漏洞类型:API5- 失效的功能级授权和访问控制

漏洞难度:高

报告日期:2018-6-4

信息来源:https://cloud.tencent.com/developer/article/1142503


Hadoop Yarn大数据组件的Cluster Applications API对外提供了一系列的接口,其中就包含new application和submit application两个API[1]。分析报告中描述,攻击者利用Hadoop Yarn资源管理系统REST API未授权漏洞对服务器进行攻击,在未授权的情况下远程执行文件下载脚本,从而再进一步下载启动挖矿程序达到挖矿的目的。


4.1 漏洞利用过程

攻击者首先通过Hadoop Yarn的Cluster Applications API中的申请新application接口,生成新的application对象,如下所示:

curl -v -X POST'http://ip:8088/ws/v1/cluster/apps/new-application'返回内容类似于:{" application-id":" application_1527144634877_ 20465","maximum-resource-capbility":{"memory' :16384, "vCores' :8}}


接着,通过Submit Application的POST方法,提交生成带命令行的脚本。调用的Hadoop Yarn REST API如下图所示:

短兵:API安全典型漏洞剖析


而生成的脚本内容为下载挖矿的病毒程序,如下图:

短兵:API安全典型漏洞剖析

执行脚本下载挖矿程序到指定目录下,并重命名,再通过下载配置文件,给挖矿程序增加执行权限,然后以nohup命令后台运行挖矿程序并删除配置文件;并将脚本执行加入crontab任务中,每分钟执行一次。
当然,除了这些基本的入侵操作外,病毒还做不同层面的自身保护和冗余措施。但通过这new application和submit application两个API的调用,我们已明白了攻击者入侵的过程和引起问题的原因。


4.2 漏洞启示

我们借用腾讯云鼎实验室的图,对攻击过程做一下回顾:

短兵:API安全典型漏洞剖析

在整个攻击过程中,对Yarn的利用是突破的关键点,它完成了两项重要任务:1)创建了application,2)执行了下载挖矿程序的脚本。这些,都是挖矿病毒耐以生存下来的源头。

从攻击者的角度看,它仅仅是利用了Hadoop Yarn公开的API接口,构造了独特的攻击手段,从而达成攻击目的。而防御者自身对Hadoop Yarn REST API接口安全意识不足,没有禁止将接口开放在公网或启用Kerberos认证功能、禁止匿名访问是导致此漏洞发生的原因。

我们在把范围扩大一点,不但Hadoop Yarn有此类问题,Spark和Solr也存在。和当前案例一样,它们都是笔者亲身经历的,其中Solr的案例中,恶意攻击者将Solr中的数据清洗一空,给某电商企业造成了很大的损失。无论是安全从业者还是业务技术负责人,都应该吸取这样的教训,防患于未然。


五、小结

上述的四个案例,仅仅是众多API安全问题中很小的一部分。当我们今天坐下来讨论的时候,API安全并非新生事物,它已然积患已久,亟待整治。从NVD到各大互联网厂商的安全应急响应中心以及漏洞赏金平台,都有它频频闪现的身影,也着实提醒我们每一个安全从业者,需加强对它的重视。这和人类健康的治理一样,应大力倡导安全的生产方式和行为习惯,逐步“以治病为中心”转变到“以预防为中心”上来。


参考资料:

1.http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/ResourceManagerRest.html

2.https://www.cnblogs.com/junsec/p/11390634.html短兵:API安全典型漏洞剖析







原文始发于微信公众号(面具与甲虫):短兵:API安全典型漏洞剖析

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年9月3日12:08:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  短兵:API安全典型漏洞剖析 http://cn-sec.com/archives/589518.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: