3

私はココアの初心者です...

CocoaアプリでApacheやその他のプロセスを開始したいだけです。

これが私のコードです:

    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);を使おうとしています。しかし、それは設定されていません!!
手伝って頂けますか?
ありがとう

4

3 に答える 3

14

私はこれとまったく同じ問題を抱えていました。AuthorizationExecuteWithPrivileges を使用すると、アクセス許可をルートにエスカレートできますが、自動的には実行されません (ユーザー セッションなどを保持すると思います)。

最終的には、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

ルートとして設定され、指定された引数で問題のプログラムを実行します。

AuthorizationExecuteWithPrivileges から setuid を呼び出さなければならないことに注意してください。AuthorizationExecuteWithPrivileges によって作成された pid だけがエスカレートされた特権を持ちます (setuid は実行され、プロセスを独自のものに置き換えます)。

于 2011-12-27T23:07:55.557 に答える
0

私はまったく同じ問題に直面しています! whoami が "root" を返し、root コマンドが "root required" を返すというのは正気ではありません !! sudoers ソリューションは機能する可能性がありますが、ここに書かれているように、setuid ビットを検索する必要があると思いますhttps://github.com/notbrien/OSXSlightlyBetterAuth/blob/master/OSXSlightlyBetterAuth.m#L94

于 2011-04-29T15:41:22.210 に答える
0

/etc/sudoers で /usr/sbin/apachectl への uid=501 アクセス権を持つユーザーのアクセスを定義し、コード内の /usr/sbin/apachectl の代わりに「sudo /usr/sbin/apachectl」を実行します。

于 2011-04-15T15:18:23.367 に答える