已关闭
[Bug-Report|缺陷反馈]: GE 认证插件缺少 GetSignLength 导出时触发空函数指针崩溃 #537
KaranocaVe创建于 2 天前关闭于 19 小时前
2 天前 添加了label:bug-report
2 天前 关联了pull request:[Fix] 修复 GE 认证插件缺少 GetSignLength 时的空函数指针调用
wuzheng
1 天前 评论:
1 天前 评论:
感谢反馈,问题已确认。第 103 行 copy-paste 错误导致检查了 get_sign_data_proc 而非 get_sign_len_proc,缺少导出时会在第 112 行触发空指针调用。我们将修正指针检查并补充动态符号完整性测试。


1 天前 关联了pull request:fix: 认证插件缺少GetSignLength导出时触发空函数指针崩溃(#537)
KaranocaVe
19 小时前 评论:
19 小时前 评论:
问题已由基于 develop 的 PR !4547 修复并合入 develop,修复内容覆盖 GetSignLength 空指针检查及动态符号完整性回归测试,现关闭该 Issue。


19 小时前 关闭了 issue
问题描述
DeployerAuthentication::AuthSign在动态加载认证插件时获取GetSignLength函数指针,但检查语句错误地再次检查了
GetSignData指针。认证插件缺少必需的GetSignLength导出时,函数仍继续执行,并在生成签名后调用空的函数指针,导致调用进程异常终止,
而不是返回可诊断的认证失败状态。
环境信息
cann/ge/ffdcbc9f7496c17a98c1d12762c61ed608ef3503重现步骤
NewSignResult、DeleteSignResult、DataFlowAuthSign、GetSignData和GetSignLength,运行AuthSign作为成功对照。GetSignLength导出,保持其他符号和签名逻辑不变。DeployerAuthentication::Initialize加载该插件,然后调用AuthSign。预期结果
检测到认证插件缺少
GetSignLength时应返回FAILED并记录缺失符号,进程不应因空函数指针调用而异常终止。
实际结果
完整插件返回
initialize_status=0、auth_sign_status=0 sign_size=4,退出码为0。只缺少
GetSignLength的插件退出码为139(SIGSEGV),GDB 回溯显示在DeployerAuthentication::AuthSign的get_sign_len_proc(result)调用处。源码
dflow/deployer/deploy/deployer/deployer_authentication.cc:102-104获取长度函数后,第 103 行检查的是
get_sign_data_proc,不是get_sign_len_proc;第 112 行随后无条件调用后者。
日志/最小复现
Host 对照程序构建了两个仅相差一个导出的共享库。完整库运行退出码为
0;缺少长度导出的库运行退出码为
139,调用栈顶为空函数指针,下一帧为AuthSign。影响与规避方式
使用缺少必需导出的认证插件配置时,部署认证调用会直接终止进程,调用方无法获得
正常的失败返回值或执行清理逻辑。临时规避方式是确保插件同时导出全部认证接口;
实现侧应检查
get_sign_len_proc本身并在缺失时返回错误。建议的回归测试
增加动态符号完整性测试:完整插件的
AuthSign应成功;分别缺少NewSignResult、DeleteSignResult、DataFlowAuthSign、GetSignData或GetSignLength时均应返回FAILED,进程退出码保持为0,不得出现空函数指针调用。