登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
轻量养虾,开箱即用!低 Token + 稳定算力,Gitee & 模力方舟联合出品的 PocketClaw 正式开售!点击了解详情~
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
1
Star
1
Fork
1
gmg137
/
snap7-rs
代码
Issues
9
Pull Requests
0
Wiki
统计
流水线
服务
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
开发画像分析
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
Heap buffer overflow in S7Client::as_ct_write due to FFI pointer misuse and size mismatch
待办的
#ID2H74
Cwh
创建于
2025-10-18 12:08
AddressSanitizer detected a critical heap-buffer-overflow vulnerability in `snap7_rs::client::S7Client::as_ct_write` during fuzz testing. The issue stems from improper FFI pointer handling where Rust's fat pointer is incorrectly cast to `void*`, combined with a lack of validation between the size parameter and the actual buffer length. replay_file: ```Rust extern crate snap7_rs; use std::ffi::{CString, CStr}; fn _to_i32(data:&[u8], index:usize)->i32 { let data0 = _to_i16(data, index) as i32; let data1 = _to_i16(data, index+2) as i32; data0 << 16 | data1 } fn _to_mut_slice<T: Copy>(data:&[u8], start_index: usize, end_index: usize)-> Vec<T> { let data_slice = &data[start_index..end_index]; let mut vec = Vec::new(); let (_, shorts, _) = unsafe {data_slice.align_to::<T>()}; vec.extend_from_slice(shorts); vec } fn _to_i16(data:&[u8], index:usize)->i16 { let data0 = _to_i8(data, index) as i16; let data1 = _to_i8(data, index+1) as i16; data0 << 8 | data1 } fn _to_i8(data:&[u8], index:usize)->i8 { data[index] as i8 } fn test_function11(_param0: i32 ,_param1: &mut [u8] ,_param2: i32 ,_param3: i32 ,_param4: i32 ,_param5: &mut [u8]) { unsafe { let _local0 = snap7_rs::S7Client::create(); snap7_rs::S7Client::as_download(&(_local0) ,_param0 ,_param1 ,_param2); snap7_rs::S7Client::as_ct_write(&(_local0) ,_param3 ,_param4 ,_param5); } } fn _read_data()-> Vec<u8> { use std::env; use std::process::exit; let args:Vec<String> = env::args().collect(); if args.len() < 2 { println!("No crash filename provided"); exit(-1); } use std::path::PathBuf; let crash_file_name = &args[1]; let crash_path = PathBuf::from(crash_file_name); if !crash_path.is_file() { println!("Not a valid crash file"); exit(-1); } use std::fs; let data = fs::read(crash_path).unwrap(); data } fn main() { let _content = _read_data(); let data = &_content; println!("data = {:?}", data); println!("data len = {:?}", data.len()); //actual body emit if data.len() < 18 {return;} let dynamic_length = (data.len() - 16) / 2; let _param0 = _to_i32(data, 0); let mut vec1 = _to_mut_slice::<u8>(data, 16 + 0 * dynamic_length, 16 + 1 * dynamic_length); let _param1 = vec1.as_mut_slice(); let _param2 = _to_i32(data, 4); let _param3 = _to_i32(data, 8); let _param4 = _to_i32(data, 12); let mut vec5 = _to_mut_slice::<u8>(data, 16 + 1 * dynamic_length, data.len()); let _param5 = vec5.as_mut_slice(); test_function11(_param0 ,_param1 ,_param2 ,_param3 ,_param4 ,_param5); } ``` Crash Details: Input that triggered the crash: ``` data = [240, 255, 138, 255, 255, 248, 240, 241, 240, 240, 240, 100, 0, 0, 0, 112, 240, 222, 50] data len = 19 ``` AddressSanitizer Report: ``` ==1762733==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x7be7617e0038 READ of size 224 at 0x7be7617e0038 thread T0 Stack trace: #0 __asan_memcpy #1 TSnap7Client::AsWriteArea(int, int, int, int, int, void*) at /Rust-Lib-Testing/tests/snap7-rs/native/s7_client.cpp:189:9 #2 TSnap7Client::AsCTWrite(int, int, void*) at /Rust-Lib-Testing/tests/snap7-rs/native/s7_client.cpp:413:12 #3 snap7_rs::client::S7Client::as_ct_write at /Rust-Lib-Testing/tests/snap7-rs/src/client.rs:2396:13 #4 replay_snap7_rs11::test_function11 at replay_snap7_rs11/src/main.rs:32:9 ```
AddressSanitizer detected a critical heap-buffer-overflow vulnerability in `snap7_rs::client::S7Client::as_ct_write` during fuzz testing. The issue stems from improper FFI pointer handling where Rust's fat pointer is incorrectly cast to `void*`, combined with a lack of validation between the size parameter and the actual buffer length. replay_file: ```Rust extern crate snap7_rs; use std::ffi::{CString, CStr}; fn _to_i32(data:&[u8], index:usize)->i32 { let data0 = _to_i16(data, index) as i32; let data1 = _to_i16(data, index+2) as i32; data0 << 16 | data1 } fn _to_mut_slice<T: Copy>(data:&[u8], start_index: usize, end_index: usize)-> Vec<T> { let data_slice = &data[start_index..end_index]; let mut vec = Vec::new(); let (_, shorts, _) = unsafe {data_slice.align_to::<T>()}; vec.extend_from_slice(shorts); vec } fn _to_i16(data:&[u8], index:usize)->i16 { let data0 = _to_i8(data, index) as i16; let data1 = _to_i8(data, index+1) as i16; data0 << 8 | data1 } fn _to_i8(data:&[u8], index:usize)->i8 { data[index] as i8 } fn test_function11(_param0: i32 ,_param1: &mut [u8] ,_param2: i32 ,_param3: i32 ,_param4: i32 ,_param5: &mut [u8]) { unsafe { let _local0 = snap7_rs::S7Client::create(); snap7_rs::S7Client::as_download(&(_local0) ,_param0 ,_param1 ,_param2); snap7_rs::S7Client::as_ct_write(&(_local0) ,_param3 ,_param4 ,_param5); } } fn _read_data()-> Vec<u8> { use std::env; use std::process::exit; let args:Vec<String> = env::args().collect(); if args.len() < 2 { println!("No crash filename provided"); exit(-1); } use std::path::PathBuf; let crash_file_name = &args[1]; let crash_path = PathBuf::from(crash_file_name); if !crash_path.is_file() { println!("Not a valid crash file"); exit(-1); } use std::fs; let data = fs::read(crash_path).unwrap(); data } fn main() { let _content = _read_data(); let data = &_content; println!("data = {:?}", data); println!("data len = {:?}", data.len()); //actual body emit if data.len() < 18 {return;} let dynamic_length = (data.len() - 16) / 2; let _param0 = _to_i32(data, 0); let mut vec1 = _to_mut_slice::<u8>(data, 16 + 0 * dynamic_length, 16 + 1 * dynamic_length); let _param1 = vec1.as_mut_slice(); let _param2 = _to_i32(data, 4); let _param3 = _to_i32(data, 8); let _param4 = _to_i32(data, 12); let mut vec5 = _to_mut_slice::<u8>(data, 16 + 1 * dynamic_length, data.len()); let _param5 = vec5.as_mut_slice(); test_function11(_param0 ,_param1 ,_param2 ,_param3 ,_param4 ,_param5); } ``` Crash Details: Input that triggered the crash: ``` data = [240, 255, 138, 255, 255, 248, 240, 241, 240, 240, 240, 100, 0, 0, 0, 112, 240, 222, 50] data len = 19 ``` AddressSanitizer Report: ``` ==1762733==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x7be7617e0038 READ of size 224 at 0x7be7617e0038 thread T0 Stack trace: #0 __asan_memcpy #1 TSnap7Client::AsWriteArea(int, int, int, int, int, void*) at /Rust-Lib-Testing/tests/snap7-rs/native/s7_client.cpp:189:9 #2 TSnap7Client::AsCTWrite(int, int, void*) at /Rust-Lib-Testing/tests/snap7-rs/native/s7_client.cpp:413:12 #3 snap7_rs::client::S7Client::as_ct_write at /Rust-Lib-Testing/tests/snap7-rs/src/client.rs:2396:13 #4 replay_snap7_rs11::test_function11 at replay_snap7_rs11/src/main.rs:32:9 ```
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
分支 (
-
)
标签 (
-
)
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)
Rust
1
https://gitee.com/gmg137/snap7-rs.git
git@gitee.com:gmg137/snap7-rs.git
gmg137
snap7-rs
snap7-rs
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册