Una mala calidad del código lleva a un comportamiento no predecible. Desde la perspectiva de un usuario, muchas veces también supone una usabilidad limitada. Pero para un atacante es una oportunidad para atacar al sistema de formas insospechadas.
SqlClientPermission
, que controla el modo en el que los usuarios pueden conectarse a una base de datos. En este ejemplo, el programa transfiere false
como segundo parámetro al constructor, que controla si los usuarios tienen permiso para establecer conexión con contraseñas en blanco. Al transferir el valor false a este parámetro, se indica que no deben permitirse contraseñas en blanco.
...
SCP = new SqlClientPermission(pstate, false);
...
PermissionState
transferido como primer parámetro reemplaza cualquier valor transferido al segundo parámetro, el constructor permite el uso de contraseñas en blanco para las conexiones de base de datos, lo que contradice el segundo argumento. Para rechazar las contraseñas en blanco, el programa debe transferir PermissionState.None
al primer parámetro del constructor. Debido a la ambigüedad en su funcionalidad, la versión de dos parámetros del constructor SqlClientPermission
se ha dejado de utilizar en favor de la versión de un único parámetro, que transmite el mismo grado de información sin el riesgo de interpretaciones erróneas.getpw()
para comprobar que una contraseña de texto sin formato coincide con una contraseña cifrada del usuario. Si la contraseña es válida, la función establece result
en 1; de lo contrario, se establece en 0.
...
getpw(uid, pwdline);
for (i=0; i<3; i++){
cryptpw=strtok(pwdline, ":");
pwdline=0;
}
result = strcmp(crypt(plainpw,cryptpw), cryptpw) == 0;
...
getpw(
) puede provocar problemas desde el punto de vista de la seguridad, ya que puede desbordar el búfer que pasa a su segundo parámetro. Debido a esta vulnerabilidad, getpw()
se ha sustituido por getpwuid()
, que realiza la misma búsqueda que getpw()
, pero que devuelve un puntero a una estructura asignada estadísticamente para mitigar el riesgo.
...
String name = new String(nameBytes, highByte);
...
nameBytes
. Debido a la evolución de los juegos de caracteres utilizados para codificar cadenas, este constructor quedó obsoleto y reemplazado por un constructor que acepta como uno de sus parámetros el nombre del charset
que se utiliza para codificar los bytes para la conversión.Digest::HMAC
, cuyo uso está explícitamente contraindicado en la documentación debido a su implicación accidental dentro de una versión.
require 'digest/hmac'
hmac = Digest::HMAC.new("foo", Digest::RMD160)
...
hmac.update(buf)
...
Digest::HMAC
dejó de utilizarse de forma inmediata al estar implicada en una inclusión accidental dentro de una versión. Debido a la posibilidad de que no funcione según lo previsto a causa del código experimental o no probado adecuadamente, su uso está fuertemente contraindicado, especialmente si consideramos la relación que tienen los códigos HMAC con la funcionalidad criptográfica.IsBadXXXPtr()
. Estas funciones:IsBadWritePtr()
en un intento de impedir malas escrituras de memoria.
if (IsBadWritePtr(ptr, length))
{
[handle error]
}