登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
登录
注册
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
10
Star
2
Fork
35
openEuler
/
libarchive-rust
代码
Issues
12
Pull Requests
0
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
当前libarchive-rust中无法解决内存类安全问题
待办的
#I5XXDC
缺陷
huangduirong
成员
创建于
2022-10-27 00:30
## 关于当前libarchive-rust中无法解决内存类安全问题的分析 C语言中内存类的安全问题主要包含越界、重复释放、内存未释放等场景,根据libarchive的历史漏洞情况分析,存在大量的内存越界的情况。 以CVE-2020-21674为例,社区修复方案如地址所示:https://github.com/libarchive/libarchive/commit/4f085eea879e2be745f4d9bf57e8513ae48157f4 主要的原因是因为文件archive_string.c的函数*archive_string_append_from_wcs*在进行数据扩展拷贝的时候,未考虑可能会超出len * 2的场景,因此未申请足够的内存,从而导致后续在执行wctomb进行内存拷贝是出现越界。修改的代码逻辑如下图:  根据现有libarchive-rust现有的实现逻辑,也是重新申请内存,并且通过调用*wcrtomb*进行内存的拷贝,假设该漏洞在原有C代码中没有被修复,是错误的逻辑,会导致转换出来的RUST代码也是一样会存在相同的漏洞,出现内存越界。  因此根据现有的例子分析,当前使用C2Rust转换后的代码,直接将指针传入到Rust中直接进行操作,并无法解决内存类的安全问题,未充分利用Rust本身安全的特点。 #### 优化建议 当前重写的所有代码中,大部分的接口参数都是*struct archive_string*类型的指针,建议探索一种封装的方法,将C与Rust间不安全的调用独立封装出来,核心业务逻辑使用safe的方法进行编译,从而减少不安全的代码段。 C->unsafe Rust fn->C 优化为: C->unsafe Rust fn(适配层)->safe Rust fn(核心逻辑)->unsafe Rust fn(适配层)->C #### 参考示例 unsafe的代码段建议能够降低到3%以下。(例如https://gitee.com/openeuler/sysmaster中unsafe的代码段小于1%,从实际的效果上看,基本未出现过内存类的问题) 关于C与Rust的指针调用的方式,也内部咨询以及查询了相关资料,可以作为参考: 1、https://dev.to/kgrech/7-ways-to-pass-a-string-between-rust-and-c-4ieb 2、可以参考Rust中现有的对glibc的封装库中的实现。
## 关于当前libarchive-rust中无法解决内存类安全问题的分析 C语言中内存类的安全问题主要包含越界、重复释放、内存未释放等场景,根据libarchive的历史漏洞情况分析,存在大量的内存越界的情况。 以CVE-2020-21674为例,社区修复方案如地址所示:https://github.com/libarchive/libarchive/commit/4f085eea879e2be745f4d9bf57e8513ae48157f4 主要的原因是因为文件archive_string.c的函数*archive_string_append_from_wcs*在进行数据扩展拷贝的时候,未考虑可能会超出len * 2的场景,因此未申请足够的内存,从而导致后续在执行wctomb进行内存拷贝是出现越界。修改的代码逻辑如下图:  根据现有libarchive-rust现有的实现逻辑,也是重新申请内存,并且通过调用*wcrtomb*进行内存的拷贝,假设该漏洞在原有C代码中没有被修复,是错误的逻辑,会导致转换出来的RUST代码也是一样会存在相同的漏洞,出现内存越界。  因此根据现有的例子分析,当前使用C2Rust转换后的代码,直接将指针传入到Rust中直接进行操作,并无法解决内存类的安全问题,未充分利用Rust本身安全的特点。 #### 优化建议 当前重写的所有代码中,大部分的接口参数都是*struct archive_string*类型的指针,建议探索一种封装的方法,将C与Rust间不安全的调用独立封装出来,核心业务逻辑使用safe的方法进行编译,从而减少不安全的代码段。 C->unsafe Rust fn->C 优化为: C->unsafe Rust fn(适配层)->safe Rust fn(核心逻辑)->unsafe Rust fn(适配层)->C #### 参考示例 unsafe的代码段建议能够降低到3%以下。(例如https://gitee.com/openeuler/sysmaster中unsafe的代码段小于1%,从实际的效果上看,基本未出现过内存类的问题) 关于C与Rust的指针调用的方式,也内部咨询以及查询了相关资料,可以作为参考: 1、https://dev.to/kgrech/7-ways-to-pass-a-string-between-rust-and-c-4ieb 2、可以参考Rust中现有的对glibc的封装库中的实现。
评论 (
2
)
登录
后才可以发表评论
状态
待办的
待办的
已挂起
修复中
已确认
已完成
已验收
已取消
负责人
未设置
标签
sig/Base-service
未设置
项目
未立项任务
未立项任务
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
test
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
预计工期
(小时)
参与者(1)
1
https://gitee.com/openeuler/libarchive-rust.git
git@gitee.com:openeuler/libarchive-rust.git
openeuler
libarchive-rust
libarchive-rust
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册