aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2019-03-02 12:52:52 +0000
committerRon Yorston <rmy@pobox.com>2019-03-02 13:11:38 +0000
commitcf46a1c167ce3d532b10e83b6cc2a1994ac09668 (patch)
tree75e59b882ddf5b0c570eb9f6c6cef609c7160021
parentd6a7bfff8a510bb4035fbd1cf29b555abff65b2f (diff)
downloadbusybox-w32-cf46a1c167ce3d532b10e83b6cc2a1994ac09668.tar.gz
busybox-w32-cf46a1c167ce3d532b10e83b6cc2a1994ac09668.tar.bz2
busybox-w32-cf46a1c167ce3d532b10e83b6cc2a1994ac09668.zip
win32: let stat(2) report numeric uids for local users
Further extend file identification so stat(2) returns the relative identifier as a numeric uid for files with owner SIDs that look like a local or domain user. See: https://blogs.technet.microsoft.com/markrussinovich/2009/11/03/the-machine-sid-duplication-myth-and-why-sysprep-matters/ https://cygwin.com/cygwin-ug-net/ntsec.html
-rw-r--r--include/mingw.h4
-rw-r--r--win32/mingw.c55
2 files changed, 49 insertions, 10 deletions
diff --git a/include/mingw.h b/include/mingw.h
index f8e833138..f99582ca5 100644
--- a/include/mingw.h
+++ b/include/mingw.h
@@ -8,8 +8,8 @@
8typedef int gid_t; 8typedef int gid_t;
9typedef int uid_t; 9typedef int uid_t;
10 10
11#define DEFAULT_UID 1000 11#define DEFAULT_UID 4095
12#define DEFAULT_GID 1000 12#define DEFAULT_GID 4095
13 13
14/* 14/*
15 * arpa/inet.h 15 * arpa/inet.h
diff --git a/win32/mingw.c b/win32/mingw.c
index d7bdc10f6..f84cb76d3 100644
--- a/win32/mingw.c
+++ b/win32/mingw.c
@@ -391,13 +391,20 @@ static int has_exec_format(const char *name)
391} 391}
392 392
393#if ENABLE_FEATURE_IDENTIFY_OWNER 393#if ENABLE_FEATURE_IDENTIFY_OWNER
394static int file_belongs_to_me(HANDLE fh) 394static uid_t file_owner(HANDLE fh)
395{ 395{
396 PSID pSidOwner; 396 PSID pSidOwner;
397 PSECURITY_DESCRIPTOR pSD; 397 PSECURITY_DESCRIPTOR pSD;
398 static PTOKEN_USER user = NULL; 398 static PTOKEN_USER user = NULL;
399 static int initialised = 0; 399 static int initialised = 0;
400 int equal; 400 int equal;
401 uid_t uid = 0;
402 DWORD *ptr;
403 unsigned char prefix[] = {
404 0x01, 0x05, 0x00, 0x00,
405 0x00, 0x00, 0x00, 0x05,
406 0x15, 0x00, 0x00, 0x00
407 };
401 408
402 /* get SID of current user */ 409 /* get SID of current user */
403 if (!initialised) { 410 if (!initialised) {
@@ -418,16 +425,51 @@ static int file_belongs_to_me(HANDLE fh)
418 } 425 }
419 426
420 if (user == NULL) 427 if (user == NULL)
421 return TRUE; 428 return DEFAULT_UID;
422 429
423 /* get SID of file's owner */ 430 /* get SID of file's owner */
424 if (GetSecurityInfo(fh, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION, 431 if (GetSecurityInfo(fh, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION,
425 &pSidOwner, NULL, NULL, NULL, &pSD) != ERROR_SUCCESS) 432 &pSidOwner, NULL, NULL, NULL, &pSD) != ERROR_SUCCESS)
426 return FALSE; 433 return 0;
427 434
428 equal = EqualSid(pSidOwner, user->User.Sid); 435 equal = EqualSid(pSidOwner, user->User.Sid);
429 LocalFree(pSD); 436 LocalFree(pSD);
430 return equal; 437
438 if (equal)
439 return DEFAULT_UID;
440
441 /* for local or domain users use the RID as uid */
442 if (memcmp(pSidOwner, prefix, sizeof(prefix)) == 0) {
443 ptr = (DWORD *)pSidOwner;
444 if (ptr[6] >= 500 && ptr[6] < DEFAULT_UID)
445 uid = (uid_t)ptr[6];
446 }
447 return uid;
448
449#if 0
450 /* this is how it would be done properly using the API */
451 {
452 PSID_IDENTIFIER_AUTHORITY auth;
453 unsigned char *count;
454 PDWORD subauth;
455 unsigned char nt_auth[] = {
456 0x00, 0x00, 0x00, 0x00, 0x00, 0x05
457 };
458
459 if (IsValidSid(pSidOwner) ) {
460 auth = GetSidIdentifierAuthority(pSidOwner);
461 count = GetSidSubAuthorityCount(pSidOwner);
462 subauth = GetSidSubAuthority(pSidOwner, 0);
463 if (memcmp(auth, nt_auth, sizeof(nt_auth)) == 0 &&
464 *count == 5 && *subauth == 21) {
465 subauth = GetSidSubAuthority(pSidOwner, 4);
466 if (*subauth >= 500 && *subauth < DEFAULT_UID)
467 uid = (uid_t)*subauth;
468 }
469 }
470 return uid;
471 }
472#endif
431} 473}
432#endif 474#endif
433 475
@@ -499,10 +541,7 @@ static int do_lstat(int follow, const char *file_name, struct mingw_stat *buf)
499 hdata.nNumberOfLinks; 541 hdata.nNumberOfLinks;
500 } 542 }
501#if ENABLE_FEATURE_IDENTIFY_OWNER 543#if ENABLE_FEATURE_IDENTIFY_OWNER
502 if (!file_belongs_to_me(fh)) { 544 buf->st_uid = buf->st_gid = file_owner(fh);
503 buf->st_uid = 0;
504 buf->st_gid = 0;
505 }
506#endif 545#endif
507 CloseHandle(fh); 546 CloseHandle(fh);
508 } 547 }