登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
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::download due to unchecked size parameter
待办的
#ID2H7V
Cwh
创建于
2025-10-18 12:26
AddressSanitizer detected a critical heap-buffer-overflow in snap7_rs::client::S7Client::download. The C++ implementation performs an unchecked memcpy using a user-controlled size parameter that can exceed the actual buffer length, combined with improper fat pointer casting in the FFI layer. input: ``` data = [71, 71, 71, 71, 119, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 2, 0] data len = 19 ``` ASan Report: ``` ==1780427==ERROR: AddressSanitizer: heap-buffer-overflow READ of size 2001160007 at 0x7c1736de001b Stack trace: #0 __asan_memcpy #1 TSnap7MicroClient::Download(int, void*, int) at s7_micro_client.cpp:3017:9 #2 snap7_rs::client::S7Client::download at client.rs:1194:13 #3 replay_snap7_rs27::test_function27 at main.rs:31:9 ``` repaly_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_function27(_param0: i32 ,_param1: &mut [u8] ,_param2: i32) { unsafe { let _local0 = snap7_rs::S7Client::create(); snap7_rs::S7Client::download(&(_local0) ,_param0 ,_param1 ,_param2); } } 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() < 9 {return;} let dynamic_length = (data.len() - 8) / 1; let _param0 = _to_i32(data, 0); let mut vec1 = _to_mut_slice::<u8>(data, 8 + 0 * dynamic_length, data.len()); let _param1 = vec1.as_mut_slice(); let _param2 = _to_i32(data, 4); test_function27(_param0 ,_param1 ,_param2); } ```
AddressSanitizer detected a critical heap-buffer-overflow in snap7_rs::client::S7Client::download. The C++ implementation performs an unchecked memcpy using a user-controlled size parameter that can exceed the actual buffer length, combined with improper fat pointer casting in the FFI layer. input: ``` data = [71, 71, 71, 71, 119, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 2, 0] data len = 19 ``` ASan Report: ``` ==1780427==ERROR: AddressSanitizer: heap-buffer-overflow READ of size 2001160007 at 0x7c1736de001b Stack trace: #0 __asan_memcpy #1 TSnap7MicroClient::Download(int, void*, int) at s7_micro_client.cpp:3017:9 #2 snap7_rs::client::S7Client::download at client.rs:1194:13 #3 replay_snap7_rs27::test_function27 at main.rs:31:9 ``` repaly_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_function27(_param0: i32 ,_param1: &mut [u8] ,_param2: i32) { unsafe { let _local0 = snap7_rs::S7Client::create(); snap7_rs::S7Client::download(&(_local0) ,_param0 ,_param1 ,_param2); } } 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() < 9 {return;} let dynamic_length = (data.len() - 8) / 1; let _param0 = _to_i32(data, 0); let mut vec1 = _to_mut_slice::<u8>(data, 8 + 0 * dynamic_length, data.len()); let _param1 = vec1.as_mut_slice(); let _param2 = _to_i32(data, 4); test_function27(_param0 ,_param1 ,_param2); } ```
评论 (
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 帐号,请先登录后再操作。
立即登录
没有帐号,去注册