summaryrefslogtreecommitdiff
path: root/sid.ml
diff options
context:
space:
mode:
Diffstat (limited to 'sid.ml')
-rw-r--r--sid.ml288
1 files changed, 149 insertions, 139 deletions
diff --git a/sid.ml b/sid.ml
index a696237..4edcf5a 100644
--- a/sid.ml
+++ b/sid.ml
@@ -14,16 +14,17 @@ let max_ident_auth = U64.of_string "0x0000_ffff_ffff_ffff"
let sizeof_sub_auth = 4
let max_subauth_count = 15
-let create_unsafe sa ia =
+let create_unsafe ia sa =
{ sid_ident_auth = ia
; sid_sub_auths = sa }
(* There isn’t much to validate to begin with except for the hard cap on
the number of subauths. *)
-let create ?(sa=[||]) ia =
- if Array.length sa > max_subauth_count then None else
+let create ia sa =
+ let nsa = Array.length sa in
+ if nsa < 1 || max_subauth_count < nsa then None else
if U64.compare ia max_ident_auth > 0 then None else
- Some (create_unsafe sa ia)
+ Some (create_unsafe ia sa)
let get_ident_auth s = s.sid_ident_auth
let get_sub_auths s = s.sid_sub_auths
@@ -101,8 +102,23 @@ module StringFmt = struct
s i s.[i]))
done;
Bytes.blit_string s (p+2) b 2 12;
- p + ident_auth_hexlen,
- U64.of_string (Bytes.unsafe_to_string b)
+ let ia = U64.of_string (Bytes.unsafe_to_string b) in
+ if ia < ident_auth_hexmin then
+ raise
+ (Invalid_argument
+ (Printf.sprintf
+ "input malformed: identifier authority less than 2³² must \
+ not be hex-encoded (value=%s)"
+ (U64.to_string ia)))
+ else if ia > max_ident_auth then
+ raise (Invalid_argument
+ (Printf.sprintf
+ "Invalid SID: identifier authority (value=%s) cannot fit \
+ 6 B (%s)"
+ (U64.to_string ia) (U64.to_string max_ident_auth)))
+ else
+ p + ident_auth_hexlen,
+ ia
let ident_auth_decimal s p =
let p, ia = read_decimal_u64 s p in
@@ -119,16 +135,7 @@ module StringFmt = struct
let r = String.length s - p in
if r < ident_auth_hexlen then ident_auth_decimal s p else (* hex can’t fit *)
match s.[p], s.[p+1] with
- | '0', 'x' ->
- (let p, ia = read_ident_auth_hex s p in
- if ia < ident_auth_hexmin then
- raise
- (Invalid_argument
- (Printf.sprintf
- "input malformed: identifier authority less than 2³² must \
- not be hex-encoded (value=%s)"
- (U64.to_string ia))) else
- p, ia)
+ | '0', 'x' -> read_ident_auth_hex s p
| _ -> ident_auth_decimal s p
(*
@@ -150,14 +157,17 @@ module StringFmt = struct
expect_char s '-' 3;
let p = 4 in
let p, ia = read_ident_auth s p in
- if ia > max_ident_auth then
+ if p = n || s.[p] <> '-' then
raise (Invalid_argument
(Printf.sprintf
- "Invalid SID: identifier authority cannot fit 6 B (%s)"
- (U64.to_string max_ident_auth)));
+ "Invalid SID: error parsing SID [%s] at position %d, \
+ grammar mandates at least one subauthority"
+ s p)) else
let sa = ref [] and p' = ref p in
- while !p' < n - 1 && List.length !sa < max_subauth_count do
- expect_char s '-' !p';
+ while !p' < n - 1
+ && List.length !sa < max_subauth_count
+ && s.[!p'] = '-'
+ do
let np, d =
try read_decimal_u32 s (!p' + 1)
with Invalid_argument e ->
@@ -319,139 +329,139 @@ module WellKnown = struct
* see also
* https://docs.microsoft.com/en-us/windows/desktop/secauthz/well-known-sids
*)
- let null = cu [| U32.zero |] U64.zero
- let everyone = cu [| U32.zero |] U64.one
+ let null = cu U64.zero [| U32.zero |]
+ let everyone = cu U64.one [| U32.zero |]
let world = everyone
(* 1-2-… *)
- let local = cu [| U32.zero |] (U64.of_int 2)
- let console_logon = cu [| U32.one |] (U64.of_int 2)
+ let local = cu (U64.of_int 2) [| U32.zero |]
+ let console_logon = cu (U64.of_int 2) [| U32.one |]
(* 1-3-… *)
- let creator_owner_id = cu [| U32.zero |] (U64.of_int 3)
- let creator_group_id = cu [| U32.one |] (U64.of_int 3)
- let creator_owner_server = cu [| U32.of_int 2 |] (U64.of_int 3)
- let creator_group_server = cu [| U32.of_int 3 |] (U64.of_int 3)
- let owner_rights = cu [| U32.of_int 4 |] (U64.of_int 3)
- let elite = cu [| U32.of_int 3 ; U32.of_int 3; U32.of_int 7 |] U64.one
+ let creator_owner_id = cu (U64.of_int 3) [| U32.zero |]
+ let creator_group_id = cu (U64.of_int 3) [| U32.one |]
+ let creator_owner_server = cu (U64.of_int 3) [| U32.of_int 2 |]
+ let creator_group_server = cu (U64.of_int 3) [| U32.of_int 3 |]
+ let owner_rights = cu (U64.of_int 3) [| U32.of_int 4 |]
+ let elite = cu U64.one [| U32.of_int 3 ; U32.of_int 3; U32.of_int 7 |]
(* 1-5-… *)
- let nt_authority = cu [| |] (U64.of_int 5)
- let dialup = cu [| U32.one |] (U64.of_int 5)
- let network = cu [| U32.of_int 2 |] (U64.of_int 5)
- let batch = cu [| U32.of_int 3 |] (U64.of_int 5)
- let interactive = cu [| U32.of_int 4 |] (U64.of_int 5)
- let logon_id = cu [| U32.of_int 5 |] (U64.of_int 5)
- let service = cu [| U32.of_int 6 |] (U64.of_int 5)
- let anonymous = cu [| U32.of_int 7 |] (U64.of_int 5)
- let proxy = cu [| U32.of_int 8 |] (U64.of_int 5)
- let enterprise_domain_controllers = cu [| U32.of_int 9 |] (U64.of_int 5)
- let principal_self = cu [| U32.of_int 10 |] (U64.of_int 5)
- let authenticated_users = cu [| U32.of_int 11 |] (U64.of_int 5)
- let restricted_code = cu [| U32.of_int 12 |] (U64.of_int 5)
- let terminal_server_user = cu [| U32.of_int 13 |] (U64.of_int 5)
- let remote_interactive_logon = cu [| U32.of_int 14 |] (U64.of_int 5)
- let this_organisation = cu [| U32.of_int 15 |] (U64.of_int 5)
- let iusr = cu [| U32.of_int 17 |] (U64.of_int 5)
- let local_system = cu [| U32.of_int 18 |] (U64.of_int 5)
- let local_service = cu [| U32.of_int 19 |] (U64.of_int 5)
- let network_service = cu [| U32.of_int 20 |] (U64.of_int 5)
-
- let compounded_authentication = cu [| sa 21; U32.zero; U32.zero; U32.zero; sa 496 |] (ia 5)
- let claims_valid = cu [| sa 21; U32.zero; U32.zero; U32.zero; sa 497 |] (ia 5)
-
- let administrator machine = cu [| sa 21; machine; sa 500 |] (ia 5)
- let guest machine = cu [| sa 21; machine; sa 501 |] (ia 5)
- let krbtgt domain = cu [| sa 21; domain; sa 502 |] (ia 5)
- let domain_admins domain = cu [| sa 21; domain; sa 512 |] (ia 5)
- let domain_users domain = cu [| sa 21; domain; sa 513 |] (ia 5)
- let domain_guests domain = cu [| sa 21; domain; sa 514 |] (ia 5)
- let domain_computers domain = cu [| sa 21; domain; sa 515 |] (ia 5)
- let domain_domain_controllers domain = cu [| sa 21; domain; sa 516 |] (ia 5)
- let cert_publishers domain = cu [| sa 21; domain; sa 517 |] (ia 5)
- let schema_administrators root_domain = cu [| sa 21; root_domain; sa 518 |] (ia 5)
- let enterprise_admins root_domain = cu [| sa 21; root_domain; sa 519 |] (ia 5)
- let group_policy_creator_owners domain = cu [| sa 21; domain; sa 520 |] (ia 5)
- let readonly_domain_controllers domain = cu [| sa 21; domain; sa 521 |] (ia 5)
- let cloneable_controllers domain = cu [| sa 21; domain; sa 522 |] (ia 5)
- let protected_users domain = cu [| sa 21; domain; sa 525 |] (ia 5)
- let key_admins domain = cu [| sa 21; domain; sa 526 |] (ia 5)
- let enterprise_key_admins domain = cu [| sa 21; domain; sa 527 |] (ia 5)
- let ras_servers domain = cu [| sa 21; domain; sa 553 |] (ia 5)
- let allowed_rodc_password_replication_group domain = cu [| sa 21; domain; sa 571 |] (ia 5)
- let denied_rodc_password_replication_group domain = cu [| sa 21; domain; sa 572 |] (ia 5)
-
- let builtin_administrators = cu [| sa 32; sa 544 |] (ia 5)
- let builtin_users = cu [| sa 32; sa 545 |] (ia 5)
- let builtin_guests = cu [| sa 32; sa 546 |] (ia 5)
- let power_users = cu [| sa 32; sa 547 |] (ia 5)
- let account_operators = cu [| sa 32; sa 548 |] (ia 5)
- let server_operators = cu [| sa 32; sa 549 |] (ia 5)
- let printer_operators = cu [| sa 32; sa 550 |] (ia 5)
- let backup_operators = cu [| sa 32; sa 551 |] (ia 5)
- let replicator = cu [| sa 32; sa 552 |] (ia 5)
- let alias_prew2kcompacc = cu [| sa 32; sa 554 |] (ia 5)
- let remote_desktop = cu [| sa 32; sa 555 |] (ia 5)
- let network_configuration_ops = cu [| sa 32; sa 556 |] (ia 5)
- let incoming_forest_trust_builders = cu [| sa 32; sa 557 |] (ia 5)
- let perfmon_users = cu [| sa 32; sa 558 |] (ia 5)
- let perflog_users = cu [| sa 32; sa 559 |] (ia 5)
- let windows_authorization_access_group = cu [| sa 32; sa 560 |] (ia 5)
- let terminal_server_license_servers = cu [| sa 32; sa 561 |] (ia 5)
- let distributed_com_users = cu [| sa 32; sa 562 |] (ia 5)
- let iis_iusrs = cu [| sa 32; sa 568 |] (ia 5)
- let cryptographic_operators = cu [| sa 32; sa 569 |] (ia 5)
- let event_log_readers = cu [| sa 32; sa 573 |] (ia 5)
- let certificate_service_dcom_access = cu [| sa 32; sa 574 |] (ia 5)
- let rds_remote_access_servers = cu [| sa 32; sa 575 |] (ia 5)
- let rds_endpoint_servers = cu [| sa 32; sa 576 |] (ia 5)
- let rds_management_servers = cu [| sa 32; sa 577 |] (ia 5)
- let hyper_v_admins = cu [| sa 32; sa 578 |] (ia 5)
- let access_control_assistance_ops = cu [| sa 32; sa 579 |] (ia 5)
- let remote_management_users = cu [| sa 32; sa 580 |] (ia 5)
-
- let write_restricted_code = cu [| sa 33 |] (ia 5)
- let ntlm_authentication = cu [| sa 64; sa 10 |] (ia 5)
- let schannel_authentication = cu [| sa 64; sa 14 |] (ia 5)
- let digest_authentication = cu [| sa 64; sa 21 |] (ia 5)
- let this_organization_certificate = cu [| sa 65; sa 1 |] (ia 5)
- let nt_service = cu [| sa 80 |] (ia 5)
- let user_mode_drivers = cu [| sa 84; U32.zero; U32.zero; U32.zero; U32.zero; U32.zero |] (ia 5)
- let local_account = cu [| sa 113 |] (ia 5)
- let local_account_and_member_of_administrators_group = cu [| sa 114 |] (ia 5)
- let other_organization = cu [| sa 1000 |] (ia 5)
+ let nt_authority = cu (U64.of_int 5) [| |]
+ let dialup = cu (U64.of_int 5) [| U32.one |]
+ let network = cu (U64.of_int 5) [| U32.of_int 2 |]
+ let batch = cu (U64.of_int 5) [| U32.of_int 3 |]
+ let interactive = cu (U64.of_int 5) [| U32.of_int 4 |]
+ let logon_id = cu (U64.of_int 5) [| U32.of_int 5 |]
+ let service = cu (U64.of_int 5) [| U32.of_int 6 |]
+ let anonymous = cu (U64.of_int 5) [| U32.of_int 7 |]
+ let proxy = cu (U64.of_int 5) [| U32.of_int 8 |]
+ let enterprise_domain_controllers = cu (U64.of_int 5) [| U32.of_int 9 |]
+ let principal_self = cu (U64.of_int 5) [| U32.of_int 10 |]
+ let authenticated_users = cu (U64.of_int 5) [| U32.of_int 11 |]
+ let restricted_code = cu (U64.of_int 5) [| U32.of_int 12 |]
+ let terminal_server_user = cu (U64.of_int 5) [| U32.of_int 13 |]
+ let remote_interactive_logon = cu (U64.of_int 5) [| U32.of_int 14 |]
+ let this_organisation = cu (U64.of_int 5) [| U32.of_int 15 |]
+ let iusr = cu (U64.of_int 5) [| U32.of_int 17 |]
+ let local_system = cu (U64.of_int 5) [| U32.of_int 18 |]
+ let local_service = cu (U64.of_int 5) [| U32.of_int 19 |]
+ let network_service = cu (U64.of_int 5) [| U32.of_int 20 |]
+
+ let compounded_authentication = cu (ia 5) [| sa 21; U32.zero; U32.zero; U32.zero; sa 496 |]
+ let claims_valid = cu (ia 5) [| sa 21; U32.zero; U32.zero; U32.zero; sa 497 |]
+
+ let administrator machine = cu (ia 5) [| sa 21; machine; sa 500 |]
+ let guest machine = cu (ia 5) [| sa 21; machine; sa 501 |]
+ let krbtgt domain = cu (ia 5) [| sa 21; domain; sa 502 |]
+ let domain_admins domain = cu (ia 5) [| sa 21; domain; sa 512 |]
+ let domain_users domain = cu (ia 5) [| sa 21; domain; sa 513 |]
+ let domain_guests domain = cu (ia 5) [| sa 21; domain; sa 514 |]
+ let domain_computers domain = cu (ia 5) [| sa 21; domain; sa 515 |]
+ let domain_domain_controllers domain = cu (ia 5) [| sa 21; domain; sa 516 |]
+ let cert_publishers domain = cu (ia 5) [| sa 21; domain; sa 517 |]
+ let schema_administrators root_domain = cu (ia 5) [| sa 21; root_domain; sa 518 |]
+ let enterprise_admins root_domain = cu (ia 5) [| sa 21; root_domain; sa 519 |]
+ let group_policy_creator_owners domain = cu (ia 5) [| sa 21; domain; sa 520 |]
+ let readonly_domain_controllers domain = cu (ia 5) [| sa 21; domain; sa 521 |]
+ let cloneable_controllers domain = cu (ia 5) [| sa 21; domain; sa 522 |]
+ let protected_users domain = cu (ia 5) [| sa 21; domain; sa 525 |]
+ let key_admins domain = cu (ia 5) [| sa 21; domain; sa 526 |]
+ let enterprise_key_admins domain = cu (ia 5) [| sa 21; domain; sa 527 |]
+ let ras_servers domain = cu (ia 5) [| sa 21; domain; sa 553 |]
+ let allowed_rodc_password_replication_group domain = cu (ia 5) [| sa 21; domain; sa 571 |]
+ let denied_rodc_password_replication_group domain = cu (ia 5) [| sa 21; domain; sa 572 |]
+
+ let builtin_administrators = cu (ia 5) [| sa 32; sa 544 |]
+ let builtin_users = cu (ia 5) [| sa 32; sa 545 |]
+ let builtin_guests = cu (ia 5) [| sa 32; sa 546 |]
+ let power_users = cu (ia 5) [| sa 32; sa 547 |]
+ let account_operators = cu (ia 5) [| sa 32; sa 548 |]
+ let server_operators = cu (ia 5) [| sa 32; sa 549 |]
+ let printer_operators = cu (ia 5) [| sa 32; sa 550 |]
+ let backup_operators = cu (ia 5) [| sa 32; sa 551 |]
+ let replicator = cu (ia 5) [| sa 32; sa 552 |]
+ let alias_prew2kcompacc = cu (ia 5) [| sa 32; sa 554 |]
+ let remote_desktop = cu (ia 5) [| sa 32; sa 555 |]
+ let network_configuration_ops = cu (ia 5) [| sa 32; sa 556 |]
+ let incoming_forest_trust_builders = cu (ia 5) [| sa 32; sa 557 |]
+ let perfmon_users = cu (ia 5) [| sa 32; sa 558 |]
+ let perflog_users = cu (ia 5) [| sa 32; sa 559 |]
+ let windows_authorization_access_group = cu (ia 5) [| sa 32; sa 560 |]
+ let terminal_server_license_servers = cu (ia 5) [| sa 32; sa 561 |]
+ let distributed_com_users = cu (ia 5) [| sa 32; sa 562 |]
+ let iis_iusrs = cu (ia 5) [| sa 32; sa 568 |]
+ let cryptographic_operators = cu (ia 5) [| sa 32; sa 569 |]
+ let event_log_readers = cu (ia 5) [| sa 32; sa 573 |]
+ let certificate_service_dcom_access = cu (ia 5) [| sa 32; sa 574 |]
+ let rds_remote_access_servers = cu (ia 5) [| sa 32; sa 575 |]
+ let rds_endpoint_servers = cu (ia 5) [| sa 32; sa 576 |]
+ let rds_management_servers = cu (ia 5) [| sa 32; sa 577 |]
+ let hyper_v_admins = cu (ia 5) [| sa 32; sa 578 |]
+ let access_control_assistance_ops = cu (ia 5) [| sa 32; sa 579 |]
+ let remote_management_users = cu (ia 5) [| sa 32; sa 580 |]
+
+ let write_restricted_code = cu (ia 5) [| sa 33 |]
+ let ntlm_authentication = cu (ia 5) [| sa 64; sa 10 |]
+ let schannel_authentication = cu (ia 5) [| sa 64; sa 14 |]
+ let digest_authentication = cu (ia 5) [| sa 64; sa 21 |]
+ let this_organization_certificate = cu (ia 5) [| sa 65; sa 1 |]
+ let nt_service = cu (ia 5) [| sa 80 |]
+ let user_mode_drivers = cu (ia 5) [| sa 84; U32.zero; U32.zero; U32.zero; U32.zero; U32.zero |]
+ let local_account = cu (ia 5) [| sa 113 |]
+ let local_account_and_member_of_administrators_group = cu (ia 5) [| sa 114 |]
+ let other_organization = cu (ia 5) [| sa 1000 |]
(* 1-15-… *)
- let all_app_packages = cu [| sa 2; U32.one |] (ia 15)
+ let all_app_packages = cu (ia 15) [| sa 2; U32.one |]
(* 1-16-… *)
- let ml_untrusted = cu [| U32.zero |] (ia 16)
- let ml_low = cu [| sa 4096 |] (ia 16)
- let ml_medium = cu [| sa 8192 |] (ia 16)
- let ml_medium_plus = cu [| sa 8448 |] (ia 16)
- let ml_high = cu [| sa 12288 |] (ia 16)
- let ml_system = cu [| sa 16384 |] (ia 16)
- let ml_protected_process = cu [| sa 20480 |] (ia 16)
- let ml_secure_process = cu [| sa 28672 |] (ia 16)
+ let ml_untrusted = cu (ia 16) [| U32.zero |]
+ let ml_low = cu (ia 16) [| sa 4096 |]
+ let ml_medium = cu (ia 16) [| sa 8192 |]
+ let ml_medium_plus = cu (ia 16) [| sa 8448 |]
+ let ml_high = cu (ia 16) [| sa 12288 |]
+ let ml_system = cu (ia 16) [| sa 16384 |]
+ let ml_protected_process = cu (ia 16) [| sa 20480 |]
+ let ml_secure_process = cu (ia 16) [| sa 28672 |]
(* 1-18-… *)
- let authentication_authority_asserted_identity = cu [| U32.one |] (ia 18)
- let service_asserted_identity = cu [| sa 2 |] (ia 18)
- let fresh_public_key_identity = cu [| sa 3 |] (ia 18)
- let key_trust_identity = cu [| sa 4 |] (ia 18)
- let key_property_mfa = cu [| sa 5 |] (ia 18)
- let key_property_attestation = cu [| sa 6 |] (ia 18)
+ let authentication_authority_asserted_identity = cu (ia 18) [| U32.one |]
+ let service_asserted_identity = cu (ia 18) [| sa 2 |]
+ let fresh_public_key_identity = cu (ia 18) [| sa 3 |]
+ let key_trust_identity = cu (ia 18) [| sa 4 |]
+ let key_property_mfa = cu (ia 18) [| sa 5 |]
+ let key_property_attestation = cu (ia 18) [| sa 6 |]
module Prefix = struct
- let security_null_sid_authority ?(sa=[||]) () = create_unsafe sa (U64.of_int 0x00)
- let security_world_sid_authority ?(sa=[||]) () = create_unsafe sa (U64.of_int 0x01)
- let security_local_sid_authority ?(sa=[||]) () = create_unsafe sa (U64.of_int 0x02)
- let security_creator_sid_authority ?(sa=[||]) () = create_unsafe sa (U64.of_int 0x03)
- let security_nt_authority ?(sa=[||]) () = create_unsafe sa (U64.of_int 0x05)
- let security_app_package_authority ?(sa=[||]) () = create_unsafe sa (U64.of_int 0x0f)
- let security_mandatory_label_authority ?(sa=[||]) () = create_unsafe sa (U64.of_int 0x10)
- let security_scoped_policy_id_authority ?(sa=[||]) () = create_unsafe sa (U64.of_int 0x11)
- let security_authentication_authority ?(sa=[||]) () = create_unsafe sa (U64.of_int 0x12)
+ let security_null_sid_authority sa = create_unsafe (U64.of_int 0x00) sa
+ let security_world_sid_authority sa = create_unsafe (U64.of_int 0x01) sa
+ let security_local_sid_authority sa = create_unsafe (U64.of_int 0x02) sa
+ let security_creator_sid_authority sa = create_unsafe (U64.of_int 0x03) sa
+ let security_nt_authority sa = create_unsafe (U64.of_int 0x05) sa
+ let security_app_package_authority sa = create_unsafe (U64.of_int 0x0f) sa
+ let security_mandatory_label_authority sa = create_unsafe (U64.of_int 0x10) sa
+ let security_scoped_policy_id_authority sa = create_unsafe (U64.of_int 0x11) sa
+ let security_authentication_authority sa = create_unsafe (U64.of_int 0x12) sa
end
end