Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2014-05-14 15:27:47 +0400
committerCorinna Vinschen <corinna@vinschen.de>2014-05-14 15:27:47 +0400
commit6506454fb38c7684d53126b3455ff2a663932b16 (patch)
treed0a67c699f1b7b48067375ce097a590577b6d9e3 /winsup/cygwin/uinfo.cc
parentd4ff931bf83181966dfd210013b1229e2b1e2c79 (diff)
* sec_auth.cc (get_server_groups): Call get_logon_server only for
non-builtin accounts. * uinfo.cc (pwdgrp::fetch_account_from_windows): Check incoming account name for validity in terms of the current name prefixing rules and refuse invalid names.
Diffstat (limited to 'winsup/cygwin/uinfo.cc')
-rw-r--r--winsup/cygwin/uinfo.cc88
1 files changed, 82 insertions, 6 deletions
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
index a69f02d38..8f8f78cbc 100644
--- a/winsup/cygwin/uinfo.cc
+++ b/winsup/cygwin/uinfo.cc
@@ -1189,7 +1189,7 @@ pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, cyg_ldap *pldap)
SID_NAME_USE acc_type;
BOOL ret = false;
/* Cygwin user name style. */
- enum {
+ enum name_style_t {
name_only,
plus_prepended,
fully_qualified
@@ -1251,19 +1251,24 @@ pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, cyg_ldap *pldap)
standalone machine, or the username must be from the primary domain.
In the latter case, prepend the primary domain name so as not to
collide with an account from the account domain with the same name. */
+ name_style_t nstyle;
+
+ nstyle = name_only;
p = name;
if (*arg.name == cygheap->pg.nss_separator ()[0])
- ++arg.name;
- else if (!strchr (arg.name, cygheap->pg.nss_separator ()[0])
- && cygheap->dom.member_machine ())
+ nstyle = plus_prepended;
+ else if (strchr (arg.name, cygheap->pg.nss_separator ()[0]))
+ nstyle = fully_qualified;
+ else if (cygheap->dom.member_machine ())
p = wcpcpy (wcpcpy (p, cygheap->dom.primary_flat_name ()),
cygheap->pg.nss_separator ());
/* Now fill up with name to search. */
- sys_mbstowcs (p, UNLEN + 1, arg.name);
+ sys_mbstowcs (p, UNLEN + 1,
+ arg.name + (nstyle == plus_prepended ? 1 : 0));
/* Replace domain separator char with backslash and make sure p is NULL
or points to the backslash, so... */
if ((p = wcschr (name, cygheap->pg.nss_separator ()[0])))
- *p = L'\\';
+ *p = L'\\';
sid = csid;
ret = LookupAccountNameW (NULL, name, sid, &slen, dom, &dlen, &acc_type);
if (!ret)
@@ -1274,6 +1279,77 @@ pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, cyg_ldap *pldap)
/* ... we can skip the backslash in the rest of this function. */
if (p)
name = p + 1;
+ /* Last but not least, some validity checks on the name style. */
+ switch (nstyle)
+ {
+ case name_only:
+ /* name_only account must start with S-1-5-21 */
+ if (sid_id_auth (sid) != 5 /* SECURITY_NT_AUTHORITY */
+ || sid_sub_auth (sid, 0) != SECURITY_NT_NON_UNIQUE)
+ {
+ debug_printf ("Invalid account name <%s> (name only/"
+ "not NON_UNIQUE)", arg.name);
+ return NULL;
+ }
+ /* name_only only if db_prefix is auto. */
+ if (!cygheap->pg.nss_prefix_auto ())
+ {
+ debug_printf ("Invalid account name <%s> (name only/"
+ "db_prefix not auto)", arg.name);
+ return NULL;
+ }
+ break;
+ case plus_prepended:
+ /* plus_prepended account must not start with S-1-5-21. */
+ if (sid_id_auth (sid) == 5 /* SECURITY_NT_AUTHORITY */
+ && sid_sub_auth (sid, 0) == SECURITY_NT_NON_UNIQUE)
+ {
+ debug_printf ("Invalid account name <%s> (plus prependend/"
+ "NON_UNIQUE)", arg.name);
+ return NULL;
+ }
+ /* plus_prepended only if db_prefix is not always. */
+ if (cygheap->pg.nss_prefix_always ())
+ {
+ debug_printf ("Invalid account name <%s> (plus prependend/"
+ "db_prefix not always)", arg.name);
+ return NULL;
+ }
+ break;
+ case fully_qualified:
+ /* All is well if db_prefix is always. */
+ if (cygheap->pg.nss_prefix_always ())
+ break;
+ /* Otherwise, no fully_qualified for builtin accounts. */
+ if (sid_id_auth (sid) != 5 /* SECURITY_NT_AUTHORITY */
+ || sid_sub_auth (sid, 0) != SECURITY_NT_NON_UNIQUE)
+ {
+ debug_printf ("Invalid account name <%s> (fully qualified/"
+ "not NON_UNIQUE)", arg.name);
+ return NULL;
+ }
+ /* All is well if db_prefix is primary. */
+ if (cygheap->pg.nss_prefix_primary ())
+ break;
+ /* Domain member and domain == primary domain? */
+ if (cygheap->dom.member_machine ())
+ {
+ if (!wcscasecmp (dom, cygheap->dom.primary_flat_name ()))
+ {
+ debug_printf ("Invalid account name <%s> (fully qualified/"
+ "primary domain account)", arg.name);
+ return NULL;
+ }
+ }
+ /* Not domain member and domain == account domain? */
+ else if (!wcscasecmp (dom, cygheap->dom.account_flat_name ()))
+ {
+ debug_printf ("Invalid account name <%s> (fully qualified/"
+ "local account)", arg.name);
+ return NULL;
+ }
+ break;
+ }
break;
case ID_arg:
/* Construct SID from ID using the SFU rules, just like the code below