🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #745

Re: Hacer programas seguro

#745
From: Pascal Bourguignon
Date: Mon, 25 Sep 2006 17:47
99 lines
4647 bytes
Pedro Maicas <esta_no_es@jet.es> writes:

> On Mon, 25 Sep 2006 01:39:14 +0200, arrase <arrase@gulcas.org> wrote:
>
>>http://www.iit.upco.es/palacios/cursoc/estiloCseguro.pdf
>
>
> Creo que para hacer un programa 'seguro' lo �nico de lo
> que debemos preocuparnos es del buffer overflow, todas
> las funciones que aceptan datos en un buffer, deber�an
> comprobar que los datos no se salen de ese buffer.
>
> A lo dem�s no le veo relacion con la seguridad, si haces
> un bucle infinito, si se te desmanda un puntero, etc...
> lo �nico que pasa es que tienes un programa con bugs,
> pero nada m�s. Es como si quieres sumar 2+2 y en vez
> de sumarlo los restas, eso no es un programa inseguro
> sino un programa que no hace lo que debe.
>
> Por otro lado un programa que no comprueba el desbordamiento
> de buffer, es un programa 'correcto' desde el punto de vista
> del algorimo que se trata de aplicar, pero es inseguro
> porque se puede inyectar c�digo a trav�s del buffer.

Por ejemplo, el program siguiente es perfecto, no hay ningun
desbordamiento de bufer, los modulos sockets y strings se
responsabilizan de ello.  Pero, tiene un grave problem a de seguridad.
Es un servidor que espera conexiones, y comandos dados por algun
usuario sobre estas conexiones.  Normalmente, el usuario da un comando:

GET /camio/hacia/un/archivo

y este programa copia el archivo en un directorio /var/spool/server/
para procesar lo.  (Podemos a�adir comprobaciones, de autoridad y
derechos de acceso, esto no es el problema). 

------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include "sockets.h"
#include "strings.h"

const int PORT=12345;

int main(void){
   socket_start_server(PORT);
   while(1){
      if(socket_listen()){
         string usercmd=socket_read();
         if(string_equal_p(string_from_c("GET "),string_substring(usercmd,0,4))){
             string file=string_substring(usercmd,4,STRING_END);
             string command=string_format("cp %s /var/spool/server/",file);
             system(string_to_c(command));
             /* ... */
         }/* ... */
      socket_disconnect();
   }
   return(0);
}
------------------------------------------------------------------------

Que pasaria si el usuario, inocentemente o malamente, da como nombre
de archivo:

GET /etc/passwd /tmp;rm -rf /&echo /


Entonces, vamos a llamar la funcion system con la cadena (sin desbordamento):

   cp /etc/passwd /tmp;rm -rf /&echo / /var/spool/server/

lo que sera interpretado por el shell como tres comandos:

   cp /etc/passwd /tmp

seguido de:

   rm -rf / &

al mismo tiempo que:

   echo / /var/spool/server/


Total: no desbordamiento, pero espejo que tienes las copias de
seguridad al dia...


Eso demuestra que programar de forma segura es m�s que una question de
bufers.  Hay funciones que no se debe usar, otras que se debe usar con
sumo cuidado,  y cosas que se pueden hacer para limitar los problemas,
como poner los servidores en prision (chroot), que no se ejecuten como
root, etc.


-- 
__Pascal Bourguignon__                     http://www.informatimago.com/

"This statement is false."            In Lisp: (defun Q () (eq nil (Q)))
Technical Details
Message-ID: <87ac4n25zc.fsf@thalassa.informatimago.com>
Path: arc1-ca.pugleaf.net!g2news2.google.com!news4.google.com!news2.volia.net!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
References: <ef40ll$cp42@eui1nw.euskaltel.es> <ef74qs$52q$1@hercules.cohp1> <l10gh2lq1tgctgv37302fv6hq7qj255f23@4ax.com>

Show Full Headers
Complete Article Headers
X-Google-Thread: f86c8,17f8d70e3864bb24
X-Google-Attributes: gidf86c8,public
X-Google-Language: SPANISH,ASCII
Path: arc1-ca.pugleaf.net!g2news2.google.com!news4.google.com!news2.volia.net!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
From: Pascal Bourguignon <pjb@informatimago.com>
Newsgroups: es.comp.os.linux.programacion
Subject: Re: Hacer programas seguro
Date: Mon, 25 Sep 2006 19:47:35 +0200
Organization: Informatimago
Lines: 99
Message-ID: <87ac4n25zc.fsf@thalassa.informatimago.com>
References: <ef40ll$cp42@eui1nw.euskaltel.es> <ef74qs$52q$1@hercules.cohp1> <l10gh2lq1tgctgv37302fv6hq7qj255f23@4ax.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
X-Trace: individual.net iwickql+d0QURG4FsLQvUgFdFLT9NEla1fBcTQrtTuOQ8vINEO
Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA
      oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9
      033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac
      l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR
      mV+hO/VvFAAAAABJRU5ErkJggg==
X-Accept-Language:         fr, es, en
X-Disabled: X-No-Archive: no
User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux)
Cancel-Lock: sha1:+m2bDcTtPVPrm9Q3FC8/BVVdTZ0=