home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1996 July / AMIGA_1996_7.BIN / ausgabe_7_96 / pd-programmierung / perl5_002bin.lha / man / catp / perlsec.0 < prev    next >
Text File  |  1996-03-02  |  15KB  |  265 lines

  1.  
  2.  
  3.  
  4. PERLSEC(1)     User Contributed Perl Documentation     PERLSEC(1)
  5.  
  6.  
  7. NNNNAAAAMMMMEEEE
  8.        perlsec - Perl security
  9.  
  10. DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
  11.        Perl is designed to make it easy to write secure setuid
  12.        and setgid scripts.  Unlike shells, which are based on
  13.        multiple substitution passes on each line of the script,
  14.        Perl uses a more conventional evaluation scheme with fewer
  15.        hidden "gotchas".  Additionally, since the language has
  16.        more built-in functionality, it has to rely less upon
  17.        external (and possibly untrustworthy) programs to
  18.        accomplish its purposes.
  19.  
  20.        Beyond the obvious problems that stem from giving special
  21.        privileges to such flexible systems as scripts, on many
  22.        operating systems, setuid scripts are inherently insecure
  23.        right from the start.  This is because that between the
  24.        time that the kernel opens up the file to see what to run,
  25.        and when the now setuid interpreter it ran turns around
  26.        and reopens the file so it can interpret it, things may
  27.        have changed, especially if you have symbolic links on
  28.        your system.
  29.  
  30.        Fortunately, sometimes this kernel "feature" can be
  31.        disabled.  Unfortunately, there are two ways to disable
  32.        it.  The system can simply outlaw scripts with the setuid
  33.        bit set, which doesn't help much.  Alternately, it can
  34.        simply ignore the setuid bit on scripts.  If the latter is
  35.        true, Perl can emulate the setuid and setgid mechanism
  36.        when it notices the otherwise useless setuid/gid bits on
  37.        Perl scripts.  It does this via a special executable
  38.        called ssssuuuuiiiiddddppppeeeerrrrllll that is automatically invoked for you if
  39.        it's needed.
  40.  
  41.        If, however, the kernel setuid script feature isn't
  42.        disabled, Perl will complain loudly that your setuid
  43.        script is insecure.  You'll need to either disable the
  44.        kernel setuid script feature, or put a C wrapper around
  45.        the script.  See the program wwwwrrrraaaappppssssuuuuiiiidddd in the _e_g directory
  46.        of your Perl distribution for how to go about doing this.
  47.  
  48.        There are some systems on which setuid scripts are free of
  49.        this inherent security bug.  For example, recent releases
  50.        of Solaris are like this.  On such systems, when the
  51.        kernel passes the name of the setuid script to open to the
  52.        interpreter, rather than using a pathname subject to
  53.        mettling, it instead passes /dev/fd/3.  This is a special
  54.        file already opened on the script, so that there can be no
  55.        race condition for evil scripts to exploit.  On these
  56.        systems, Perl should be compiled with
  57.        ----DDDDSSSSEEEETTTTUUUUIIIIDDDD____SSSSCCCCRRRRIIIIPPPPTTTTSSSS____AAAARRRREEEE____SSSSEEEECCCCUUUURRRREEEE____NNNNOOOOWWWW.  The CCCCoooonnnnffffiiiigggguuuurrrreeee program
  58.        that builds Perl tries to figure this out for itself.
  59.  
  60.        When executing a setuid script, or when you have turned on
  61.  
  62.  
  63.  
  64. 23/Jan/96                perl 5.002 with                        1
  65.  
  66.  
  67.  
  68.  
  69.  
  70. PERLSEC(1)     User Contributed Perl Documentation     PERLSEC(1)
  71.  
  72.  
  73.        taint checking explicitly using the ----TTTT flag, Perl takes
  74.        special precautions to prevent you from falling into any
  75.        obvious traps.  (In some ways, a Perl script is more
  76.        secure than the corresponding C program.)  Any command
  77.        line argument, environment variable, or input is marked as
  78.        "tainted", and may not be used, directly or indirectly, in
  79.        any command that invokes a subshell, or in any command
  80.        that modifies files, directories, or processes.  Any
  81.        variable that is set within an expression that has
  82.        previously referenced a tainted value also becomes tainted
  83.        (even if it is logically impossible for the tainted value
  84.        to influence the variable).  For example:
  85.  
  86.            $$$$ffffoooooooo ==== sssshhhhiiiifffftttt;;;;               #### $$$$ffffoooooooo iiiissss ttttaaaaiiiinnnntttteeeedddd
  87.            $$$$bbbbaaaarrrr ==== $$$$ffffoooooooo,,,,''''bbbbaaaarrrr'''';;;;          #### $$$$bbbbaaaarrrr iiiissss aaaallllssssoooo ttttaaaaiiiinnnntttteeeedddd
  88.            $$$$xxxxxxxxxxxx ==== <<<<>>>>;;;;                  #### TTTTaaaaiiiinnnntttteeeedddd
  89.            $$$$ppppaaaatttthhhh ==== $$$$EEEENNNNVVVV{{{{''''PPPPAAAATTTTHHHH''''}}}};;;;       #### TTTTaaaaiiiinnnntttteeeedddd,,,, bbbbuuuutttt sssseeeeeeee bbbbeeeelllloooowwww
  90.            $$$$aaaabbbbcccc ==== ''''aaaabbbbcccc'''';;;;               #### NNNNooootttt ttttaaaaiiiinnnntttteeeedddd
  91.  
  92.            ssssyyyysssstttteeeemmmm """"eeeecccchhhhoooo $$$$ffffoooooooo"""";;;;         #### IIIInnnnsssseeeeccccuuuurrrreeee
  93.            ssssyyyysssstttteeeemmmm """"////bbbbiiiinnnn////eeeecccchhhhoooo"""",,,, $$$$ffffoooooooo;;;;   #### SSSSeeeeccccuuuurrrreeee ((((ddddooooeeeessssnnnn''''tttt uuuusssseeee sssshhhh))))
  94.            ssssyyyysssstttteeeemmmm """"eeeecccchhhhoooo $$$$bbbbaaaarrrr"""";;;;         #### IIIInnnnsssseeeeccccuuuurrrreeee
  95.            ssssyyyysssstttteeeemmmm """"eeeecccchhhhoooo $$$$aaaabbbbcccc"""";;;;         #### IIIInnnnsssseeeeccccuuuurrrreeee uuuunnnnttttiiiillll PPPPAAAATTTTHHHH sssseeeetttt
  96.  
  97.            $$$$EEEENNNNVVVV{{{{''''PPPPAAAATTTTHHHH''''}}}} ==== ''''////bbbbiiiinnnn::::////uuuussssrrrr////bbbbiiiinnnn'''';;;;
  98.            $$$$EEEENNNNVVVV{{{{''''IIIIFFFFSSSS''''}}}} ==== '''''''' iiiiffff $$$$EEEENNNNVVVV{{{{''''IIIIFFFFSSSS''''}}}} nnnneeee '''''''';;;;
  99.  
  100.            $$$$ppppaaaatttthhhh ==== $$$$EEEENNNNVVVV{{{{''''PPPPAAAATTTTHHHH''''}}}};;;;       #### NNNNooootttt ttttaaaaiiiinnnntttteeeedddd
  101.            ssssyyyysssstttteeeemmmm """"eeeecccchhhhoooo $$$$aaaabbbbcccc"""";;;;         #### IIIIssss sssseeeeccccuuuurrrreeee nnnnoooowwww!!!!
  102.  
  103.            ooooppppeeeennnn((((FFFFOOOOOOOO,,,,""""$$$$ffffoooooooo""""))));;;;           #### OOOOKKKK
  104.            ooooppppeeeennnn((((FFFFOOOOOOOO,,,,"""">>>>$$$$ffffoooooooo""""))));;;;          #### NNNNooootttt OOOOKKKK
  105.  
  106.            ooooppppeeeennnn((((FFFFOOOOOOOO,,,,""""eeeecccchhhhoooo $$$$ffffoooooooo||||""""))));;;;     #### NNNNooootttt OOOOKKKK,,,, bbbbuuuutttt............
  107.            ooooppppeeeennnn((((FFFFOOOOOOOO,,,,""""----||||"""")))) |||||||| eeeexxxxeeeecccc ''''eeeecccchhhhoooo'''',,,, $$$$ffffoooooooo;;;;        #### OOOOKKKK
  108.  
  109.            $$$$zzzzzzzzzzzz ==== ````eeeecccchhhhoooo $$$$ffffoooooooo````;;;;         #### IIIInnnnsssseeeeccccuuuurrrreeee,,,, zzzzzzzzzzzz ttttaaaaiiiinnnntttteeeedddd
  110.  
  111.            uuuunnnnlllliiiinnnnkkkk $$$$aaaabbbbcccc,,,,$$$$ffffoooooooo;;;;           #### IIIInnnnsssseeeeccccuuuurrrreeee
  112.            uuuummmmaaaasssskkkk $$$$ffffoooooooo;;;;                 #### IIIInnnnsssseeeeccccuuuurrrreeee
  113.  
  114.            eeeexxxxeeeecccc """"eeeecccchhhhoooo $$$$ffffoooooooo"""";;;;           #### IIIInnnnsssseeeeccccuuuurrrreeee
  115.            eeeexxxxeeeecccc """"eeeecccchhhhoooo"""",,,, $$$$ffffoooooooo;;;;          #### SSSSeeeeccccuuuurrrreeee ((((ddddooooeeeessssnnnn''''tttt uuuusssseeee sssshhhh))))
  116.            eeeexxxxeeeecccc """"sssshhhh"""",,,, ''''----cccc'''',,,, $$$$ffffoooooooo;;;;      #### CCCCoooonnnnssssiiiiddddeeeerrrreeeedddd sssseeeeccccuuuurrrreeee,,,, aaaallllaaaassss
  117.  
  118.        The taintedness is associated with each scalar value, so
  119.        some elements of an array can be tainted, and others not.
  120.  
  121.        If you try to do something insecure, you will get a fatal
  122.        error saying something like "Insecure dependency" or
  123.        "Insecure PATH".  Note that you can still write an
  124.        insecure system call or exec, but only by explicitly doing
  125.        something like the last example above.  You can also
  126.        bypass the tainting mechanism by referencing
  127.  
  128.  
  129.  
  130. 23/Jan/96                perl 5.002 with                        2
  131.  
  132.  
  133.  
  134.  
  135.  
  136. PERLSEC(1)     User Contributed Perl Documentation     PERLSEC(1)
  137.  
  138.  
  139.        subpatterns--Perl presumes that if you reference a
  140.        substring using $$$$1111, $$$$2222, etc, you knew what you were doing
  141.        when you wrote the pattern:
  142.  
  143.            $$$$AAAARRRRGGGGVVVV[[[[0000]]]] ====~~~~ ////^^^^----PPPP((((\\\\wwww++++))))$$$$////;;;;
  144.            $$$$pppprrrriiiinnnntttteeeerrrr ==== $$$$1111;;;;              #### NNNNooootttt ttttaaaaiiiinnnntttteeeedddd
  145.  
  146.        This is fairly secure since \\\\wwww++++ doesn't match shell
  147.        metacharacters.  Use of ////....++++//// would have been insecure, but
  148.        Perl doesn't check for that, so you must be careful with
  149.        your patterns.  This is the _O_N_L_Y mechanism for untainting
  150.        user supplied filenames if you want to do file operations
  151.        on them (unless you make $$$$>>>> equal to $$$$<<<< ).
  152.  
  153.        For "Insecure $$$$EEEENNNNVVVV{PATH}" messages, you need to set
  154.        $$$$EEEENNNNVVVV{{{{''''PPPPAAAATTTTHHHH''''}}}} to a known value, and each directory in the
  155.        path must be non-writable by the world.  A frequently
  156.        voiced gripe is that you can get this message even if the
  157.        pathname to an executable is fully qualified.  But Perl
  158.        can't know that the executable in question isn't going to
  159.        execute some other program depending on the PATH.
  160.  
  161.        It's also possible to get into trouble with other
  162.        operations that don't care whether they use tainted
  163.        values.  Make judicious use of the file tests in dealing
  164.        with any user-supplied filenames.  When possible, do opens
  165.        and such after setting $$$$>>>> ==== $$$$<<<<.  (Remember group IDs,
  166.        too!) Perl doesn't prevent you from opening tainted
  167.        filenames for reading, so be careful what you print out.
  168.        The tainting mechanism is intended to prevent stupid
  169.        mistakes, not to remove the need for thought.
  170.  
  171.        This gives us a reasonably safe way to open a file or
  172.        pipe: just reset the id set to the original IDs.  Here's a
  173.        way to do backticks reasonably safely.  Notice how the
  174.        _e_x_e_c_(_) is not called with a string that the shell could
  175.        expand.  By the time we get to the _e_x_e_c_(_), tainting is
  176.        turned off, however, so be careful what you call and what
  177.        you pass it.
  178.  
  179.            ddddiiiieeee uuuunnnnlllleeeessssssss ddddeeeeffffiiiinnnneeeedddd $$$$ppppiiiidddd ==== ooooppppeeeennnn((((KKKKIIIIDDDD,,,, """"----||||""""))));;;;
  180.            iiiiffff (((($$$$ppppiiiidddd)))) {{{{           #### ppppaaaarrrreeeennnntttt
  181.                wwwwhhhhiiiilllleeee ((((<<<<KKKKIIIIDDDD>>>>)))) {{{{
  182.                    #### ddddoooo ssssoooommmmeeeetttthhhhiiiinnnngggg
  183.                }}}}
  184.                cccclllloooosssseeee KKKKIIIIDDDD;;;;
  185.            }}}} eeeellllsssseeee {{{{
  186.                $$$$>>>> ==== $$$$<<<<;;;;
  187.                $$$$)))) ==== $$$$((((;;;;  #### BBBBUUUUGGGG:::: iiiinnnniiiittttggggrrrroooouuuuppppssss(((()))) nnnnooootttt ccccaaaalllllllleeeedddd
  188.                eeeexxxxeeeecccc ''''pppprrrrooooggggrrrraaaammmm'''',,,, ''''aaaarrrrgggg1111'''',,,, ''''aaaarrrrgggg2222'''';;;;
  189.                ddddiiiieeee """"ccccaaaannnn''''tttt eeeexxxxeeeecccc pppprrrrooooggggrrrraaaammmm:::: $$$$!!!!"""";;;;
  190.            }}}}
  191.  
  192.        For those even more concerned about safety, see the _S_a_f_e
  193.  
  194.  
  195.  
  196. 23/Jan/96                perl 5.002 with                        3
  197.  
  198.  
  199.  
  200.  
  201.  
  202. PERLSEC(1)     User Contributed Perl Documentation     PERLSEC(1)
  203.  
  204.  
  205.        and _S_a_f_e _C_G_I modules at a CPAN site near you.  See the
  206.        _p_e_r_l_m_o_d manpage for a list of CPAN sites.
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262. 23/Jan/96                perl 5.002 with                        4
  263.  
  264.  
  265.