detect / alert non-admin users

This commit is contained in:
Patrick Wardle 2021-05-08 17:31:35 -04:00
parent 9a6ee5811f
commit f2490a083f
5 changed files with 57 additions and 2 deletions

View File

@ -242,7 +242,7 @@ bail:
if(YES != [defaultManager copyItemAtPath:app toPath:appCopy error:&error])
{
//err msg
os_log_error(logHandle, "ERROR: failed to copy %@ to %@ (error: %@)", app, appCopy, error.description);
os_log_error(logHandle, "ERROR: failed to copy %{public}@ to %{public}@ (error: %@)", app, appCopy, error.description);
//bail
goto bail;

View File

@ -399,7 +399,7 @@ bail:
if(YES != [NSFileManager.defaultManager copyItemAtPath:applicationSrc toPath:applicationDest error:&error])
{
//err msg
os_log_error(logHandle, "ERROR: failed to copy %@ -> %@ (error: %@)", applicationSrc, applicationDest, error);
os_log_error(logHandle, "ERROR: failed to copy %{public}@ -> %{public}@ (error: %@)", applicationSrc, applicationDest, error);
//bail
goto bail;

View File

@ -36,6 +36,16 @@ int main(int argc, char *argv[])
options.debug = YES;
}];
//user gotta be admin
if(YES != hasAdminPrivileges())
{
//show alert
showAlert(@"ERROR: Insuffient Privileges.", @"Administrator privileges are required to monitor the camera & microphone.");
//bail
goto bail;
}
//cmdline install?
if(YES == [NSProcessInfo.processInfo.arguments containsObject:CMD_INSTALL])
{

View File

@ -131,4 +131,6 @@ BOOL AppleSilicon(void);
//show an alert
NSModalResponse showAlert(NSString* messageText, NSString* informativeText);
BOOL hasAdminPrivileges(void);
#endif

View File

@ -12,6 +12,8 @@
#import "consts.h"
#import "utilities.h"
#import <pwd.h>
#import <grp.h>
#import <dlfcn.h>
#import <signal.h>
#import <unistd.h>
@ -1647,3 +1649,44 @@ NSModalResponse showAlert(NSString* messageText, NSString* informativeText)
return response;
}
//checks if user has admin privs
// ->based off http://stackoverflow.com/questions/30000443/asking-for-admin-privileges-for-only-standard-accounts
BOOL hasAdminPrivileges()
{
//flag
BOOL isAdmin = NO;
//password entry
struct passwd* pwentry = NULL;
//admin group
struct group* adminGroup = NULL;
//get password entry for current user
pwentry = getpwuid(getuid());
//get admin group
adminGroup = getgrnam("admin");
//iterate over entries
// ->check if current user is part of the admin group
while(*adminGroup->gr_mem != NULL)
{
//check if admin
if (strcmp(pwentry->pw_name, *adminGroup->gr_mem) == 0)
{
//yay!
isAdmin = YES;
//exit loop
break;
}
//try next
adminGroup->gr_mem++;
}
return isAdmin;
}