Walter: (PHP) Shellscript / Rechte / Einwahl

Hallo,

mein Problem ist folgendes:

Ich würde gerne über meinen Apache (auf Suse-Linux) eine
Oberfläche basteln, mit der ich einige Befehle steuern kann.
Ich möchte das ganze über PHP/Perl bzw. shellscripte
realisieren.

Bei den meisten Sachen funktioniert das auch ganz gut, aber wenn
ich mich z.B. an die Ein und Auswahl des Servers machen will,
dann streikt er.

In diesem Fall möchte ich z.B. 'cinternet' aufrufen.
PHP hängt, ohne das ich eine Fehlermeldung zurückbekomme.

Ich vermute, dass es an der Rechtevergabe liegt, aber alles
sollte eigentlich Lese- und Ausführrechte für 'other' haben.

Hat jemand einen Tipp, wie ich das realisieren kann, bzw.
was ich übersehen habe?

bis dann,

Walter

  1. Hallo Walter,

    Hat jemand einen Tipp, wie ich das realisieren kann, bzw.
    was ich übersehen habe?

    Hat das Programm cinternet unter dem Benutzer, unter dem der Webserver läuft, genügend Rechte, das zu tun? Ist das Programm als setuid installiert? Was steht im error log?

    Grüße,

    Christian

    --
    Ich wünsche allen ein frohes neues Jahr 2003!
    Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
    Hmm, was könnte ich sonst noch in die Signatur schreiben?
    1. Hallo,

      Hat jemand einen Tipp, wie ich das realisieren kann, bzw.
      was ich übersehen habe?

      Hat das Programm cinternet unter dem Benutzer, unter dem der Webserver läuft, genügend Rechte, das zu tun? Ist das Programm als setuid installiert? Was steht im error log?

      Es geht :-) Der entscheidene Hinweis war 'setuid'! Danke!

      Ich glaube ich habe meinen Denkfehler erkannt.
      'cinternet' gehört 'root' und andere dürfen es ausführen,
      aber da es wahrscheinlich noch andere Programme verwendetet
      oder auf andere Scripte zugreift, die wahrscheinlich eine
      root-Berechtigung bedürfen hat es nicht geklappt!
      Da es jetzt aber mit setuid als root ausgeführt wird klappt es! :-)

      Jedenfalls reime ich mir das als Anfänger so zusammen!

      Muß ich eigentlich noch auf was bestimmtes achten wenn ich 'setuid'
      benutze?
      Denn wenn ich da mit 'root' rumhantiere, dann kann das doch auch
      nach hinten losgehen?

      bis dann,

      Walter

      1. Hallo Walter,

        Muß ich eigentlich noch auf was bestimmtes achten wenn ich 'setuid'
        benutze?
        Denn wenn ich da mit 'root' rumhantiere, dann kann das doch auch
        nach hinten losgehen?

        Ja. Denn wenn eine Sicherheitslücke in irgendeinem Programm, das setuid root ist, vorhanden ist, dann kann diese ausgenutzt werden, um root-Rechte zu erlangen. Wenn das Programm keine Sicherheitslücken hat und auch keine Einstellungen, bei denen normale Benutzer mehr Rechte als sonst bekommen können - dann ist es sicher. Aber 'keine Sicherheitslücken' ist eine Utopie - das gibt's nur bei Hello World & co. Daher immer achtsam sein, gerade, was Sicherheitsupdates zu cinternet, pppd u.ä. angeht.

        Grüße,

        Christian

        --
        Ich wünsche allen ein frohes neues Jahr 2003!
        Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
        Hmm, was könnte ich sonst noch in die Signatur schreiben?
        1. Hallo,

          Ja. Denn wenn eine Sicherheitslücke in irgendeinem Programm, das setuid root ist, vorhanden ist, dann kann diese ausgenutzt werden, um root-Rechte zu erlangen. Wenn das Programm keine Sicherheitslücken hat und auch keine Einstellungen, bei denen normale Benutzer mehr Rechte als sonst bekommen können - dann ist es sicher. Aber 'keine Sicherheitslücken' ist eine Utopie - das gibt's nur bei Hello World & co. Daher immer achtsam sein, gerade, was Sicherheitsupdates zu cinternet, pppd u.ä. angeht.

          Ich habe noch eine Nachfrage. Ich habe mir folgendes überlegt:

          Wenn ich 'setuid' bei cinternet mache, dann hat man ja vollen
          Zugriff auf alle Parameter.
          Deshalb habe ich mir ein Script geschrieben, das nichts weiter
          macht als 'cinternet -start' aufzurufen.

          Diesem Script habe ich die gleichen Rechte wie cinternet gegeben
          und das 'setuid'-Flag bei 'cinternet' entfernt und bei meinem
          Script hinzugefügt. Meine Überlegung war, dass cinternet jetzt
          ja auch als root ausgeführt wird, aber eben nur mit diesem einen
          Parameter.

          Dies wäre nämlich auch für andere Anwendungsfälle nützlich.

          Aber komischerweise funktioniert dies nicht. Habe ich da wieder
          einen Denkfehler?

          bis dann,

          Walter

          1. Hallo Walter,

            Aber komischerweise funktioniert dies nicht. Habe ich da wieder
            einen Denkfehler?

            Ein Programm, das setuid root ist, bekommt nur root-Rechte, wenn es auch die Systemfunktion setuid() aufruft. Es gibt bei Scripten AFAIK nicht die Möglichkeit, dies zu tun, bei Perl vielleicht, aber bei PHP und bash AFAIK nicht. Außerdem müsstest Du dann Dein Script komplett absichern - also überlegen, wie ein Angreifer denn vorgehen _könnte_. Aber prinzipiell ist so ein Wrapper natürlich eine gute Idee. Am besten wäre, der wäre in C programmiert, würde keine Eingaben erlauben, und würde selbst (*nicht* per system() sondern per exec(), da system bei setuid Sicherheitslücken hat und Du ja das Programm sowieso ersetzen willst) einfach cinternet -start aufrufen - nichts anderes. Das wäre (fast) bombensicher.

            Grüße,

            Christian

            --
            Ich wünsche allen ein frohes neues Jahr 2003!
            Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
            Hmm, was könnte ich sonst noch in die Signatur schreiben?
            1. Hallo,

              Ein Programm, das setuid root ist, bekommt nur root-Rechte, wenn es auch die Systemfunktion setuid() aufruft. Es gibt bei Scripten AFAIK nicht die Möglichkeit, dies zu tun, bei Perl vielleicht, aber bei PHP und bash AFAIK nicht. Außerdem müsstest Du dann Dein Script komplett absichern - also überlegen, wie ein Angreifer denn vorgehen _könnte_. Aber prinzipiell ist so ein Wrapper natürlich eine gute Idee. Am besten wäre, der wäre in C programmiert, würde keine Eingaben erlauben, und würde selbst (*nicht* per system() sondern per exec(), da system bei setuid Sicherheitslücken hat und Du ja das Programm sowieso ersetzen willst) einfach cinternet -start aufrufen - nichts anderes. Das wäre (fast) bombensicher.

              Danke! Jetzt habe ich erstmal einen Überblick was so
              möglich ist und was nicht. Ich werde mich wohl noch ein wenig
              mit dem Thema beschäftigen!

              bis dann,

              Walter