Esta seção contém tudo o que fica fora do código-fonte, porém que é essencial para a segurança do produto que está sendo criado. Como os problemas tratados neste domínio não são diretamente relacionados com o código-fonte, nós o separamos dos demais domínios.
https_redirect
como 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
como ROUTES
.
resource "google_container_cluster" "cluster_demo" {
...
networking_mode = "ROUTES"
..
}
X-XSS-Protection
como 1; mode=block
para todas as versões do Internet Explorer provoca uma possível vulnerabilidade de cross-site scripting nas versões mais antigas do navegador.X-XSS-Protection
é um cabeçalho HTTP introduzido pela Microsoft e, desde então, adotado por outros navegadores. Ele se destinava a ajudar a impedir que ataques de Cross-Site Scripting
sejam bem sucedidos, mas, inadvertidamente, levou a uma vulnerabilidade que tornava vulneráveis sites seguros[1]. Por isso, isso não deve ser utilizado em versões mais antigas do Internet Explorer e deve ser desabilitado mediante a definição do cabeçalho como 0
.Helmet
em um aplicativo Express
para ativar isso em todas as versões do Internet Explorer:
var express = require('express');
var app = express();
var helmet = require('helmet');
...
app.use(helmet.xssFilter({ setOnOldIE: true}));
...
Application_BeginRequest
está vazio ou não inclui uma chamada de função para definir X-Content-Type-Options
como nosniff
, ou tenta remover esse cabeçalho.X-Content-Type-Options: nosniff
.X-Content-Type-Options
como nosniff
..X-Content-Type-Options: nosniff
para cada página que possa ter conteúdo controlável pelo usuário.net.http.DetectContentType()
para determinar a resposta Content-Type:
...
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
como nosniff
ou desabilita esse cabeçalho de segurança explicitamente.X-Content-Type-Options: nosniff
.
<http auto-config="true">
...
<headers>
...
<content-type-options disabled="true"/>
</headers>
</http>
X-Content-Type-Options
como nosniff
ou desabilita esse cabeçalho de segurança explicitamente.X-Content-Type-Options: nosniff
em cada página que poderia conter conteúdo controlado pelo usuário.X-Content-Type-Options
como nosniff
ou desabilita esse cabeçalho de segurança explicitamente.X-Content-Type-Options: nosniff
em cada página que poderia conter conteúdo controlado pelo usuário.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()
será removida como um repositório morto porque o buffer pwd
não é usado após a substituição de seu valor [2]. Como o buffer pwd
contém um valor sensível, o aplicativo poderá ficar vulnerável a ataques se os dados permanecerem residentes na memória. Se os invasores puderem acessar a região correta da memória, eles poderão usar a senha recuperada para ganhar o controle do sistema.memset()
como um código morto, pois a memória que está sendo gravada não é utilizada depois, apesar do fato de existir claramente uma motivação de segurança para que essa operação ocorra. O problema aqui é que muitos compiladores e, na verdade, muitas linguagens de programação, não consideram esta e outras preocupações de segurança em seus esforços para melhorar a eficiência.
char *buf;
int len;
...
len = 1<<30;
if (buf+len < buf) //wrap check
[handle overflow]
buf + len
é maior que 2^32
e, portanto, o valor resultante é menor que buf
. Porém, como um estouro aritmético em um ponteiro é um comportamento indefinido, alguns compiladores assumirão buf + len >= buf
e otimizarão a verificação de quebra de linha. Como resultado dessa otimização, o código após esse bloco pode ser vulnerável a um buffer overflow.serve
do aplicativo static files
, o qual não foi projetado para ser implantado em um ambiente de produção. De acordo com a documentação do Django:static files
, em sua maioria, são projetadas para ajudar a fazer com que arquivos estáticos sejam implantados com êxito na produção. Isso geralmente significa um servidor de arquivos estáticos separado e dedicado, o que é bastante sobrecarga quando se refere ao desenvolvimento local. Portanto, o aplicativo staticfiles entrega com uma visualização de auxílio rápida e suja que você pode utilizar para servir arquivos localmente durante o desenvolvimento.DEBUG
for True
.admin
é implantado em uma URL previsível:
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
usa um atributo opcional denominado debug
, que indica o nível de log. Quanto maior o número, mais detalhadas serão as mensagens de log. Se o nível de depuração estiver definido como muito alto, o Tomcat gravará todos os nomes de usuário e senhas em texto sem formatação no arquivo de log. O ponto limite para a depuração de mensagens relacionadas ao JAASRealm
do Tomcat é 3 (3 ou acima é ruim, 2 ou abaixo é OK), mas esse limite pode variar para outros tipos de realms fornecidos pelo Tomcat.http://host/page.jsp%00
ou http://host/page.js%2570
. Pior ainda, se um aplicativo permitir que os usuários carreguem arquivos arbitrários, os invasores podem usar esse mecanismo para fazer upload de código mal-intencionado na forma de um JSP e solicitar que a página carregada faça com que o código mal-intencionado seja executado no 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 duas funções 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/*
é usado em dois mapeamentos de servlet 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>