Auditor A de C Digo de Una Aplicaci N Con La Herramienta de HP Fortify
Auditor A de C Digo de Una Aplicaci N Con La Herramienta de HP Fortify
Auditor A de C Digo de Una Aplicaci N Con La Herramienta de HP Fortify
herramienta de HP Fortify
UNIR México
Fecha: 26 de agosto de
2019
Contenido
Vulnerabilidades......................................................................................................................3
1. Contraseña codificada...............................................................................................4
= Explicación del código =.........................................................................................4
= Grafica =..........................................................................................................................5
= Posible solución =......................................................................................................5
2. Configuración incorrecta de Spring Boot: Actuator Endpoint
Security Disabled................................................................................................................6
= Explicación del código =.........................................................................................6
= Grafica =..........................................................................................................................7
= Posible solución =......................................................................................................7
3. Manipulación de encabezado: SMTP................................................................7
= Explicación del código =.........................................................................................7
= Grafica =..........................................................................................................................8
= Posible solución =......................................................................................................9
4. Evaluación dinámica de código: deserialización insegura..................9
= Explicación del código =.........................................................................................9
= Grafica =........................................................................................................................10
= Posible solución =....................................................................................................10
5. Gestión de claves: clave de cifrado codificada..........................................11
= Explicación del código =.......................................................................................11
= Grafica =........................................................................................................................12
= Posible solución =....................................................................................................12
6. Gestión de contraseñas: contraseña vacía..................................................12
= Explicación del código =.......................................................................................12
= Grafica =........................................................................................................................13
= Posible solución =....................................................................................................14
7. Credenciales de una tienda Android WebView.........................................14
= Explicación del código =.......................................................................................14
= Grafica =........................................................................................................................15
= Posible solución =....................................................................................................15
8. Conectarse a una base de datos con una contraseña vacía..........15
= Explicación del código =.......................................................................................15
= Grafica =........................................................................................................................16
= Posible solución =....................................................................................................16
9. Usuario y contraseña codificados para configurar la autenticación
16
= Explicación del código =.......................................................................................17
= Grafica =........................................................................................................................17
= Posible solución =....................................................................................................17
10. Almacenamiento de cache................................................................................18
= Explicación del código =.......................................................................................18
= Grafica =........................................................................................................................18
= Posible solución =....................................................................................................18
Vulnerabilidades
1. Contraseña codificada
Las contraseñas codificadas pueden comprometer la seguridad del
sistema de una manera que no se puede remediar fácilmente.
Este código se ejecutará con éxito, pero cualquiera que tenga acceso a
él tendrá acceso a la contraseña. Después de que el programa se haya
enviado, es probable que no haya forma de cambiar el usuario de la
base de datos "scott" con una contraseña de "tigre" a menos que el
programa esté parcheado. Un empleado con acceso a esta información
puede usarla para ingresar al sistema. Peor aún, si los atacantes tienen
acceso al código de bytes de la aplicación, pueden usar el comando
javap -c para acceder al código desensamblado, que contendrá los
valores de las contraseñas utilizadas. El resultado de esta operación
podría ser similar al siguiente para el ejemplo anterior:
javap -c ConnMngr.class
22: ldc #36; //String jdbc:mysql://ixne.com/rxsql
24: ldc #38; //String scott
26: ldc #17; //String tiger
= Grafica =
= Posible solución =
Para Android, así como cualquier otra plataforma que use la base de
datos SQLite, SQLCipher es una buena alternativa. SQLCipher es una
extensión de la base de datos SQLite que proporciona un cifrado AES
transparente de 256 bits de los archivos de la base de datos. Por lo
tanto, las credenciales se pueden almacenar en una base de datos
cifrada.
Las aplicaciones Spring Boot se pueden configurar para implementar Actuadores, que son
puntos finales REST que permiten a los usuarios monitorear diferentes aspectos de la
aplicación. Hay diferentes actuadores integrados que pueden exponer datos confidenciales
y están etiquetados como "confidenciales". De manera predeterminada, todos los puntos
finales HTTP confidenciales están protegidos de modo que solo los usuarios que tengan un
rol ACTUADOR puedan acceder a ellos.
endpoints.health.sensitive=false
@Component
public class CustomEndpoint implements Endpoint> {
public String getId() {
return "customEndpoint";
}
public boolean isEnabled() {
return true;
}
public boolean isSensitive() {
return false;
}
public List%lt;String> invoke() {
// Custom logic to build the output
...
}
}
= Grafica =
= Posible solución =
$subject = $_GET['subject'];
$body = $_GET['body'];
mail("support@acme.com", "[Contact us query] " . $subject,
$body);
...
subject: [Contact us query] Page not working
...
Sin embargo, debido a que el valor del encabezado se construye a partir
de la entrada no validada del usuario, la respuesta solo mantendrá este
formulario si el valor enviado para el asunto no contiene ningún carácter
CR y LF. Si un atacante envía una cadena maliciosa, como "¡Felicidades!
¡Ganaste la lotería! \ R \ ncc: victim1 @ mail.com, victim2 @ mail.com ...",
entonces los encabezados SMTP serían siguiente forma:
...
subject: [Contact us query] Congratulations!! You won the
lottery cc: victim1@mail.com,victim2@mail.com
...
= Grafica =
= Posible solución =
Ejemplos
= Grafica =
= Posible solución =
- Usar autenticación.
- Utiliza encriptación.
...
private static final String encryptionKey =
"lakdsljkalkjlksdfkl";
byte[] keyBytes = encryptionKey.getBytes();
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher encryptCipher = Cipher.getInstance("AES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
...
= Posible solución =
...
String storedPassword = "";
String temp;
if ((temp = readPassword()) != null) {
storedPassword = temp;
}
if(storedPassword.equals(userPassword))
// Access protected resources
...
}
...
= Grafica =
= Posible solución =
webview.setWebViewClient(new WebViewClient() {
public void onReceivedHttpAuthRequest(WebView view,
HttpAuthHandler handler, String host, String realm) {
String username = "";
String password = "";
if (handler.useHttpAuthUsernamePassword()) {
String[] credentials = view.getHttpAuthUsernamePassword(host,
realm);
username = credentials[0];
password = credentials[1];
}
handler.proceed(username, password);
}
});
...
= Grafica =
= Posible solución =
Para Android, así como cualquier otra plataforma que use la base de datos
SQLite, SQLCipher es una buena alternativa. SQLCipher es una extensión
de la base de datos SQLite que proporciona un cifrado AES transparente de
256 bits de los archivos de la base de datos. Por lo tanto, las credenciales se
pueden almacenar en una base de datos cifrada.
8. Conectarse a una base de datos con una contraseña vacía.
Las claves de cifrado codificadas pueden comprometer la seguridad de una
manera que no se puede remediar fácilmente.
Nunca es una buena idea asignar una cadena vacía a una variable de
contraseña. Si la contraseña vacía se usa para autenticarse con éxito en
otro sistema, entonces la seguridad de la cuenta correspondiente se ve
comprometida porque acepta una contraseña vacía. Si la contraseña vacía
es simplemente un marcador de posición hasta que se pueda asignar un
valor legítimo a la variable, puede confundir a cualquier persona que no
esté familiarizada con el código y potencialmente causar problemas en
rutas de flujo de control inesperadas....
El siguiente código intenta conectarse a una base de datos con una
contraseña vacía.
= Grafica =
= Posible solución =
Lea siempre los valores de contraseña almacenados de recursos externos
encriptados y asigne valores significativos a las variables de contraseña.
Asegúrese de que los recursos confidenciales nunca estén protegidos con
contraseñas vacías o nulas.
...
webview.setWebViewClient(new WebViewClient() {
public void onReceivedHttpAuthRequest(WebView view,
HttpAuthHandler handler, String host, String realm) {
handler.proceed("guest", "allow");
}
});
...
= Grafica =
= Posible solución =
type: 'POST',
8 url: 'JWT/refresh/login',
9 contentType: "application/json",
10 data: JSON.stringify({user: user, password: "bm5nhSkxCXZkKRy4"})
11 }).success(
12 function (response) {
13 localStorage.setItem('access_token', response['access_token']);
= Grafica =
= Posible solución =