Windows ACL简介

访问控制列表(ACL)是微软Windows安全模型的核心组成部分。除了控制对安全资源的访问外,ACL还用于沙箱隔离、事件审计和指定强制完整性级别。然而以编程方式操作ACL(特别是在Rust中)极其困难。

Windows包含两种ACL类型:

  • 自主访问控制列表(DACL):控制实体对资源的访问权限
    • 系统访问控制列表(SACL):管理审计事件所需的操作类型,并为资源设置强制完整性标签

当前操作ACL的挑战

修改现有ACL需要创建新ACL。删除操作相对简单,只需复制除目标条目外的所有现有条目。但对于DACL的插入操作更为复杂:

  1. 必须确保新访问控制条目(ACE)插入到正确位置
    1. 新DACL必须避免与现有ACE条目冲突
    1. 在Rust中处理这些复杂性尤为困难

windows-acl如何简化操作

以appjaillauncher-rs项目为例,该工具使用AppContainers沙箱化Windows应用。通过windows-acl库:

  • 提供了模块化接口处理DACL/SACL操作
    • 简化了ACE的添加和删除过程

代码示例

添加DACL允许条目

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允许条目

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;}},...
}

应用前景与未来工作

windows-acl为Rust开发Windows安全工具开辟了新可能:

  • 通过操作SACL充分利用Windows事件审计引擎
    • 助力端点入侵检测
    • 推动Rust在Windows安全开发领域的应用 我们期待这个工作能促进Windows Rust开发者社区的发展,并激励更多基于Rust的安全工具诞生! 更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)