Alain: open(mail "|$mailprog -t...im -T modus

Hallo,
also ich möchte nochmal zum thema vom 16.july.2003 http://forum.de.selfhtml.org/archiv/2003/7/52570/
was sagen,wo ich ein problem hatte im -T (taint modus) das mailprogramm zu starten.
Ich habs nun rausgefunden es war also doch der systemaufruf für den open (mail "|$mailprog...
wenn man da den $ENV{PATH} declariert dann gehts im taint modus.
Richtiges beispiel:

$ENV{"PATH"} = "";
open (MAIL, "|$mailprog -t") || &Dead();
print MAIL "To: $mailto\n";

wenn ich $ENV{"PATH"} = "|"; schreibe dann gehts auch nicht?! nur ohne.

Gruss vom Alain

--
...wenn das gehirn so einfach wäre,es zu vestehen,\nwären wir zu dumm um es zu begreifen...
  1. Hallo nochmal,
    dies las ich bei
    http://gunther.web66.com/FAQS/taintmode.html
    --------------------
    The way around this problem is to clear the PATH environment variable so that Perl can trust that the
         command passed as a system call is an absolute path to a command instead of being part of the search
         path.

    You might ask "What is unsafe about the path?". Historically, path's are considered unsafe because if
         there are multiple versions of an executable, it is difficult to tell which one is actually being executed. If
         there is a bug in one of the versions, then this can pose a security hazard.

    Basically, before doing a system call, clear the PATH by issuing a statement like the following

    $ENV{"PATH"} = "";

    Note, this does not just apply to the system() call. It also applies to opening up files with the | symbol
         (which executes a command) or using backticks `` to execute an external command. Of course, now you
         will need to call the command using an absolute path.
    ------------------

    meine frage dazu wäre noch,
    was ist die genauere path angabe für den system aufruf "open (MAIL, "|$mailprog -t") || &Dead(); " ?

    Gruss vom Alain

    --
    ...wenn das gehirn so einfach wäre,es zu vestehen,
    wären wir zu dumm um es zu begreifen...
    1. Halihallo Alain

      http://gunther.web66.com/FAQS/taintmode.html

      Danke für die Erklärung, war mir neu.

      was ist die genauere path angabe für den system aufruf "open (MAIL, "|$mailprog -t") || &Dead(); " ?

      $mailprog = '/usr/sbin/sendmail';  # oder Äquvalente
      einfach vom root aus adressieren, sodass das Programm eineindeutig adressiert ist
      (also kein lookup in diverse /bin Verzeichnisse stattfinden muss um das Programm zu
      "suchen"). Ein "absoluter Pfad" eben...

      Viele Grüsse

      Philipp

      --
      RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
      Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
      1. Hoi,
        danke für die konkrete antwort .

        $mailprog = '/usr/sbin/sendmail';  # oder Äquvalente
        einfach vom root aus adressieren, sodass das Programm eineindeutig adressiert ist
        (also kein lookup in diverse /bin Verzeichnisse stattfinden muss um das Programm zu
        "suchen"). Ein "absoluter Pfad" eben...

        also dann ist das $ENV{'PATH'} = '/bin:/usr/sbin/';
        auch ok jedefalls funktionierts so auch im taint modus.
        Gruss vom Alain

        --
        ...wenn das gehirn so einfach wäre,es zu vestehen,
        wären wir zu dumm um es zu begreifen...
        1. Halihallo Alain

          $mailprog = '/usr/sbin/sendmail';  # oder Äquvalente
          einfach vom root aus adressieren, sodass das Programm eineindeutig adressiert ist
          (also kein lookup in diverse /bin Verzeichnisse stattfinden muss um das Programm zu
          "suchen"). Ein "absoluter Pfad" eben...
          also dann ist das $ENV{'PATH'} = '/bin:/usr/sbin/';
          auch ok jedefalls funktionierts so auch im taint modus.

          Das wiederspricht sich mit der Erklärung, die du gepostet hast. Dein oben genanntes
          Beispiel definiert den Search-Path als entweder /bin oder /usr/sbin, somit könnte ein
          Programm ohne absolute Pfadadressierung (z.B. über "./program" statt "program") in
          zwei Verzeichnissen gefunden werden. Die verlinkte Ressource besagt, dass ein Programm
          aber eineindeutig adressiert sein muss, da sonst eine von mehreren Versionen gefunden
          werden kann, welche eben nicht "sicher" ist.

          Beispiel:
          $ENV{PATH} = '/bin:/usr/sbin';
          system('try.pl')

          sucht zuerst in /bin, dann in /usr/sbin. Wenn du dein try.pl in /usr/sbin erstellt hast,
          dann aber ein anderer user ein try.pl in /bin ablegt, um deine Eingaben abzufangen, ist
          dies "unsicher", da du auf die Korrektheit des anderen Programmes nicht zählen kannst.
          Deshalb soll der Tainted-Modus nur absolute Pfade akzeptieren, sodass du sicher sein
          kannst, dass dein Programm (also /usr/sbin/try.pl) ausgeführt wird und nicht ein anderes.

          Aber warum hier der Tainted-Modus nicht Einspruch erhebt weiss ich nicht.

          Viele Grüsse

          Philipp

          --
          RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
          Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
          1. Hallo,

            Aber warum hier der Tainted-Modus nicht Einspruch erhebt weiss ich nicht.

            ja das find ich auch komisch,aber nach der englischen erklärung nehm ich mal an
            dass das perl script im taint modus erst im /usr/bin/ verzeichniss nach dem mailprog sucht
            und dann reklammiert im taint... wenn nicht vor dem öffnen des mailprogramms der andere pfad
            /usr/sbin/ angegeben wird .Ich habe da auch was bei w3c http://www.w3.org/Security/faq/wwwsf4.html#CGI-Q17 gefunden .
            -----------------------
            OK, I turned on taint checks like you said. Now my script dies with
            the message: "Insecure $ENV{PATH} at line XX" every time I try to run
            it!

            Even if you don't rely on the path when you invoke an external program, there's a chance that the invoked program might.
            Therefore you need to include the following line towards the top of your script whenever you use taint checks:

            $ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin';

            Adjust this as necessary for the list of directories you want searched. It's not a good idea to include the current directory (".") in
            the path.
            ----------------------

            Gruss vom Alain

            --
            ...wenn das gehirn so einfach wäre,es zu vestehen,
            wären wir zu dumm um es zu begreifen...
            1. Halihallo Alain

              Ich habe es mir jetzt selber angesehen:

              aus http://gunther.web66.com/FAQS/taintmode.html#system:
              ---
              When you make a system call to an external program or use its sister command, exec, taint mode also stops this from happening if the PATH has not been adjusted. Again, since a string is being passed to the system call, Perl generally has trouble figuring out whether a relative or absolute path to a command has been passed. Being in "paranoid" mode, Perl stops the command from executing.

              The way around this problem is to clear the PATH environment variable so that Perl can trust that the command passed as a system call is an absolute path to a command instead of being part of the search path.
              ---

              Also die Zeilen oberhalb deines Extracts im zweiten Posting. Sobald $ENV{PATH} auf
              irgendetwas gesetzt wird, ist die Verwendung nicht tainted. Die Eineindeutigkeit muss
              also nicht gegeben sein, nur, dass der Programmierer _genau_ definiert, wo seine
              ausführbaren Programme sind (ansonsten ist PATH von der Umgebung entnommen, in der Perl
              gestartet wurde und _das_ ist tainted).

              $ENV{PATH} = '';   ist einfach _noch_ sicherer, da dann die Adressierung der Programme
              nur auf absoluter Basis geschehen kann und somit auch die Eineindeutigkeit des Programmes
              sichergestellt ist.

              Viele Grüsse

              Philipp

              --
              RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
              Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
              1. Hallo,

                $ENV{PATH} = '';   ist einfach _noch_ sicherer, da dann die Adressierung der Programme
                nur auf absoluter Basis geschehen kann und somit auch die Eineindeutigkeit des Programmes
                sichergestellt ist.

                AHA jetzt ist mir alles klar und klingt auch logischer.
                Ich meine,warum sollte man den genauen pfad zweimal angeben,wenn gleich danach
                der genaue pfad zum mailprog aufgerufen wird? Desshalb $ENV{'PATH'} = '';
                Gruss vom Alain

                --
                ...wenn das gehirn so einfach wäre,es zu vestehen,
                wären wir zu dumm um es zu begreifen...
                1. Halihallo Alain

                  Ich meine,warum sollte man den genauen pfad zweimal angeben,wenn gleich danach
                  der genaue pfad zum mailprog aufgerufen wird? Desshalb $ENV{'PATH'} = '';

                  Es ist eigentlich ganz einfach, das habe ich aber auch erst nachher festgestellt :-) :
                  Es ist wie mit allen anderen Parameter: Kommen sie von aussen sind sie tainted, werden
                  sie im Programm umgestellt, oder durch RegExp geprüft sind sie akzeptiert.
                  Das mit der Reihenfolge der Pfade und der Eineindeutigkeit war eine Falscheinschätzung
                  von mir.

                  Viele Grüsse

                  Philipp

                  --
                  RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
                  Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.