2015-05-15 11 views
5

Also, ich habe einen Root-Prozess (läuft als root), und ich möchte, dass es einen anderen Prozess mit einer nicht root-UID lädt.Laden eines Prozesses als anderer Benutzer?

Im Moment rufe ich seteuid und setegid an und setze mich dann auf root zurück, nachdem der Prozess erstellt wurde. Ich habe festgestellt, dass der Prozess immer noch mit einer Root-UID geladen wird. Was sollte ich dafür verwenden?

Java-Code (JNA):

public boolean loadVHost(String java, File sockfile) throws IOException { 
    if (CLib.INSTANCE.setegid(suid) != 0) { 
     log("setegid C call failed! @ " + id); 
     return false; 
    } 
    if (CLib.INSTANCE.seteuid(suid) != 0) { 
     log("seteuid C call failed! @ " + id); 
     return false; 
    } 
    if (CLib.INSTANCE.getegid() != suid || CLib.INSTANCE.geteuid() != suid) { 
     log("geteuid/egid C call returned unwanted value! @ " + id + " (returned " + CLib.INSTANCE.getuid() + ":" + CLib.INSTANCE.getgid() + ")"); 
     return false; 
    } 
    File hp = new File(homepath); 
    hp.mkdirs(); 
    File avuna = new File(hp, "avuna.jar"); 
    File main = new File(hp, "main.cfg"); // TODO: add linux user-based RAM/HDD/bandwidth caps 
    File hosts = new File(hp, "hosts.cfg"); 
    if (!avuna.exists() || !main.exists() || !hosts.exists()) { 
     log("VHost corrupted, avuna.jar/main.cfg/hosts.cfg is missing! Reinstalling..."); 
     // if (createVHost(java, sockfile.getAbsolutePath())) { 
     // log("Reinstallation completed, vhost loading..."); 
     // }else { 
     // log("Reinstallation failed, vhost NOT loading."); 
     // return false; 
     // } 
    } 
    ProcessBuilder builder = new ProcessBuilder(java, "-Xmx" + maxram + "M", "-Xms16M", "-jar", avuna.getAbsolutePath(), main.getAbsolutePath()); 
    // TODO: if we want to be able to pass std input/output/err, this would be the place 
    builder.redirectErrorStream(true); 
    this.process = builder.start(); 
    if (CLib.INSTANCE.seteuid(0) != 0) { 
     log("[CRITICAL] setuid C call failed! @ " + id + ", the VHost was loaded, but we were NOT able to re-escalate!"); 
     return false; 
    } 
    if (CLib.INSTANCE.setegid(0) != 0) { 
     log("[CRITICAL] setgid C call failed! @ " + id + ", the VHost was loaded, but we were NOT able to re-escalate!"); 
     return false; 
    } 
    return true; 
} 
+0

Was meinen Sie mit "einen anderen Prozess laden"? – Brian

+0

Anstatt zu beschreiben, was Sie tun, hilft es, indem Sie uns Code zeigen. Es muss kein tatsächlicher Code sein, aber ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) wäre nett. –

+0

Nun, mein Code ist eigentlich Java Aufruf JNA, also dachte ich, es wäre nicht sehr hilfreich. Ich werde es in einer Sekunde posten. @ JoachimPileborg – JavaProphet

Antwort

0

Ich tat, was Brian vorgeschlagen und verwendet einen anderen Prozess setuid, dann meine Sachen einfach ausgeführt.

Verwandte Themen