Esta sección incluye todo lo que está fuera del código fuente pero aun así es importante para la seguridad del producto que se está creando. Dado que todas las cuestiones incluidas en esta sección no están directamente relacionadas con el código fuente, las hemos separado de las demás secciones.
https_redirect
en false
.
resource "google_compute_url_map" "urlmap" {
...
default_url_redirect {
...
https_redirect = false
...
}
...
}
rsasha1
.
resource "google_dns_managed_zone" "zone-demo" {
...
dnssec_config {
default_key_specs {
algorithm = "rsasha1"
...
}
}
...
}
networking_mode
en ROUTES
.
resource "google_container_cluster" "cluster_demo" {
...
networking_mode = "ROUTES"
..
}
X-XSS-Protection
como 1; mode=block
en todas las versiones de Internet Explorer expone una vulnerabilidad de Cross-Site Scripting en versiones antiguas del explorador.X-XSS-Protection
es un encabezado HTTP que Microsoft ha incluido, y que han adoptado otros exploradores. De este modo se pretendía evitar que los ataques Cross-Site Scripting
tuvieran éxito, pero, de forma involuntaria, expuso una vulnerabilidad que hacía que sitios web seguros dejaran de serlo[1]. Por este motivo, no se debe usar en versiones anteriores de Internet Explorer y se debe deshabilitar configurando el encabezado como 0
.Helmet
de forma incorrecta en una aplicación Express
para habilitar el ajuste en todas las versiones de Internet Explorer:
var express = require('express');
var app = express();
var helmet = require('helmet');
...
app.use(helmet.xssFilter({ setOnOldIE: true}));
...
Application_BeginRequest
está vacío o no incluye una llamada a una función para establecer X-Content-Type-Options
en nosniff
o intenta quitar el encabezadoX-Content-Type-Options: nosniff
.X-Content-Type-Options
en nosniff
.X-Content-Type-Options: nosniff
en cada página que podría incluir contenido controlable por el usuario.net.http.DetectContentType()
para determinar el tipo de contenido de la respuesta:
...
resp, err := http.Get("http://example.com/")
if err != nil {
// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
content_type := DetectContentType(body)
...
X-Content-Type-Options
en nosniff
ni deshabilita explícitamente este encabezado de seguridad.X-Content-Type-Options: nosniff
.
<http auto-config="true">
...
<headers>
...
<content-type-options disabled="true"/>
</headers>
</http>
X-Content-Type-Options
como nosniff
ni deshabilita explícitamente este encabezado de seguridad.X-Content-Type-Options: nosniff
.X-Content-Type-Options
como nosniff
ni deshabilita explícitamente este encabezado de seguridad.X-Content-Type-Options: nosniff
.memset()
.
void GetData(char *MFAddr) {
char pwd[64];
if (GetPasswordFromUser(pwd, sizeof(pwd))) {
if (ConnectToMainframe(MFAddr, pwd)) {
// Interaction with mainframe
}
}
memset(pwd, 0, sizeof(pwd));
}
memset()
como almacén no alcanzado porque no se ha utilizado el búfer pwd
una vez sobrescrito su valor [2]. Como el búfer pwd
contiene un valor confidencial, es posible que la aplicación sea vulnerable a un ataque si se dejan datos en la memoria. Si los usuarios malintencionados pueden acceder a la región correcta de la memoria, es posible que usen la contraseña recuperada para obtener acceso al sistema.memset()
como código no alcanzado porque la memoria en la que se está escribiendo no se utiliza posteriormente, a pesar del hecho de que hay claramente una motivación de seguridad para que se realice la operación. El problema aquí es que muchos compiladores y, de hecho, muchos lenguajes de programación, no tienen en cuenta esta u otras inquietudes acerca de la seguridad en su esfuerzo por mejorar la eficacia.
char *buf;
int len;
...
len = 1<<30;
if (buf+len < buf) //wrap check
[handle overflow]
buf + len
es mayor que 2^32
, de modo que el valor resultante es menor que buf
. Como el desbordamiento aritmético en un puntero no es un comportamiento definido, algunos compiladores asumirán buf + len >= buf
y optimizarán la comprobación de encapsulación. El resultado de esta optimización es que el código que sigue a este bloque podría ser vulnerable al buffer overflow.serve
de la aplicación static files
que no está diseñada para implementarse en un entorno de producción. Según la documentación de Django:static files
están diseñadas en su mayoría para ayudar a obtener archivos estáticos correctamente implementados en la producción. En general, esto significa un servidor de archivo estático, dedicado e independiente que significa mucha sobrecarga al implementarlo de forma local. Por lo tanto, la aplicación de archivos estáticos se envía con una vista auxiliar rápida y modificada que puede utilizar para facilitar archivos de forma local en el desarrollo.DEBUG
está definido como True
.admin
se implementa en una dirección URL predecible:
from django.conf.urls import patterns
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
...
url(r'^admin/', include(admin.site.urls)),
...
<Realm className="org.apache.catalina.realm.JAASRealm"
appName="SRN"
userClassNames="com.srn.security.UserPrincipal"
roleClassNames="com.srn.security.RolePrincipal"/>
Realm
toma un atributo opcional que se llama debug
, el cual indica el nivel de registro. Cuanto mayor sea el número, más detallados serán los mensajes de registro. Si el nivel de depuración está configurado demasiado alto, Tomcat escribirá todos los nombres de usuario y las contraseñas en texto sin formato en el archivo de registro. El límite de depuración de mensajes relacionados con JAASRealm
de Tomcat es de 3 (3 o más está mal, 2 o menos está bien), pero este límite puede variar para el resto de dominios que proporciona Tomcat.http://host/page.jsp%00
o http://host/page.js%2570
. Peor aún, si una aplicación permite a los usuarios cargar archivos arbitrarios, los atacantes pueden usar este mecanismo para cargar código malintencionado en forma de una JSP y solicitar que la página cargada haga que este código se ejecute en el servidor.
<security-constraint>
<web-resource-collection>
<web-resource-name>JSP Access for Everyone!</web-resource-name>
<description>Allow any user/role access to JSP</description>
<url-pattern>*.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>
web.xml
define dos roles admin
.
<security-constraint>
<web-resource-collection>
<web-resource-name>AdminPage</web-resource-name>
<description>Admin only pages</description>
<url-pattern>/auth/noaccess/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description>Administrators only</description>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
...
<security-role>
<description>Administrator</description>
<role-name>admin</role-name>
</security-role>
<security-role>
<description>Non-Administrator</description>
<role-name>admin</role-name>
</security-role>
/servletA/*
se utiliza en dos asignaciones de servlets diferentes.
<servlet-mapping>
<servlet-name>ServletA</servlet-name>
<url-pattern>/servletA/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletB</servlet-name>
<url-pattern>/servletA/*</url-pattern>
</servlet-mapping>