diff options
author | Philipp Gesang <phg@phi-gamma.net> | 2018-11-07 23:40:26 +0100 |
---|---|---|
committer | Philipp Gesang <phg@phi-gamma.net> | 2018-11-07 23:40:32 +0100 |
commit | 010d9d9d7f82e6d880da646c810492618476ee32 (patch) | |
tree | 6f356707ca0019da3e27dc62377b379656be5c68 /sid.ml | |
parent | 39b9f77dbccecad50fb355cffb0e8e432e28f825 (diff) | |
download | ocaml-sid-010d9d9d7f82e6d880da646c810492618476ee32.tar.gz |
sid: sid_test: make subauthorities mandatory
Both the constructor “Sid.create” and the string format parser must
reject inputs lacking a subauthorities array of at least size one. Since
the array is no longer optional, reorder the the constructor arguments
to match the data representation.
It is still possible to create SIDs without subauthorities via the
“Sid.create_unsafe” constructor. Also, the packet representation will
happily accept them because their definition (as well as that that of
the identical RPC version) does not specify a minimum count.
This is all rather ambiguous and exacerbated by the fact that [MS-DTYP]
happily specifies an invalid SID “S-1-5” as the “NT_AUTHORITY”. However,
both the grammar and the Win API “ConvertStringSidToSidA()” function
reject SA-less inputs as invalid, so we should too.
Diffstat (limited to 'sid.ml')
-rw-r--r-- | sid.ml | 288 |
1 files changed, 149 insertions, 139 deletions
@@ -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 |