13.07.2015 Views

SEGURIDAD EN UNIX Y REDES

SEGURIDAD EN UNIX Y REDES

SEGURIDAD EN UNIX Y REDES

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

5.5.PROGRAMACIÓN SEGURA 89struct stat lstatInfo;char *mode="rb+";int fd;if(lstat(fileName,&lstatInfo)==-1){if(errno!=<strong>EN</strong>O<strong>EN</strong>T) return( -1 );if((fd=open(fileName,O_CREAT|O_EXCL|O_RDWR,0600))==-1) return(-1);mode="wb";}else{struct stat fstatInfo;if((fd=open(fileName,O_RDWR))==-1) return(-1);if(fstat(fd,&fstatInfo)==-1 || \lstatInfo.st_mode!=fstatInfo.st_mode || \lstatInfo.st_ino!=fstatInfo.st_ino || \lstatInfo.st_dev!=fstatInfo.st_dev){close(fd);return(-1);}if(fstatInfo.st_nlink>1||!S_ISREG(lstatInfo.st_mode)){close(fd);return(-1);}#ifdef NO_FTRUNCATEclose(fd);if((fd=open(fileName,O_CREAT|O_TRUNC|O_RDWR))==-1) return( -1 );mode="wb";#elseftruncate(fd,0);#endif /* NO_FTRUNCATE */}stream->filePtr=fdopen(fd,mode);if(stream->filePtr==NULL){close(fd);unlink(fileName);return(-1); /* Internal error, should never happen */}}Como podemos ver, algo tan elemental como una llamada a open() se ha convertido en todoel código anterior si queremos garantizar unas mínimas medidas de seguridad; esto nos puededar una idea de hasta que punto la programación ‘segura’ puede complicarse. No obstante,en muchas ocasiones es preferible toda la complicación y parafernalia anteriores para realizarun simple open() a que esa llamada se convierta en un fallo de seguridad en nuestro sistema.No hay ningún programa que se pueda considerar perfecto o libre de errores (como se cita enel capítulo 23 de [GS96], una rutina de una librería puede tener un fallo. . . o un rayo gammapuede alterar un bit de memoria para hacer que nuestro programa se comporte de formainesperada), pero cualquier medida que nos ayude a minimizar las posibilidades de problemases siempre positiva.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!