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

本文介绍了Trail of Bits开源的windows-acl Rust库,该库简化了Windows访问控制列表(ACL)的编程操作,包含DACL和SACL的实战代码示例,适用于Windows安全工具开发。

Windows ACL基础

Windows有两种访问控制列表(ACL):自主访问控制列表(DACL)和系统访问控制列表(SACL)。每个安全对象(如文件、注册表键、事件等)都有包含DACL和SACL的安全描述符。

DACL和SACL的区别在于条目类型:DACL控制实体对资源的访问权限(例如拒绝用户读取注册表键),SACL则用于管理审计事件所需的操作类型及设置资源的强制完整性标签。

现有ACL操作困境

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

  1. 必须确保新访问控制项(ACE)插入到正确位置
  2. 新条目不能与现有ACE冲突(例如已有读写权限时不应添加只读权限)
  3. 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系统级安全机制。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计