码支付前台Service任意文件读取漏洞分析

码支付Android版前台Service漏洞可任意读取敏感文件

漏洞概述

码支付(MaPay)Android客户端存在前台Service组件任意文件读取漏洞,攻击者可通过构造恶意Intent绕过权限校验,利用未受保护的Service接口读取设备敏感文件。该漏洞属于高危级本地权限提升漏洞,可导致用户隐私数据泄露、支付凭证窃取等风险。


影响范围

  • 受影响版本:码支付Android客户端v3.5.0及之前版本
  • 触发条件:攻击者需诱导用户安装恶意应用或通过其他攻击链获取本地执行权限

技术分析

漏洞成因

  1. 前台Service导出风险
    码支付的FileTransferService组件在AndroidManifest.xml中声明为android:exported="true",未对调用方身份进行校验,允许任意应用通过隐式Intent与其交互。

  2. 路径遍历缺陷
    该Service的getFileContent()方法接收外部传入的文件路径参数,但未对路径进行规范化校验。攻击者可通过注入../等路径跳转字符(如../../data/data/com.mapay/databases/payment.db),突破沙箱限制,读取其他应用私有目录或系统敏感文件。


漏洞利用示例

Intent exploitIntent = new Intent();
exploitIntent.setComponent(new ComponentName("com.mapay", "com.mapay.service.FileTransferService"));
exploitIntent.putExtra("file_path", "../../system/etc/hosts");
context.startService(exploitIntent);

通过上述代码构造恶意请求,可直接获取/system/etc/hosts文件内容。


修复建议

  1. 组件权限加固
    在AndroidManifest.xml中为Service组件添加android:permission属性,限制只有授权应用可调用:

    <service android:name=".service.FileTransferService"
            android:exported="false"
            android:permission="com.mapay.permission.FILE_ACCESS"/>
  2. 输入路径校验
    对传入的文件路径进行正则过滤,禁止包含../等特殊字符:

    if (filePath.contains("..") || filePath.startsWith("/")) {
       throw new SecurityException("Invalid file path");
    }
  3. 沙箱隔离强化
    使用FileProvider定义文件访问白名单,限制Service只能访问应用私有目录:

    <paths>
       <files-path name="internal_files" path="."/>
    </paths>

总结

该漏洞暴露了支付类应用在组件安全设计上的缺陷。开发者需遵循最小化组件暴露原则,并对用户输入实施严格的边界检查。建议用户及时升级至码支付官方发布的最新版本(v3.5.1+)以消除风险。