写点什么

使用 Rust 操作 Windows ACL:windows-acl 库简介

作者:qife
  • 2025-08-09
    福建
  • 本文字数:1030 字

    阅读完需:约 3 分钟

Windows ACL 简介

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


Windows 包含两种 ACL 类型:


  • 自主访问控制列表(DACL):控制实体对资源的访问权限

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

当前操作 ACL 的挑战

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


  1. 必须确保新访问控制条目(ACE)插入到正确位置

  2. 新 DACL 必须避免与现有 ACE 条目冲突

  3. 在 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 智能小助手)公众号二维码


办公AI智能小助手


用户头像

qife

关注

还未添加个人签名 2021-05-19 加入

还未添加个人简介

评论

发布
暂无评论
使用Rust操作Windows ACL:windows-acl库简介_rust_qife_InfoQ写作社区