落雪音乐+DLNA投屏 App 代码安全审计报告.即将发布,敬请期待
- 2026-09-26 03:08:26
报告日期:2026-09-18审计范围:源码、构建脚本、配置文件、Android 权限报告用途:公众号发布参考
审计结论
当前库未发现典型的木马行为,如隐蔽下载执行、窃取通讯录/短信/密码、远程 Shell、静默安装、提权或勒索式文件加密。
但发现一项高风险隐私行为(设备标识自动上报)及若干中低风险安全设计问题。因此,不能将当前版本评价为"无恶意或完全安全"。
一、中风险:启动时自动收集并上报设备标识
上报的数据
src/utils/deviceReport.ts 会收集以下信息:
Android 系统 ID ANDROID_ID(不同应用,不同签名都不同)App 内生成并持久化的 32 位随机 ID (多字符串形成的md5码) Android 平台标识:andriod 时间戳:当前时间 项目名称:lx-music
相关位置:
src/utils/deviceReport.ts:20-27src/utils/deviceReport.ts:48-73src/utils/deviceReport.ts:137-154
触发方式
应用进入首页且用户同意协议后,会自动执行:
src/core/init/index.ts:22-26检查更新时也会触发:
src/core/version.ts:23-25原生端说明
原生模块明确说明用途为:
位置:
android/app/src/main/java/cn/toside/music/mobile/devicereport/DeviceReportModule.java:44-52风险判断
这是稳定设备指纹信息。如果隐私政策没有明确说明采集字段、服务器、用途、保留期限和退出方式,或用户同意协议时未明确授权,可能构成未经充分告知的数据采集。
代码采用:
后台异步获取 失败静默处理 反爬 challenge 绕过逻辑 持久化设备 ID 服务端响应控制客户端功能是否显示
这些特征显著提高风险等级。
二、中风险:远程用户脚本执行能力
相关代码
项目允许加载用户提供的 JavaScript,并在 QuickJS 中执行:
android/app/src/main/java/.../userApi/UserApiModule.javaandroid/app/src/main/java/.../userApi/JavaScriptThread.javasrc/utils/nativeModules/userApi.ts
脚本权限
脚本能够向主应用请求网络访问:
request / cancelRequest / response / showUpdateAlert这是音乐源脚本功能,具有合理业务用途。目前没有证据表明内置代码主动加载恶意脚本。
风险点
作为高权限扩展机制:
第三方脚本可发起任意网络请求 恶意脚本可能将用户输入或播放信息外传 脚本更新源若被劫持,会形成供应链风险
三、中风险:APK 下载与安装缺少完整性验证
升级流程
从多个远程地址读取版本信息 从 GitHub Release 下载 APK 调用系统安装界面安装
相关位置:
src/utils/version.jsandroid/app/src/main/java/.../utils/UtilsModule.java
风险点
当前代码中未实现:
APK SHA-256 校验 下载文件签名证书校验 版本清单数字签名 防降级检查
此外,版本信息源中存在一个明文 HTTP 地址:
http://cdn.stsky.cn/lx-music/mobile/version.json可能被中间人修改,诱导错误升级信息。APK 本身来自 GitHub HTTPS,但仍建议删除 HTTP 源并校验安装包签名。
四、中风险:全局允许明文 HTTP
配置内容
网络安全配置:
位置:
android/app/src/main/res/xml/network_security_config.xml这意味着所有域名默认可以走明文 HTTP。
整改建议
改为默认禁止,只对白名单域名放行:
再用 domain-config 为确有需要的音乐源单独允许。
五、中风险:敏感权限范围较大
Manifest 权限
READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGEREQUEST_INSTALL_PACKAGESSYSTEM_ALERT_WINDOWREQUEST_IGNORE_BATTERY_OPTIMIZATIONS
权限用途分析
整改建议
按需申请,而非启动时统一申请 新 Android 版本改用媒体专用权限和系统文件选择器 若不使用应用内更新,移除 REQUEST_INSTALL_PACKAGES明确解释悬浮窗和电池优化用途
六、低至中风险:供应链与签名材料
Git 依赖
以下依赖来自 GitHub fork,并固定到提交:
react-native-background-timerreact-native-file-systemreact-native-local-media-metadatareact-native-track-player
固定提交比浮动分支安全,但这些依赖仍需单独审计。
CI Action 未固定到提交哈希
GitHub Actions 使用版本标签:
actions/*@v4softprops/action-gh-release@v2pkgdeps/git-tag-action@v3peter-evans/repository-dispatch@v2
建议使用完整 commit SHA 替代版本标签。
Release keystore 被放在仓库目录
发现:
android/app/lx-release.keystoreandroid/keystore.properties
重要:
确认是否已提交到 Git 历史 若曾泄露,立即轮换上传密钥 密码不要存入仓库 使用 CI Secret 或本地安全存储
七、未发现的典型恶意行为
在自有源码范围内没有确认发现:
缓存删除、APK 安装、DLNA 局域网 UDP、QuickJS 音源脚本等命中均有对应业务用途。
十一、DLNA 投屏模块安全分析
模块概述
DLNA 投屏功能由以下文件组成,实现局域网内音视频设备发现与控制:
src/core/dlna.ts# TypeScript 业务逻辑层src/utils/nativeModules/dlna.ts# TypeScript Native 接口声明android/.../dlna/DlnaModule.java# Java 原生模块入口android/.../dlna/AvTransportControl.java# UPnP AVTransport SOAP 控制android/.../dlna/DlnaDiscoveryManager.java# SSDP 设备发现管理器android/.../dlna/DlnaDevice.java# 设备数据模型android/.../dlna/SsdpResponseParser.java# SSDP 响应解析器
网络行为分析
239.255.255.250:1900 | |||
安全特性检查
✅ 已实现的防护措施:
XXE 防护:XML 解析器已禁用外部实体和 DOCTYPE 声明 java // DlnaDiscoveryManager.java:189-191 factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); factory.setFeature("http://xml.org/sax/features/external-general-entities", false); factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);请求体大小限制:设备描述 XML 限制在 1MB 以内 java // DlnaDiscoveryManager.java:208-220 static byte[] readLimited(InputStream input, int maxBytes)超时保护:所有 HTTP 连接设置 5 秒超时 java // AvTransportControl.java:130-131 connection.setConnectTimeout(5000); connection.setReadTimeout(5000);无外部网络请求:DLNA 模块仅在局域网内通信,不向外部服务器发送数据 无设备标识采集:不收集或上报设备指纹信息
⚠️ 发现的风险点
位置:DlnaModule.java:144
// Convert https:// to http:// so LMS can handle itString sendUrl = url.startsWith(”https://”) ? ”http://” + url.substring(8) : url;
风险:将 HTTPS 媒体 URL 强制转换为 HTTP,可能导致:
媒体流在传输过程中被窃听 中间人攻击风险 部分 CDN 可能拒绝非 HTTPS 请求
建议:除非目标设备明确不支持 HTTPS,否则应保持原始协议。
(注解:采用https达菲数播的DLNA无法识别音乐流)
位置:多处 HTTP 请求
connection.setRequestProperty(”User-Agent”, ”Android UPnP/1.1 LXMusic/1.0”);风险:暴露应用名称和版本号,可能被用于针对性攻击。
建议:使用更通用的 User-Agent 或随机化版本号。
位置:SsdpResponseParser.java:31-37
static String extractDeviceId(String usn, String location) {// 直接使用设备返回的 USN 或 location 作为设备 ID}
风险:设备 ID 取自局域网设备返回的数据,若设备被恶意替换,可能影响后续控制目标。
建议:增加设备指纹校验或使用固定配对机制。
权限需求
DLNA 模块需要以下 Android 权限:
这些权限属于正常网络功能权限,无过度授权问题。
DLNA 模块安全评级
综合评级:🟡低风险(核心功能安全,存在协议降级问题)
十二、风险评级总表
九、总结与建议
核心问题
ANDROID_ID 和持久化 ID 的自动上报。这是目前最接近"用户可能认为是恶意行为"的代码。
分级整改建议
近期整改:
校验 APK 签名和哈希 将 HTTP 版本检查源改为 HTTPS 收紧网络安全配置为白名单模式
长期建议:
固定 CI Action 到 commit SHA 将 keystore 移出仓库,使用 CI Secret 对第三方依赖进行定期安全审计
十三、受影响文件清单
src/utils/deviceReport.ts | ||
android/.../devicereport/ | ||
src/utils/nativeModules/userApi.ts | ||
src/utils/version.js | ||
network_security_config.xml | ||
android/app/lx-release.keystore | ||
android/keystore.properties | ||
DlnaModule.java:144 |
本报告基于静态代码分析,未执行任何可疑代码。部分行为(如动态脚本运行时的网络请求)需要运行时审计才能完全排除。