Flutter 3.47.8 安全升级该怎么做

把 Flutter SDK 从 3.47.7 改成 3.47.8,并不能单独构成一次完整的安全升级。本次发布组合是 Flutter 3.47.8 与 Dart 3.13.7,紧急点来自 eMudhra 中间 CA 私钥泄露:在具备网络路径时,攻击者可能伪造任意域名的有效 TLS/HTTPS 证书。

“受影响版本下界”也容易误判。现有资料没有给出可核验的精确范围,因此不能断言“3.47.7 及以下全部存在同一漏洞”;更稳妥的做法是检查所有更早版本并升级到上述组合,同时审计应用是否存在绕过证书验证的实现。

先弄清 3.47.8 修的是什么

浏览器和操作系统已经通过紧急中间证书黑名单应对 eMudhra 事件,但 Android、Windows 和 Linux 上的 dart:io 使用内置 BoringSSL 验证 TLS 证书链,不能直接读取操作系统的中间证书黑名单。因此,Flutter 3.47.8 的关键动作是更新 BoringSSL,在 TLS 验证阶段直接阻止受影响的中间证书。

在 Android 14 及以上系统中,dart:io 还会从可更新的 Conscrypt APEX 模块加载系统根证书,使未来的根证书撤销能够自动生效。

判断项 可确认的结论 操作
目标 Flutter 3.47.8 精确固定 SDK 版本
配套 Dart 3.13.7 确认使用 Flutter 随附的 Dart SDK
更早版本 精确受影响下界尚未得到现有资料确认 全部检查并升级,不直接标记为“同一漏洞”
风险场景 Android、Windows、Linux 上通过 dart:io 进行的标准 TLS 校验 在这些平台分别验收

3.47 系列还涉及 libpng 安全问题、Windows 外接纹理崩溃和 Linux 触摸事件内存泄漏等修复。 这些问题应按各自补丁记录核对,不能替代 3.47.8 针对 CA 信任链和 BoringSSL 的修复与验收。

升级命令按这个顺序执行

先记录当前环境,避免只依赖 IDE 中的版本显示:

flutter --version
dart --version
flutter doctor -v

随后使用团队现有的 SDK 管理方式切换到 Flutter 3.47.8 这一精确版本,并再次运行上述命令,确认 Dart 为 3.13.7。需要固定版本时,不要使用始终追随渠道最新版的升级方式,否则 CI 和开发机可能逐渐落到不同 SDK。

依赖没有明显变化时先执行:

flutter pub get
flutter pub outdated

flutter pub outdated 用于发现可调整的依赖;修改 pubspec.yaml 后重新执行 flutter pub get。随后执行静态检查和测试:

flutter analyze
flutter test

按实际发布目标选择构建命令,不要全部执行:

flutter build apk --release
flutter build appbundle --release
flutter build ios --release
flutter build macos --release
flutter build windows --release
flutter build linux --release

如果遇到缓存或生成文件异常,再清理并恢复依赖,不要把 flutter clean 当成每次升级的固定步骤:

flutter clean
flutter pub get

普通编译错误应先检查插件版本和 Android 工程配置,再考虑清理缓存;历史升级案例也显示,插件兼容问题往往比 Flutter 主版本本身更早暴露。 最后在 CI 中固定 Flutter 3.47.8,并在任务开始时校验 Dart 3.13.7,缓存键应同时包含 SDK 版本与依赖锁文件,避免浮动版本造成构建漂移。

兼容性检查:工具链、UI 包与 TLS

Android 侧应重点检查 Java、Gradle、Kotlin、推送插件及 Gradle 实际使用的 JDK。旧教程中的 Gradle 7.0+、Java 11、compileSdkVersion 31 属于特定历史升级环境,不能直接当作 Flutter 3.47.8 的固定要求;还需核对 Kotlin 版本,并确认华为推送等插件满足当前 Android Gradle Plugin 与插件自身的约束。

Apple 侧应核对当前 Xcode、iOS deployment target 和 macOS deployment target。Flutter 3.47 已包含面向 Xcode 27、iOS 27 和 macOS 27 的适配迁移,但现有资料没有给出可直接套用的统一 Xcode 版本,最终仍以当前工程和目标平台构建结果为准。

Material 与 Cupertino 的旧导入方式在 3.47 中仍然可用,需要迁移时执行:

dart fix --apply --code=migrate_design_widgets

早期版本的迁移工具可能没有正确更新 pubspec.yaml。只添加实际使用的软件包,然后重新执行迁移:

flutter pub add material_ui
flutter pub add cupertino_ui
dart fix --apply --code=migrate_design_widgets

如果应用或第三方 package 同时依赖旧版 package:flutter/material.dart 和独立的 package:material_ui/material.dart,迁移期可能出现类型、主题和本地化不兼容,可使用 MaterialUiCompatibilityBridge 过渡。

TLS 验收必须走应用内 dart:io 的真实请求路径,浏览器或 curl 成功不能替代这项验收,因为不同运行环境使用的证书信任链实现并不相同。 Android、Windows 和 Linux 都应完成 release 构建并发起标准 HTTPS 请求;Android 14+ 至少覆盖一台系统组件已更新的真机。若项目使用自定义根证书或额外信任逻辑,需要单独审计,确认信任范围没有被扩大。

当相关目标平台构建通过、标准 HTTPS 请求完成正常握手和响应、测试证书链按预期被拒绝,并且代码中没有通过忽略证书验证来绕过报错时,Flutter 3.47.8 安全升级才算完成验收。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容