登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
登录
注册
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
1
Star
1
Fork
1
gmg137
/
snap7-rs
代码
Issues
3
Pull Requests
0
Wiki
统计
流水线
服务
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
Segmentation Fault in S7Partner Destructor (pthread_cond_destroy) When Fuzzing snap7-rs Public API
待办的
#ICBIOB
Cwh
创建于
2025-05-29 21:22
### Description: While fuzzing all public APIs of the snap7-rs crate using afl.rs, I discovered a critical memory safety issue. Specifically, the destructor of the S7Partner object triggers a segmentation fault during cleanup, caused by a crash in pthread_cond_destroy within the native C++ destructor chain. ### ASan Output: The following AddressSanitizer output demonstrates the crash:  ### Driver Program: Here is the driver program used to reproduce the issue: ``` extern crate snap7_rs; fn _to_u8(data:&[u8], index:usize)->u8 { data[index] } fn _to_i8(data:&[u8], index:usize)->i8 { data[index] as i8 } 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_str(data:&[u8], start_index: usize, end_index: usize)->&str { let data_slice = &data[start_index..end_index]; use std::str; match str::from_utf8(data_slice) { Ok(s)=>s, Err(_)=>{ use std::process; process::exit(0); } } } 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_u16(data:&[u8], index:usize)->u16 { let data0 = _to_u8(data, index) as u16; let data1 = _to_u8(data, index+1) as u16; data0 << 8 | data1 } fn test_function4(_param0: i32 ,_param1: &str ,_param2: &str ,_param3: u16 ,_param4: u16) { unsafe { let _local0 = snap7_rs::S7Partner::create(_param0); snap7_rs::S7Partner::start_to(&(_local0) ,_param1 ,_param2 ,_param3 ,_param4); snap7_rs::S7Partner::stop(&(_local0)); } } 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() < 10 {return;} let dynamic_length = (data.len() - 8) / 2; let _param0 = _to_i32(data, 0); let _param1 = _to_str(data, 8 + 0 * dynamic_length, 8 + 1 * dynamic_length); let _param2 = _to_str(data, 8 + 1 * dynamic_length, data.len()); let _param3 = _to_u16(data, 4); let _param4 = _to_u16(data, 6); test_function4(_param0 ,_param1 ,_param2 ,_param3 ,_param4); } ``` ### Reproduction: You can find the replay files, including the driver program and PoC, at:[https://github.com/cuiwenhao123/replay_file/tree/master/snap7-rs/replay_snap1](https://github.com/cuiwenhao123/replay_file/tree/master/snap7-rs/replay_snap1) ### Build and Run Instructions: To compile: `RUSTFLAGS="-Zsanitizer=address" CFLAGS="-fsanitize=address -g -O1 -fno-omit-frame-pointer" CXXFLAGS="-fsanitize=address -g -O1 -fno-omit-frame-pointer" LLVM_CONFIG="/usr/lib/llvm-15/bin/llvm-config" CC="clang-15" CXX="clang++-15" cargo +nightly-2022-09-15 build` To run: `RUST_BACKTRACE=1 ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-15/bin/llvm-symbolizer ./replay_snap1 ../../crash/crash_input` (Please adjust LLVM_CONFIG, CC, CXX, and ASAN_SYMBOLIZER_PATH to match your system.) ### Request: Please help confirm whether this is a genuine bug that needs to be fixed. Thank you!
### Description: While fuzzing all public APIs of the snap7-rs crate using afl.rs, I discovered a critical memory safety issue. Specifically, the destructor of the S7Partner object triggers a segmentation fault during cleanup, caused by a crash in pthread_cond_destroy within the native C++ destructor chain. ### ASan Output: The following AddressSanitizer output demonstrates the crash:  ### Driver Program: Here is the driver program used to reproduce the issue: ``` extern crate snap7_rs; fn _to_u8(data:&[u8], index:usize)->u8 { data[index] } fn _to_i8(data:&[u8], index:usize)->i8 { data[index] as i8 } 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_str(data:&[u8], start_index: usize, end_index: usize)->&str { let data_slice = &data[start_index..end_index]; use std::str; match str::from_utf8(data_slice) { Ok(s)=>s, Err(_)=>{ use std::process; process::exit(0); } } } 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_u16(data:&[u8], index:usize)->u16 { let data0 = _to_u8(data, index) as u16; let data1 = _to_u8(data, index+1) as u16; data0 << 8 | data1 } fn test_function4(_param0: i32 ,_param1: &str ,_param2: &str ,_param3: u16 ,_param4: u16) { unsafe { let _local0 = snap7_rs::S7Partner::create(_param0); snap7_rs::S7Partner::start_to(&(_local0) ,_param1 ,_param2 ,_param3 ,_param4); snap7_rs::S7Partner::stop(&(_local0)); } } 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() < 10 {return;} let dynamic_length = (data.len() - 8) / 2; let _param0 = _to_i32(data, 0); let _param1 = _to_str(data, 8 + 0 * dynamic_length, 8 + 1 * dynamic_length); let _param2 = _to_str(data, 8 + 1 * dynamic_length, data.len()); let _param3 = _to_u16(data, 4); let _param4 = _to_u16(data, 6); test_function4(_param0 ,_param1 ,_param2 ,_param3 ,_param4); } ``` ### Reproduction: You can find the replay files, including the driver program and PoC, at:[https://github.com/cuiwenhao123/replay_file/tree/master/snap7-rs/replay_snap1](https://github.com/cuiwenhao123/replay_file/tree/master/snap7-rs/replay_snap1) ### Build and Run Instructions: To compile: `RUSTFLAGS="-Zsanitizer=address" CFLAGS="-fsanitize=address -g -O1 -fno-omit-frame-pointer" CXXFLAGS="-fsanitize=address -g -O1 -fno-omit-frame-pointer" LLVM_CONFIG="/usr/lib/llvm-15/bin/llvm-config" CC="clang-15" CXX="clang++-15" cargo +nightly-2022-09-15 build` To run: `RUST_BACKTRACE=1 ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-15/bin/llvm-symbolizer ./replay_snap1 ../../crash/crash_input` (Please adjust LLVM_CONFIG, CC, CXX, and ASAN_SYMBOLIZER_PATH to match your system.) ### Request: Please help confirm whether this is a genuine bug that needs to be fixed. Thank you!
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(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 帐号,请先登录后再操作。
立即登录
没有帐号,去注册