Article View: es.comp.os.linux.programacion
Article #745Re: Hacer programas seguro
From: Pascal Bourguignon
Date: Mon, 25 Sep 2006 17:47
Date: Mon, 25 Sep 2006 17:47
99 lines
4647 bytes
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-mailReferences:
<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=