Skip to content

更新下载:为写私有目录申请 MANAGE_EXTERNAL_STORAGE 属权限过申,且 APK 下载后未做完整性校验 #43

Description

@yunkst

文件: lib/services/github_release_service.dart:147-178

问题: downloadApk()Permission.storage.request() / Permission.manageExternalStorage.request() 申请存储权限后才把 APK 写到 getApplicationDocumentsDirectory()/updates/ 目录(161 行),再由 app_update_service.dart:247-249installUpdate() 通过平台通道 installApk 安装这个文件。

质量问题分两层:

  1. 权限申请完全多余getApplicationDocumentsDirectory() 是 app 私有沙箱目录(Android 上对应 filesDir),读写无需任何运行时权限。请求 Permission.storage(READ/WRITE_EXTERNAL_STORAGE)和 Permission.manageExternalStorage(MANAGE_EXTERNAL_STORAGE,属于敏感权限,Play 商店审查需特殊申报)会造成:

    • 用户看到无关的存储权限弹窗,体验差;
    • 权限被拒时直接 return false 中止下载(138-140 行),实际不影响下载,纯属误伤;
    • MANAGE_EXTERNAL_STORAGE 是"所有文件访问"级权限,为下载一个私有目录文件申请它属于明显的权限过申(Android 政策风险)。
  2. 下载文件无完整性校验:GitHub Release 旁边已发布 SHA256SUMS.txt(release workflow .github/workflows/flutter-release.yml:238-244 明确生成并上传),但客户端下载 APK 后不做 SHA256 校验直接交给 PackageInstaller 安装。下载过程中断/磁盘损坏/MiTM(在 usesCleartextTraffic=true 的 app 里,若 URL 是 http)会产生损坏或被替换的 APK 文件。官方页脚也教育用户"下载后用 SHA256SUMS.txt 验证完整性"(release_template.md),客户端自身却不做。

修复建议:

  • 删除 downloadApk 里的权限申请逻辑(私有目录不需要);
  • 下载完成后用 release asset 里的 SHA256SUMS.txt 或 asset.digest(GitHub API 提供 sha256)校验文件,校验失败删除文件并提示重试。

忽略指南:在 lib/services/github_release_service.dart:130 添加注释 // cr-ignore <CR_IGNORE_IID_HASH>: <你的理由>,下次审查会自动关闭。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions