Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[FreeBSD] lpc als normaler Benutzer ausfuehren

7 views
Skip to first unread message

Volker Englisch

unread,
Nov 24, 2012, 12:33:45 PM11/24/12
to
Hallo!

Ich m�chte, da� ein normaler User das lpc-Kommando ausf�hren darf.

Dazu habe ich eine extra Gruppe angelegt und einen Wrapper geschrieben
(und kompiliert...), der nichts anderes macht, als lpc mit den
�bergebenen Parametern aufzurufen (mit explizitem Pfad zu lpc). ls
sagt folgendes:

-r-sr-x--- 1 root druckop 6224 23 Nov 08:32 lpc_wrapper

Als root aufgerufen, funktioniert das einwandfrei. Als normaler, in der
Group druckop befindlicher User, bekomme ich nur "?Privileged command".

Warum, trotz SUID? Oder f�llt jemandem hier ein besserer Weg ein, das
Problem zu l�sen?

Volker
Message has been deleted

Volker Birk

unread,
Nov 25, 2012, 7:07:41 AM11/25/12
to
Volker Englisch <v.englis...@rsli.de> wrote:
> Warum, trotz SUID? Oder fällt jemandem hier ein besserer Weg ein, das
> Problem zu lösen?

Wie wär's denn mit sudo?

Viele Grüsse,
VB.
--
Wenn Steinbrück „Urwahl“ hört, ruft der „Rolex!“

(Friedrich Küppersbusch)

Volker Englisch

unread,
Nov 25, 2012, 12:14:10 PM11/25/12
to
Am 25.11.12 schrieb Volker Birk:
> Volker Englisch <v.englis...@rsli.de> wrote:
>> Warum, trotz SUID? Oder f�llt jemandem hier ein besserer Weg ein, das
>> Problem zu l�sen?
>
> Wie w�r's denn mit sudo?

Hmm, m��te ich ausprobieren, ob ich damit den exit-Code von lpc zwecks
Weiterverarbeitung zur�ck bekomme. Das Ganze sollte n�mlich aus einem
Men� heraus "im Hintergrund" laufen. Ok, ich probiers ;-) Merci.

Volker

Juergen Ilse

unread,
Nov 25, 2012, 3:12:38 PM11/25/12
to
Hallo,

Gerhard Strangar <g...@arcor.de> wrote:
> Volker Englisch wrote (2012-11-24 18:33):
>> Dazu habe ich eine extra Gruppe angelegt und einen Wrapper geschrieben
>> (und kompiliert...), der nichts anderes macht, als lpc mit den
>> übergebenen Parametern aufzurufen (mit explizitem Pfad zu lpc).
> [...]
>> Oder fällt jemandem hier ein besserer Weg ein, das Problem zu lösen?

Versuch mal, vor dem exec() ein setuid(geteuid()); moeglicherweise
loest das dein Problem ...

> sudo?

Waere evt. ein workaround, aber keine Loesung der Frage, wie man
denn das ganze richtig mit eigenem Code umsetzt ...

Tschuess,
Juergen Ilse (jue...@usemet-verwaltung.de)
--
Ein Domainname ist nur ein Name, nicht mehr und nicht weniger.
Wer mehr hineininterpretiert, hat das Domain-Name-System nicht
verstanden.

Volker Englisch

unread,
Nov 26, 2012, 12:19:56 PM11/26/12
to
Am 25.11.12 schrieb Juergen Ilse:
> Gerhard Strangar <g...@arcor.de> wrote:
>> Volker Englisch wrote (2012-11-24 18:33):
>>> Dazu habe ich eine extra Gruppe angelegt und einen Wrapper geschrieben
>>> (und kompiliert...), der nichts anderes macht, als lpc mit den
>>> übergebenen Parametern aufzurufen (mit explizitem Pfad zu lpc).
>> [...]
>>> Oder fällt jemandem hier ein besserer Weg ein, das Problem zu lösen?
>
> Versuch mal, vor dem exec() ein setuid(geteuid()); moeglicherweise
> loest das dein Problem ...

Hmm, wenn meine Kenntnisse in C nicht so äußerst rudimentär wären - ich
hatte den Wrapper in einer anderen (uralten) Sprache geschrieben.

Ein Versuch in C mit (erstmal) nur Aufruf von lpc scheitert bereits
daran, daß lpc scheinbar einen falschen Parameter bekommt (?Bad
command):

#include <stdio.h>
#include <unistd.h>

int main (void)
{
int rc;
rc = execl("/usr/sbin/lpc", "lpc", "stop 4", NULL);
return rc;
}

Wie gesagt, C ist nicht meine Welt, sorry...

Volker

Juergen Ilse

unread,
Nov 26, 2012, 8:51:55 PM11/26/12
to
Hallo,

Volker Englisch <v.englis...@rsli.de> wrote:
> Am 25.11.12 schrieb Juergen Ilse:
>> Gerhard Strangar <g...@arcor.de> wrote:
>>> Volker Englisch wrote (2012-11-24 18:33):
>>>> Dazu habe ich eine extra Gruppe angelegt und einen Wrapper geschrieben
>>>> (und kompiliert...), der nichts anderes macht, als lpc mit den
>>>> übergebenen Parametern aufzurufen (mit explizitem Pfad zu lpc).
>>> [...]
>>>> Oder fällt jemandem hier ein besserer Weg ein, das Problem zu lösen?
>> Versuch mal, vor dem exec() ein setuid(geteuid()); moeglicherweise
>> loest das dein Problem ...
> Hmm, wenn meine Kenntnisse in C nicht so äußerst rudimentär wären - ich
> hatte den Wrapper in einer anderen (uralten) Sprache geschrieben.

