Appearance
文章来自:https://www.usenix.org/system/files/sec22-zhang-lei.pdf
这篇文章分析的对象是各种小程序平台,比如微信,tiktok,头条等,这些app上面可以运行各种小程序,但是因为实现方式存在各种各样的问题,导致了越权漏洞.
文章应该说是从微信的一个漏洞推广出去,作为因子,分析了众多的知名小程序平台,发现都存在各种各样的问题.
微信小程序的漏洞描述
主要是存在三个问题:
- 微信小程序平台域名校验有问题,导致误报其他域名的网页当做拼多多的小程序
- 拼多多小程序后端server没有对签名api这么重要的api做鉴权保护
- 微信小程序平台私有api,保护不到位,可以被小程序调用(下载,按照app的. 估计其他平台多半也有这样的功能)
tiktok的漏洞
“window.location.href = htttp://maliciousbenign.com”. Since “htttp” is not a supported scheme, this URL will trigger the race condition of onPageStarted.
alipay的漏洞
alipay的问题在于hidden api(一个rpc api) 不应该被小程序调用,但是没有做保护,导致任意小程序都可以操作rpc api.
小程序 身份标识
平台识别小程序主要有两个:
- 域名 限制加载的范围
- appid 限制api的访问范围
- Capability 精细化授权,小程序可以访问那些api. 只有微信以及UnionPay有,其他都没采用.
几种越权场景
基于域名认证的
Domain Name Confusion
常见的域名校验问题
白名单机制
白名单校验机制在小程序平台,但是白名单的提供方在小程序,两种对于校验规则的理解不一致,导致出问题. 比如 小程序平台以endsWith来校验小程序提供的名单,但是小程序提供了bengin.com,导致maliciousbenign.com可以通过校验
url parsing有问题
https://benign.com:x@ malicious.com 正确的域名应该是malicious.com,但是却识别为bengin.com, 多半见于正则表达式识别.
javascript:// 没有正确识别
目前应该比较少才对,loadUrl("javascript://alert(3)")
嵌套iframe问题
evil 故意嵌套一个合法的域名,或者反过来,合法的域名有漏洞,可以将一个evil.com嵌套在它的iframe中
域名越权的poc
javascript
//JavaScript
window.setInterval(function(){
res = nativeInterface.framelessPostMessage(’
{"id":1,"func":"authentication.getAuthToken"," args":[["privileged.com"]]}’);
//res can be leaked to malicious server
... ...
},1500);
window.location.href = "https://privileged.com/";
通过frame来越权
malicious.com 作为 privileged.com的一个iframe出现
因为小程序是比较广泛的,难免有某个小程序实现不严谨,存在这样的问题.
appid越权
冒充其他小程序,举的例子都是根据域名来做小程序身份判断的.
Capability 越权
- 小程序平台的私有api没有保护好
- 小程序的特权api,比如签名api,没有保护好.
其他
从一个漏洞推广开来的方法论
从微信的一个漏洞,推广到所有平台,如果只是微信的一个漏洞,是形不成高质量的论文的. 小程序本身是一个比较小的领域,但是近年来顶级app基本都支持了这个特性,导致其影响范围其实不小.
分析过程值得学习
比如Capability confusion analysis
:
- 静态分析,提前相邻的api
- 看看动态调用的结果
- 如果某个api总是在privileged API之前被调用,那么他就是一个secret api.
文章提到的一个修复建议
A system for uniform and fine-grained access control for web code on android