| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
!20279 merge FixSongjianAI-sty into master 修复送检主干告警问题 Created-by: SKY2001 Commit-by: SKY2001 Merged-by: openharmony_ci Description: https://gitcode.com/openharmony/ability_ability_runtime/issues/16038?ref=&did=4272928#tid-4272928 See merge request: openharmony/ability_ability_runtime!20279 | 17 天前 | |
!20357 merge free into master fix: JsServiceExtension析构先摘除JsExtensionCommon避免jsObj_ UAF Created-by: zhangyuhang72 Commit-by: zhangyuhang72 Merged-by: openharmony_ci Description: **IssueNo**: #16114 **Description**: 修复 JsServiceExtension 析构时 jsObj_ 先于 JsExtensionCommon 释放导致的 use-after-free。低内存回收路径下,晚到的 OnMemoryLevel 回调经 extensionCommon_->OnMemoryLevel() 命中已被释放并 poison 的 NativeReference,在 jsObj_.GetNapiValue() 崩溃(现场 x9=0xFFFFFFFFFFFFFFFF 全1 poison)。在 ~JsServiceExtension 中 FreeNativeReference(jsObj_) 之前先 SetExtensionCommon(nullptr),使 JsExtensionCommon 先于 jsObj_ referent 销毁,晚到的回调在 ExtensionBase 层被 if(!extensionCommon_) 拦掉。仅析构函数增加 1 行,无接口/行为变更。 **稳定性自检:** | 自检项 | 自检结果 | | ------------------------------------------------------------ | -------- | | 涉及跨进程调用的相关操作需要抛至主线程或加锁防止并发 | 不涉及 | | 成员变量进行赋值或创建需要排查并发 | 已排查(SetExtensionCommon 在主线程析构执行,无并发) | | 谨慎在lambda表达式中使用引用捕获 | 不涉及 | | 谨慎在未经拷贝的情况下使用外部传入的string、C字符串 | 不涉及 | | map\vector\list\set等stl模板类使用时需要排查并发 | 不涉及 | | 谨慎考虑加锁范围 | 不涉及 | | 在IPC通信中谨慎使用同步通信方式 | 不涉及 | | 禁止传递this指针至其他模块或线程(特别是eventhandler任务) | 不涉及 | | 禁止将外部传入的裸指针在内部直接构造智能指针 | 不涉及 | | 禁止多个独立创建的智能指针管理同一地址 | 不涉及 | | 禁止在析构函数中抛异步任务 | 已排查(本次未新增异步任务;既有 FreeNativeReference 走 uv_queue_work 为既有逻辑,本次未改动) | | 禁止js对象在非js线程(例如在IPC线程)创建、使用或销毁 | 已排查(SetExtensionCommon 在主线程析构执行) | | 禁止在对外接口中未经判空直接使用外部传入的指针 | 不涉及 | | 禁止接口返回局部变量引用 | 不涉及 | | 禁止在信号函数中加锁 | 不涉及 | | 禁止在关键流程(SA启动、应用启动等主流程)执行耗时的操作 | 不涉及 | | 禁止将同一个cpp编译在不同的so中 | 不涉及 | **安全编码自检:** | 自检项 | 自检结果 | | -------------------------------------------------------------- | -------- | | 裸指针避免通过隐式转换构造为sptr | 不涉及 | | json对象在取值之前必须先判断类型,避免类型不匹配 | 不涉及 | | 序列化时必须对传入的数组大小进行校验,避免出现超大数组 | 不涉及 | | 避免使用未明确位宽的整型,选择使用int8_t、uint8_t等类型 | 不涉及 | | 外部传入的路径要做规范化校验,对路径中的.、..、../等特殊字符严格校验 | 不涉及 | | 指针变量、表示资源描述符的变量、bool变量必须赋初值 | 不涉及 | | readParcelable获取的对象使用前需要判空 | 不涉及 | | 分配和释放内存的函数需要成对出现 | 已排查(本次未改内存分配/释放) | | 申请内存后异常退出前需要及时进行内存释放 | 不涉及 | | 内存申请前必须对内存大小进行合法性校验 | 不涉及 | | 内存分配后必须判断是否成功 | 不涉及 | | 禁止使用realloc、alloca函数 | 不涉及 | | 禁止打印文件路径、口令等敏感信息,如有需要,使用private修饰 | 不涉及 | | 禁止打印内存地址 | 不涉及 | | 整数之间运算时必须严格检查,确保不会出现溢出、反转、除0 | 不涉及 | | 禁止对有符号整数进行位操作符运算 | 不涉及 | | 禁止对指针进行逻辑或位运算 | 不涉及 | | 循环次数如果收外部数据控制,需要检验其合法性 | 不涉及 | | 禁止使用内存操作类危险函数,需要使用安全函数 | 不涉及 | | 谨慎使用不可重入函数 | 不涉及 | | 必须检查安全函数的返回值,并进行正确处理 | 不涉及 | | 禁止仅通过TokenType类型判断绕过权限校验 | 不涉及 | **TDD Result**: 不涉及(单行析构防御性修复,无新增对外接口;建议跑 ability_runtime extension 相关单测验证无回归) **XTS Result**: 不涉及 ### 是否已执行L0用例 - [ ] 已验证 - [x] 不涉及。如不涉及,请写明理由:单行析构防御性修复,无新增对外接口、无行为语义变更,不涉及 L0 用例 ### AI检视评分(使用本地代码检视skills扫描): 100/100,approve(security+logic 双维度通过;详见下方 AI 检视报告) --- ## AI 检视报告(codecheck) <!-- codecheck-report-metadata:start --> yaml codecheck_report: schema_version: "1.0" scope: "js_service_extension.cpp 析构 UAF 修复(1行新增)" round: 1 commit_id: "130a5ca8e490647f9cbe4f92feda378048c03d26" change_id: "I228a6888931f9dadf5ba87d68940b9d715b90ef4" report_id: "I228a6888931f9dadf5ba87d68940b9d715b90ef4-R1" date: "2026-09-03" gate_decision: "approve" risk_level: "low" score: 100 dimensions_required: ["security", "logic"] dimensions_executed: ["security", "logic"] findings_total: 0 findings_by_severity: {p0: 0, p1: 0, p2: 0, p3: 0} gate_blockers: [] must_fix: [] followups: 1 <!-- codecheck-report-metadata:end --> ### 1. 门禁结论 | 项目 | 结论 | |---|---| | 决策 | **approve** | | 风险等级 | 🟢 low | | 评分 | **100/100** | | 阻塞项 | 无 | | 必须修复(P0/P1,本变更引入) | 0 项 | | 建议跟进(同类存量风险,非本变更引入) | 1 项 | **一句话结论**:本变更为单行防御性修复,在 ~JsServiceExtension 中 FreeNativeReference(jsObj_) 之前先 SetExtensionCommon(nullptr),使持 NativeReference& 无判空守卫的 JsExtensionCommon 先于 jsObj_ referent 销毁,闭合低内存回调 UAF 路径;变更本身未引入任何缺陷(无双重释放/重入/竞态/泄漏),评分 100,准予合入。G 类同类横扫发现 5 个姊妹 Extension 存在相同生命周期倒置写法,列为跟进项(非本变更引入,建议另起 CR 移植)。 ### 2. 扣分原因 (approve,本节省略。) ### 3. 必须立即处理(P0/P1,本变更引入) 无。 ### 4. 建议跟进(同类存量风险,非本变更引入) | ID | 优先级 | 问题 | 建议行动 | 排期 | |---|---|---|---|---| | FU-001 | P1(存量,非本变更引入) | 5 个姊妹 Extension 与本变更同一"生命周期倒置"写法:析构先 FreeNativeReference(jsObj_)、基类析构才 reset extensionCommon_,低内存回调同样可命中已释放的 NativeReference(UAF) | 另起 CR,按本变更同样方式在各析构 FreeNativeReference(jsObj_) 之前加 SetExtensionCommon(nullptr) | 下一补档 | ### 5. 分维度速览 | 维度 | 结果 | 关键说明 | |---|---|---| | security-scanner | 通过 | Core 11 项:③UAF/生命周期——本变更是 UAF 的**修复**,验证 SetExtensionCommon(nullptr) 经 shared_ptr 引用计数释放 JsExtensionCommon,shellContextRef_ 由 shared_ptr 双引用(JEC + JSE 各持一份),两次 FreeNativeReference 仅各 drop 一个引用、由 refcount 保证唯一删除,**无双重释放**;⑥资源泄漏——shared_ptr RAII,无新增泄漏;⑤竞态——析构单线程(主线程)执行,无新增 data race;⑩类安全——JsExtensionCommon/ExtensionCommon 虚析构完备。G 类横扫:命中 5 处姊妹同类写法(见 FU-001)。其余维度 N/A(无 IPC/反序列化/外部输入/敏感信息)。 | | logic-scanner | 通过 | 控制流:未新增分支/死代码;数据流:SetExtensionCommon 实现仅 extensionCommon_ = common(extension_base.inl:121),传 nullptr 即 reset shared_ptr,无未初始化;状态机:不触及 lifecycleState_(在 ExtensionImpl),无非法转换;边界:SetExtensionCommon 接受 nullptr,无空指针解引用;错误处理/并发:析构内单线程同步调用,无遗漏路径;业务规则:修复后不变式"JsExtensionCommon 先于 jsObj_ referent 销毁"成立,正是本变更目的。 | ### 6. 关键发现详情 #### [FU-001] 姊妹 Extension 同类生命周期倒置写法(P1 存量,scanner=security-scanner G 类横扫) - **位置**(均未加 SetExtensionCommon(nullptr) 守卫): - frameworks/native/ability/native/js_app_service_extension.cpp:123(dtor 释放)+ :164(Create 绑定引用) - frameworks/native/ability/native/ui_service_extension_ability/js_ui_service_extension.cpp:133 + :179 - frameworks/native/ability/native/auto_fill_extension_ability/js_auto_fill_extension.cpp:125 + :175 - frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp:131 + :186 - frameworks/native/ability/native/ui_extension_base/js_ui_extension_base.cpp:125 + :175 - frameworks/native/ability/native/form_runtime/js_form_extension.cpp:100 - **触发路径**:与本 CR 修复的 bug 同类——低内存回收路径下 NativeReference(jsObj_) 被释放并 poison,晚到的 OnMemoryLevel/OnConfigurationUpdated 经 extensionCommon_->... 命中已释放 referent,GetNapiValue() 崩。 - **影响**:与本次崩溃同类的 UAF 崩溃,存在于上述 5 个 Extension,本 CR 未覆盖。 - **证据**:上述文件均出现 jsRuntime_.FreeNativeReference(std::move(jsObj_));(dtor)与 JsExtensionCommon::Create(jsRuntime_, static_cast<NativeReference&>(*jsObj_), shellContextRef_)(绑定非拥有引用)的组合,且 dtor 中释放 jsObj_ 前无 SetExtensionCommon(nullptr)。 - **建议**:另起 CR,在各 dtor FreeNativeReference(std::move(jsObj_)) 之前加 SetExtensionCommon(nullptr);,与本 CR 修复一致。不阻塞本 CR 合入。 ### 7. 变更影响面确认 - 变更内容:frameworks/native/ability/native/js_service_extension.cpp ~JsServiceExtension 析构函数新增 1 行 SetExtensionCommon(nullptr);,位于 context->Unbind() 之后、FreeNativeReference(std::move(jsObj_)) 之前。 - context->Unbind() 不触及 extensionCommon_;其后两处 FreeNativeReference 均不使用 extensionCommon_;基类 ~ExtensionBase(= default)隐式析构 extensionCommon_ 成员时已为 nullptr,无重复释放。 - SetExtensionCommon(nullptr) 触发 ~JsExtensionCommon 同步执行,其内仅 jsRuntime_.FreeNativeReference(std::move(shellContextRef_))(异步 uv_queue_work,既有行为,非本次新增异步任务),不回弹至半析构的 JsServiceExtension,无重入风险。 - 结论:变更闭合本次 UAF 受害路径,未引入新缺陷。 See merge request: openharmony/ability_ability_runtime!20357 | 17 天前 | |
perf(build): enable size_optimize_config on 130 SO targets Add a new services/common:size_optimize_config (same flags as optimize_config minus the explicit -flto=full, so the toolchain's global ThinLTO mode is preserved) and apply it to the 130 ohos_shared_library targets that previously shipped without any optimization config, so unreferenced functions/data are dropped at link time and ROM shrinks without overriding the global LTO policy. -Wl,--gc-sections is an ELF-only linker flag: Apple ld rejects it, so both optimize_config and size_optimize_config now add it only when current_os != "mac", keeping the darwin SDK host build (which links dylibs with -dead_strip) working. Co-Authored-By: Agent Signed-off-by: RuiChen_01 <chenrui193@huawei.com> AI[100%] Human Fixed[0%] Human[0%] AI Adopted[100%] Co-authored-by: claude (glm-5.3) <ai@local> | 1 个月前 |