AuthorizationExecuteWithPrivileges () от имени корневой ошибки - PullRequest
3 голосов
/ 14 апреля 2011

Я новичок в какао ...

Я просто хочу запустить Apache и другие процессы в моем приложении Cocoa.

Вот мой код:

    OSStatus myStatus;
    AuthorizationFlags myFlags = kAuthorizationFlagDefaults;
    AuthorizationRef myAuthorizationRef;
    FILE *pipe = NULL;
    myStatus = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, myFlags, &myAuthorizationRef);
    AuthorizationItem myItems = {kAuthorizationRightExecute, 0, NULL, 0};
    AuthorizationRights myRights = {1, &myItems};
    myFlags = kAuthorizationFlagDefaults | 
    kAuthorizationFlagInteractionAllowed |
    kAuthorizationFlagPreAuthorize |
    kAuthorizationFlagExtendRights;
    myStatus = AuthorizationCopyPrivilegedReference (&myAuthorizationRef,kAuthorizationFlagDefaults);
    myStatus = AuthorizationCopyRights (myAuthorizationRef,&myRights, NULL, myFlags, NULL ); 

    char *tool = "/usr/sbin/apachectl";
    char *args[] = { "start",NULL} ;    

    myStatus = AuthorizationExecuteWithPrivileges(myAuthorizationRef, tool, kAuthorizationFlagDefaults, args, &pipe);
    char c[100];
    int n=fread(c,1,100,pipe);
    c[n] = '\0';
    NSLog(@"%s\n",c);

theResult: Эта операция требует root
Когда я запускаю 'whoami' , я ' root' , нокогда я запускаю getuid () , я ' 501' ...

Я пытаюсь использовать setuid (0);Но это не устанавливается !!
Вы можете мне помочь?
Спасибо

Ответы [ 3 ]

14 голосов
/ 28 декабря 2011

У меня была точно такая же проблема.AuthorizationExecuteWithPrivileges позволяет вам расширить свое разрешение для root, но не делает это автоматически (я думаю, чтобы сохранить сеанс пользователя или что-то еще).

В итоге я создал общий исполняемый файл, который будет запускаться через AuthorizationExecuteWithPrivileges, а затем этоИсполняемый файл установил бы root, а затем выполнил бы процесс, который вы фактически хотели бы запустить от имени root.

Вот исходный код исполняемого файла оболочки setuid:

#include <stdio.h>

int main(int argc, char** argv) {
  if (argc < 2) {
    printf("not enough arguments\n");
    return -1;
  }
  if (0 != setuid(0)) {
    printf("setuid failed.\n");
    return -3;
  }
  int i;
  char** argvz = (char**)malloc(sizeof(char*) * (argc - 1));
  for (i = 1; i < argc; i++) {
    argvz[i - 1] = argv[i];
  }

  execv(argv[1], argvz);
  printf("execv returned?\n");
  return -2;
}

Затем, в основном, запустите (вызывая его через AuthorizationExecuteWithPrivileges) его как:

setuid my-program-to-run and arguments to pass

Он будет установлен как root, а затем запустите соответствующую программу с заданными аргументами.

Обратите внимание, что вы must вызов setuid из AuthorizationExecuteWithPrivileges Поскольку только pid, созданный AuthorizationExecuteWithPrivileges, будет иметь повышенные привилегии (и setuid будет исполнять и заменять процесс своими). ​​

0 голосов
/ 29 апреля 2011

У меня точно такая же проблема!Это безумие, что whoami возвращает "root", а команда root возвращает "root required" !!Решение sudoers может работать, но я думаю, что нам нужно поискать бит setuid, как написано здесь https://github.com/notbrien/OSXSlightlyBetterAuth/blob/master/OSXSlightlyBetterAuth.m#L94

0 голосов
/ 15 апреля 2011

Я бы определил доступ для пользователя с uid = 501 доступом к / usr / sbin / apachectl в / etc / sudoers и выполнил бы "sudo / usr / sbin / apachectl" вместо / usr / sbin / apachectl в коде.

...