Kannst du in der Sprache Library-Funktionen aufrufen? Wenn ja, rufe
die Funktion geteuid() auf (die gibt die effektive UID, also bei root
als Eigentuemer der Datei und gesetztem SetUID-Bit 0) zurueck. Dann
must du die Funktion setuid() aufrufen mit dem Wert, den du von geteuid()
zurueckbekommen hast, als Parameter. Wenn ich da nicht etwas falsch in
Erinnerung habe, gehen die mittels SetUID-Bit erhaltenen root-Rechte
beim starten eines anderen Programms wieder verloren, wenn man nicht
vorher auch die real UserID auf den Wert gesetzt hat. Der Aufruf von
setuid() dient nur dazu, die real-UserID zu setzen, bevor man ein
anderes Programm aufruft.

> Ein Versuch in C mit (erstmal) nur Aufruf von lpc scheitert bereits
> daran, daß lpc scheinbar einen falschen Parameter bekommt (?Bad
> command):
>
> #include <stdio.h>
> #include <unistd.h>
>
> int main (void)
> {
> int rc;
> rc = execl("/usr/sbin/lpc", "lpc", "stop 4", NULL);

Das entpraeche in etwa einem

/usr/sbin/lpc "stop 4"

(beachte die Anfuehrungszeichen). Wenn du *eigentlich* das Kommando

/usr/sbin/lpc stop 4

ausfuehren moechtest, solltest du statt dessen etwas wie

rc = execl("/usr/sbin/lpc", "lpc", "stop", "4", NULL);

durchfuehren. Du koenntest es dir aber auch einfach macgen und die
shell deine Kommandoteile parsen lassen, indem du die auszufuehrende
Kommandozeile als einen einzigen String an die Funktion system()
uebergibst ...

> return rc;
> }
>
> Wie gesagt, C ist nicht meine Welt, sorry...

Evt.kannst du etwas entsprechendes wie das setuid(geteuid()); auch
in der von dir verwendeten Sprache nachbauen ...

Tschuess,
Juergen Ilse (jue...@usenet-verwaltung.de)

Torsten Schneider

unread,
Nov 27, 2012, 6:25:32 AM11/27/12
to
Volker Englisch <v.englis...@rsli.de> wrote:

>int main (void)
>{
> int rc;
> rc = execl("/usr/sbin/lpc", "lpc", "stop 4", NULL);
> return rc;
>}

Noch ein Hinweis: Die exec-Funktionen kehren nie zurück, und wenn doch,
dann ist ein Fehler aufgetreten, rc wäre in dem Fall immer -1. Spannend
ist dann der Wert in errno. Vielleicht solltest du das noch in die
Fehlerbehandlung einbauen.


Viele Grüße, Torsten

Michael Baeuerle

unread,
Nov 27, 2012, 6:59:40 AM11/27/12
to
Volker Englisch wrote:
>
> Ein Versuch in C mit (erstmal) nur Aufruf von lpc scheitert bereits
> daran, daß lpc scheinbar einen falschen Parameter bekommt (?Bad
> command):
>
> #include <stdio.h>
> #include <unistd.h>
>
> int main (void)
> {
> int rc;
> rc = execl("/usr/sbin/lpc", "lpc", "stop 4", NULL);
> return rc;
> }
>
> Wie gesagt, C ist nicht meine Welt, sorry...

Du übergibst "stop 4" als einen Parameter, eine Shell würde "stop 4"
(ohne Anführungszeichen) aber als 2 Parameter übergeben. Probiere es mal
so:

----------------------------------------------------------------------
#include <unistd.h>

int main(void)
{
execl("/usr/sbin/lpc", "lpc", "stop", "4", (const char*) NULL);
}
----------------------------------------------------------------------

Als letztes Argument erwartet execl() einen Pointer. NULL darf aber auch
als Integer definiert sein und wegen der variablen Parameterliste kann
der Compiler nicht wissen welchen Typ die Funktion erwartet. Der Typ
wird daher nicht automatisch implizit umgewandelt wie bei den normalen
Parametern.


Micha

Volker Englisch

unread,
Nov 28, 2012, 3:32:47 AM11/28/12
to
Am 27.11.12 schrieb Torsten Schneider:
> Noch ein Hinweis: Die exec-Funktionen kehren nie zur�ck, und wenn doch,
> dann ist ein Fehler aufgetreten, rc w�re in dem Fall immer -1. Spannend
> ist dann der Wert in errno. Vielleicht solltest du das noch in die
> Fehlerbehandlung einbauen.

Jetzt siehts so aus:

#include <unistd.h>
#include <errno.h>

int main (void)
{
execl("/usr/sbin/lpc", "stop", "4", (const char*) NULL);
return errno;
}

Heute abend mal testen. Danke f�r den Tipp.

Volker

Volker Englisch

unread,
Nov 28, 2012, 3:34:26 AM11/28/12
to
Am 27.11.12 schrieb Michael Baeuerle:
> ----------------------------------------------------------------------
> #include <unistd.h>
>
> int main(void)
> {
> execl("/usr/sbin/lpc", "lpc", "stop", "4", (const char*) NULL);
> }
> ----------------------------------------------------------------------
>
> Als letztes Argument erwartet execl() einen Pointer. NULL darf aber auch
> als Integer definiert sein und wegen der variablen Parameterliste kann
> der Compiler nicht wissen welchen Typ die Funktion erwartet. Der Typ
> wird daher nicht automatisch implizit umgewandelt wie bei den normalen
> Parametern.

Wieder was dazugelernt, danke. Heute abend gehts ans Testen...

Volker
0 new messages