Skip to content
On this page

文章来自:https://www.usenix.org/system/files/sec22-zhang-lei.pdf

这篇文章分析的对象是各种小程序平台,比如微信,tiktok,头条等,这些app上面可以运行各种小程序,但是因为实现方式存在各种各样的问题,导致了越权漏洞.

文章应该说是从微信的一个漏洞推广出去,作为因子,分析了众多的知名小程序平台,发现都存在各种各样的问题.

微信小程序的漏洞描述

image-20220822100411525

主要是存在三个问题:

    1. 微信小程序平台域名校验有问题,导致误报其他域名的网页当做拼多多的小程序
    1. 拼多多小程序后端server没有对签名api这么重要的api做鉴权保护
    1. 微信小程序平台私有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

image-20220822101838607

常见的域名校验问题

白名单机制

白名单校验机制在小程序平台,但是白名单的提供方在小程序,两种对于校验规则的理解不一致,导致出问题. 比如 小程序平台以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 越权

    1. 小程序平台的私有api没有保护好
    1. 小程序的特权api,比如签名api,没有保护好.

其他

从一个漏洞推广开来的方法论

从微信的一个漏洞,推广到所有平台,如果只是微信的一个漏洞,是形不成高质量的论文的. 小程序本身是一个比较小的领域,但是近年来顶级app基本都支持了这个特性,导致其影响范围其实不小.

分析过程值得学习

比如Capability confusion analysis :

  1. 静态分析,提前相邻的api
  2. 看看动态调用的结果
  3. 如果某个api总是在privileged API之前被调用,那么他就是一个secret api.

文章提到的一个修复建议

A system for uniform and fine-grained access control for web code on android