Windows ACL基础
Windows有两种访问控制列表(ACL):自主访问控制列表(DACL)和系统访问控制列表(SACL)。每个安全对象(如文件、注册表键、事件等)都有包含DACL和SACL的安全描述符。
DACL和SACL的区别在于条目类型:DACL控制实体对资源的访问权限(例如拒绝用户读取注册表键),SACL则用于管理审计事件所需的操作类型及设置资源的强制完整性标签。
现有ACL操作困境
修改现有ACL需要创建新ACL。删除条目相对简单(复制除目标外的所有现有条目),但插入DACL条目更复杂:
- 必须确保新访问控制项(ACE)插入到正确位置
- 新条目不能与现有ACE冲突(例如已有读写权限时不应添加只读权限)
- Rust原生操作尤为困难
windows-acl的解决方案
以appjaillauncher-rs项目为例,该库提供了简化接口。关键功能包括:
添加DACL允许条目
1
2
3
4
5
6
7
8
9
10
11
12
13
|
match ACL::from_file_path(string_path, false) {
Ok(mut acl) => {
let sid = string_to_sid(string_sid).unwrap_or(Vec::new());
if sid.capacity() == 0 { return false; }
acl.remove(sid.as_ptr() as PSID, Some(AceType::AccessAllow), None)
.unwrap_or(0);
if !acl.allow(sid.as_ptr() as PSID, true, mask)
.unwrap_or_else(|code| false) {
return false;
}
},
...
}
|
删除DACL允许条目
1
2
3
4
5
6
7
8
9
10
11
|
match ACL::from_file_path(string_path, false) {
Ok(mut acl) => {
let sid = string_to_sid(string_sid).unwrap_or(Vec::new());
if sid.capacity() == 0 { return false; }
let result = acl.remove(sid.as_ptr() as PSID,
Some(AceType::AccessAllow),
None);
if result.is_err() { return false; }
},
...
}
|
应用前景
该库为Rust开发Windows安全工具开辟了新可能:
- 通过SACL操作实现完整Windows事件审计功能
- 助力端点入侵检测
- 推动Rust在Windows安全领域的应用
本文原始发布于Trail of Bits博客,展示了如何用Rust高效处理Windows系统级安全机制。