已关闭
[Requirement|需求建议]: 模型类相关对象防UAF #343
贾绍扬创建于  4月8日关闭于  4月21日
贾绍扬成员
4月8日 创建

Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.

Backgroud(背景信息)

在多线程 Runtime 环境中,资源的异步销毁常导致 UAF (资源销毁后仍被访问)和handle无类型校验隐患。通过引入一个 rtInnerObject 包装层,将用户持有的句柄与真实的物理资源解耦然后通过magic字段来防止UAF问题和校验handle类型。

Origin(信息来源)

runtime

Benefit / Necessity (价值/作用)

  1. 重构后可以对传入的句柄类型做校验
  2. 防UAF

Design(设计方案)

(1)创建资源对象的句柄结构体

  • 在类中新增 rtInnerObject handle_; 成员,并提供 rtInnerObject* GetInnerHandle() 方法。
  • 在 Setup 方法成功返回前的最后一步调用 InitEmbeddedInnerHandle(this),对句柄结构体进行初始化。
  • 创建/出参类API层获取真实对象后,直接通过 ExportEmbeddedHandle(ObjectT *realObj)或StoreOptionalEmbeddedHandle(ObjectT *realObj, HandleT *handleOut) 赋值给返回参数。

(2)API使用对象时进行合法性校验

  • 在执行任何业务操作前(入参类接口),必须通过宏RT_VALIDATE_AND_UNWRAP_OBJECT或RT_VALIDATE_AND_UNWRAP_OBJECT_ARRAY校验。
  • 读取magic值:通过 load() 获取当前的 Magic。
  • 类型检查:若 Magic 与预期不符,拦截并报错(防范句柄类型传错)。
  • UAF 拦截:若 Magic 为 0,识别为资源已注销。

(3)资源句柄销毁流程

  • 失效时机:Model在调用TearDown方法的前一行,Label在CondLabelDestroy的第一行调用 ResetEmbeddedInnerHandle(),将句柄结构体失效,magic设置为0。
  • 句柄为资源类对象的内置变量,在对象析构的时候会销毁。
likedislike
贾贾绍扬成员
4月8日 添加了label:requirement
贾绍扬成员
4月8日 评论:

/assign

likedislike
CANN-robotCANN-robot成员
4月8日 将 jia_shaoyang 设为负责人
贾贾绍扬成员
4月16日 修改了issue 的描述
贾贾绍扬成员
4月21日 issue状态由 进行中 改变为 已完成
贾贾绍扬成员
4月21日 关闭了 issue