COMMAND

    SCOhelp http server

SYSTEMS AFFECTED

    Unixware

PROBLEM

    Following  is  based  on  a  Core-SDI  Advisory  CORE-092700.  SCO
    Unixware 7 default installation  includes scohelp, an http  server
    that listens  on port  457/tcp and  allows access  to manual pages
    and other documentation files.  The search CGI script provided for
    that  purpose  has  a  vulnerability  that  could allow any remote
    attacker to execute arbitrary code on the vulnerable machine  with
    privileges of  user "nobody".   This vulnerability  was discovered
    by Juliano Rizzo of CORE SDI.

    This poses a threat that could result in the remote compromise  of
    the vulnerable  host and  provide a  staging point  from where  an
    attacker could escalate privileges.

    There  is  a  user  supplied  format  string bug in the vtopic CGI
    script that could be abused to execute arbitrary code.  By sending
    a request with the following URI:

        http://target:457/search97cgi/vtopic?Action=FilterSearch&filter=&queryText=%25x

    The server will elicit the following response:

        Internal error: STR_sprintf: Invalid format (Error E1-0142 (Query
        Builder): Invalid character '%' (0x25))

        Result
        Search failed: -40

        Result
        Error E1-0142 (Query Builder): Invalid character '

        Result
        Error E1-0130 (Query Builder): Syntax error in query string near
        character 1

        Result
        Error E1-0133 (Query Builder): Error parsing query: 81888e0

        Result
        VdkSearchNew failed, error -40

        Result
        Request failed for REQUEST_METHOD=, QUERY_STRING=

        Component
        Component (vsearch) failed in processing request, -2

        Action
        Action (FilterSearch) failed while processing request in component
        (vsearch), -2

        Service Manager
        Action (FilterSearch) failed in processing request, -2
        S97IS Service manager failed to process request

    Note the line:

        Error E1-0133 (Query Builder): Error parsing query: 81888e0

    This shows that the server is interpreting the %x argument  passed
    in the URI as the "queryText" value.  Supplying a carefully  built
    value  for  the  queryText  argument  an  attacker  can change the
    program flow and execute arbitrary code.

SOLUTION

    Contact the  vendor for  a fix.   In the  meantime, disabling  the
    http  server  on  port  457/tcp  will  prevent exploitation of the
    vulnerability.   However,  this  will  also  make  access  to  the
    documentation unavailable.  The following is a workaround supplied
    by the vendor:

        1) Log into the system as root
        2) cd /usr/ns-home/httpd-scohelphttp/search97
        3) mkdir ./securebin
        4) mv ./bin/vtopic ./securebin
        5) Using your favourite editor create a new version of  vtopic
           in     the      /usr/ns-home/httpd-scohelphttp/search97/bin
           directory containing the following:
        --------------------------------------------------------------------
        #!/bin/sh
        VERITYBIN=/usr/ns-home/httpd-scohelphttp/search97/bin
        SECUREBIN=/usr/ns-home/httpd-scohelphttp/search97/securebin
        configPath=$VERITYBIN/inetsrch.ini
        export configPath

        # If POST method, convert to QUERY_STRING
        if [ -z "$QUERY_STRING" ]
        then
                POST=1
                eval `$VERITYBIN/cgiparse -init`
        else
                POST=0
        fi

        # Exit if not set
        if [ -z "$QUERY_STRING" ]
        then
                exit 1
        fi

        # Now strip out insecure character %25
        QUERY_STRING=`echo "$QUERY_STRING" | sed "s/%25/+/g"`

        # First check for multiple ViewTemplate fields
        # which could fool vtopic
        COUNT=`$VERITYBIN/cgiparse -count -value ViewTemplate 2> /dev/null`
        if [ "$COUNT" -gt 1 ]
        then
                exit 1
        fi

        # First check for multiple ResultTemplate fields
        # which could fool vtopic
        COUNT=`$VERITYBIN/cgiparse -count -value ResultTemplate 2> /dev/null`
        if [ "$COUNT" -gt 1 ]
        then
                exit 1
        fi

        # Now check for correct path in ViewTemplate if it has one
        if echo "$QUERY_STRING" | egrep -i '&ViewTemplate=' > /dev/null 2>&1
        then
                MATCH=`cgiparse -value ViewTemplate 2> /dev/null | egrep -i
        '[-A-Za-z0-9_.]+/_SearchTemplates/docview.hts'`
                if [ -z "$MATCH" ]
                then
                        exit 1
                fi
        fi

        # Now check for correct path in ResultTemplate if it has one
        if echo "$QUERY_STRING" | egrep -i '&ResultTemplate=' > /dev/null 2>&1
        then
                MATCH=`cgiparse -value ResultTemplate 2> /dev/null | egrep -i
        '[-A-Za-z0-9_.]+/_SearchTemplates/result.hts'`
                if [ -z "$MATCH" ]
                then
                        exit 1
                fi
        fi

        # OK, so proceed
        if [ "$POST" -eq 1 ]
        then
                export CONTENT_LENGTH
                echo "$QUERY_STRING" | $SECUREBIN/vtopic
        else
                export QUERY_STRING
                $SECUREBIN/vtopic
        fi
        --------------------------------------------------------------------
        6) chmod +x vtopic

    This script  acts as  a wrapper  to the  vtopic binary  and blocks
    queries that can:

        1) Allow  a remote  user to  request to  view a world readable
           file like /etc/passwd
        2) Cause  a failure  like the  one described  in your email to
           SCO.