iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
Security

Windows Security 101系列 第 15

[Day15] Token & Object (Part 2): Access Check

  • 分享至 

  • xImage
  •  

今天要來介紹的是 Access Check,也就是當我們以 Token 去存取某個 Object 時會需要通過的檢查。

Access Check

APIs

驗證 token 的實作上分為 user mode 和 kernel mode 兩種:

  1. User mode 的實作中可以直接從 ClientToken 中取得要驗證的 token
NTSTATUS NTAPI NtAccessCheck(
    _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
    _In_ HANDLE ClientToken,
    _In_ ACCESS_MASK DesiredAccess,
    _In_ PGENERIC_MAPPING GenericMapping,
    _Out_writes_bytes_(*PrivilegeSetLength) PPRIVILEGE_SET PrivilegeSet,
    _Inout_ PULONG PrivilegeSetLength,
    _Out_ PACCESS_MASK GrantedAccess,
    _Out_ PNTSTATUS AccessStatus
);
  1. Kernel mode 的實作則會是從 SubjectSecurityContext->ClientToken 取得要驗證的 token
BOOLEAN SeAccessCheck(
  [in]  PSECURITY_DESCRIPTOR      SecurityDescriptor,
  [in]  PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
  [in]  BOOLEAN                   SubjectContextLocked,
  [in]  ACCESS_MASK               DesiredAccess,
  [in]  ACCESS_MASK               PreviouslyGrantedAccess,
  [out] PPRIVILEGE_SET            *Privileges,
  [in]  PGENERIC_MAPPING          GenericMapping,
  [in]  KPROCESSOR_MODE           AccessMode,
  [out] PACCESS_MASK              GrantedAccess,
  [out] PNTSTATUS                 AccessStatus
);

其中比較重要的有 SubjectSecurityContext、DesiredAccess、GenericMapping 和 SecurityDescriptor。

Security Context

在 Kernel Mode 中的 Security Context 會是以下結構:

typedef struct _SECURITY_SUBJECT_CONTEXT {
  PACCESS_TOKEN                ClientToken;
  SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
  PACCESS_TOKEN                PrimaryToken;
  PVOID                        ProcessAuditId;
} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;

SeAccessCheck

整個 SeAccessCheck 會像是這張圖所示,但是這只適用在一般的 token, restricted token 會有更多額外的檢查。

https://ithelp.ithome.com.tw/upload/images/20230928/20120098AnCY9P9UqW.png
(ref: https://www.scribd.com/document/519595194/D2T3-James-Forshaw-Introduction-to-Logical-Privilege-Escalation-on-Windows)

根據投影片,SeAccessCheck 會有3個階段:

  1. IL Check

https://ithelp.ithome.com.tw/upload/images/20230928/20120098iIssRRUWRW.png
(ref: https://www.scribd.com/document/519595194/D2T3-James-Forshaw-Introduction-to-Logical-Privilege-Escalation-on-Windows)

檢查 Token 的 Integrity Level 是否足夠
a. 是,進行下個檢查
b. 否,如果 Resource 本身的 Ppolicy 允許存取則通過;否則拒絕存取

  1. Owner Check

https://ithelp.ithome.com.tw/upload/images/20230928/20120098mdCUMhA5Bo.png
(ref: https://www.scribd.com/document/519595194/D2T3-James-Forshaw-Introduction-to-Logical-Privilege-Escalation-on-Windows)

檢查是不是該 Object 的 owner
a. 是,如果請求的權限是允許的則通過;否則進行下個檢查
b. 否,進行下個檢查

  1. DACL Check

https://ithelp.ithome.com.tw/upload/images/20230928/20120098pIMvZ4VwfM.png
(ref: https://www.scribd.com/document/519595194/D2T3-James-Forshaw-Introduction-to-Logical-Privilege-Escalation-on-Windows)

檢查 Token 的 User 和 Gorup 對應到 DACL 的 ACE 是否允許
a. 是,通過
b. 否,拒絕存取

以上就是 Access Check 的流程。

下一篇,我要介紹的是 Token Impersonate!

References


上一篇
[Day14] Token & Object (Part 1): Introduction
下一篇
[Day16] Token & Object (Part 3): Impersonate
系列文
Windows Security 10130
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言