Conference on Systems and Software, pages 275-284, Kona, HI, January '89
3)  Extending Mutation Testing to Find Environmental Bugs, by Eugene H.Spafford,
Software Practice and Experience, 20(2):181-189, Feb '90
4)  A paper by IBM was mentioned that was submitted to USENIX a few years ago.
(Anyone have a citation?).

Defectos especificos que chequear
===================================
1) Buscar rutinas que no hagan chequeos al limite, o verifiquen entradas.
Ej:la familia de rutinas gets(), donde es posible sobreescribir el limite del buffer
(sprintf()?, gets(), etc.)tambien: strcpy()

2) Las rutinas SUID/SGID escritas en uno de los shells, en vez de C o PERL

3) Las rutinas SUID/SGID escritas en PERL que no usan el programa "taintperl"

4) Las rutinas SUID/SGID que usan las llamadas system(),popen(), execlp(), o execvp()
para ejecutar otra cosa.

5) Cualquier programa que use nombres relativos de ruta (path) dentro del programa

6) El uso de nombres relativos de ruta para especificar librerias vinculadas dinamicamente.

7) Rutinas que no chequean codigos de error devueltos por llamadas del sistema
(Ej: fork(2), suid(2),setuid(), como en el famoso bug rcp)

8) Los agujeros se pueden encontrar a menudo en codigo que:
A)  es portado a un nuevo entorno
B)  recibe entradas inesperadas
C)  interactua con otro software local
D)  accede a archivos de sistema como passwd, L.sys, etc
E)  lee entradas de directorios o archivos publicos escribibles
F)  programas de diagnostico que tipicamente no estan a prueba de usuarios

9) Testear codigo para entradas inesperadas. Hay disponibles herramientas de testeo de
proteccion, flujo de datos, y muacion.

10) Buscar en los textos man, y guias de usuario las advertencias en contra de las
X, y tratar variaciones de X. Hacer lo mismo con la seccion de bugs.

11) Buscar comandos o funciones raramente usados o inusuales. En particular seria util
buscar argumentos indocumentados. Buscar flags de distribuciones anteriores, o en
versiones de otros sistemas operativos. Chequear las opciones que otros programas
podrian usar. Por ejemplo, Telnet usa la opcion -h para conectarse...

12) Buscar condiciones raciales.

13) Fallos del software para verificar que realmente esta comunicandose con el software
o modulo de hardware al que quiere acceder.

14)  Falta de deteccion de errores para resetear los mecanismos de proteccion
siguientes al error.

15)  Implementacion pobre que da como resultado, por ejemplo, codigos de condicion
testeados inapropiadamente

16)  Confianza inplicita: La rutina B asume que los parametros de la rutina A son
correctos por que la rutina A es un proceso de sistema

17)  El sistema almacena sus datos o referencia parametros de usuario en el espacio
disponible de las direcciones de usuarios

18)  Enterrar procesos de comunicación: condiciones de retorno  (passwd OK, illegal
parameter, segment error, etc) pueden proporcionar una brecha significativa cuando
son combiandos con el paso 17

19)  Los parametros de usuario pueden no estar adecuadamente chequeados.

20)  Direcciones que sobrepasan o se refieren a areas del sistema

21)  Las comprobaciones de condicion de codigo pueden omitirse

22)  Fallo al anticiparse a parametros inusuales o extraordinarios

23)  Buscar niveles del sistema donde los modulos alli involucrados fueron escritos
por programadores diferentes, o grupo de programadores - se suelen encontrar agujeros.

24)  Registros que apuntan a la localizacion de valores de parametros en vez de pasar
el parametro el mismo.

25)  Cualquier programa ejecutandose con privilegios de sistema (a muchos programas se
les da UID 0, para facilitar el acceso a ciertas tablas, etc)

26)  Archivos temporales, buffers leibles por grupos o por todo el mundo

27)  Carencia de valores de "umbral", y carencia de notificacion una vez se han
accionado estos.