2009-09-13 11 views
6

Sto creando una semplice applicazione che consente di immettere rapidamente un comando shell da eseguire. Funziona perfettamente, tuttavia c'è il problema dei comandi sudo. Attualmente, rileva un comando sudo, quindi cerco di richiamare una finestra di autorizzazione per la password dell'utente, esattamente come si vedrebbe nel programma di installazione.Elevazione ai diritti di amministrazione nell'applicazione Mac

Ecco il codice una volta che rileva è un comando sudo:

SFAuthorization *authorization = [[SFAuthorization alloc] initWithFlags:kAuthorizationFlagPreAuthorize rights:NULL environment:kAuthorizationEmptyEnvironment]; 
if ([authorization obtainWithRight:"com.mycompany.myapplication" flags:kAuthorizationFlagPreAuthorize error:nil]){ 
    //authorized, now run the command using NSTask. 
}else{ 
    //fail 
} 

Ora, per quanto ne so, questo è totalmente e completamente sbagliato. Questo è proprio quello che ho messo insieme dalla documentazione. Qualche idea?

risposta

1

La sicurezza è difficile. Potrei parafrasare la documentazione e fornire frammenti di codice, ma probabilmente sarei sbagliato. Peggio ancora, anche se le mie descrizioni di alto livello fossero corrette, molto probabilmente ci sarebbe un piccolo bug negli snippet di codice che ucciderebbe la sicurezza.

Se si intende compromettere l'escalation dei privilegi, l'approccio migliore è leggere i documenti e utilizzare gli esempi forniti.

https://developer.apple.com/mac/library/documentation/Security/Conceptual/authorization_concepts/01introduction/introduction.html#//apple_ref/doc/uid/TP30000995-CH204-TP1

1

Ti consigliamo di utilizzare la funzione AuthorizationExecuteWithPrivileges, in questo modo:

- (IBAction)touch: (id) sender { 

    NSString * filepath = [_filepathfield stringValue]; 
    FILE *commpipe = NULL; 
    OSStatus execstatus; 


    NSLog(@"file path is %@", filepath); 

    char *args[] = {[filepath cString], NULL}; 


    SFAuthorization * authorization = [SFAuthorization authorization]; 

    execstatus = AuthorizationExecuteWithPrivileges([authorization authorizationRef], 
                "/usr/bin/touch", 
                kAuthorizationFlagDefaults, 
                args, 
                &commpipe); 

    if (execstatus == errAuthorizationSuccess) 
    NSlog(@"Toot! It worked"); 
    else 
    NSLog(@"No dice"); 

} 

Dato che BSD è un fiore delicato e scontroso mi consiglia di non lasciare che un utente eseguire comandi arbitrari da l'app come root.

/lezione

Il codice dal vostro esempio è l'inizio della strada da percorrere se si vuole limitare le funzioni del proprio programma da esso è di possedere gli utenti. Ad esempio, potresti avere un'app che consente solo a determinati utenti di modificare i dati da un file salvato. Pertanto, dovresti creare una voce nel database di sicurezza "com.mycompany.LibraryApp.AlterData" e verificare se l'utente dispone di tale privilegio quando tenta di modificare i dati. Ma questo è un argomento completamente diverso ...

Speranza che aiuti, -p.

+0

Ma questo non eseguirà NSTask. Qualche idea su come eseguire NSTask usando i privilegi? –

1

So che si tratta di una domanda molto vecchia, ma per coloro che cercano ancora una risposta, ecco qui. (Usa AppleScript)

NSAppleScript *script = [[NSAppleScript alloc] initWithSource:@"do shell script \"[YOUR SCRIPT HERE]\" with administrator privileges"]; 

di, ovviamente, sostituire [lo script QUI] con lo script, ed essere sicuri di sfuggire alla stringa, il modo in cui il cacao.

NSDictionary *errorInfo; 
[script executeAndReturnError:&errorInfo]; 

Per ulteriori spiegazioni, si prega di commento.

Problemi correlati