Dicas para validar falsos positivos em SAST

Michelle Mesquita
4 min readAug 25, 2022

--

Hoje, resolvi trazer algumas dicas para quem está iniciando na área de AppSec/DevSecOps. Era um assunto que eu realmente queria muito escrever e resolvi escrever alguns trechos de códigos pro artigo👩‍💻💜

Algo muito comum da nossa rotina é analisar código de alguma ferramenta proveniente de Teste Estático de Segurança (SAST). Existem várias ferramentas de SAST como Snyk, Checkmarx, Fortify e AppScan, por exemplo. Entre todas elas, existe a fase para validação de falso positivo, justamente porque não existe ferramenta com 100% de veracidade para vulnerabilidade. No entanto, quanto mais a ferramenta tiver flexibilidade para criar suas próprias regras com o uso de regex (expressão regular), isso aumentará a veracidade de encontrar realmente uma vulnerabilidade no código

Vamos começar! ✨

# SQL Injection

## 1

Nesse primeiro código, não temos uma vulnerabilidade. Podemos perceber que estamos parametrizando as variáveis que são do tipo String, utilizando o método setParameter(). Assim, garantimos exatamente a string passada, onde não poderemos passar um payload como ' or 1=1 (onde possui caractere especial)

## 2

Nesse segundo exemplo, além de parametrizar utilizando o parâmetro "codigo", também vemos a utilização do tipo long (variável do tipo número). Dessa maneira, já vemos que nesse campo não teria mesmo como um payload ser aceito

### 3

Código vulnerável, por poder adicionar um payload nos parâmetros USER e Password

# Parameter Tempering

Aqui, podemos ver que não há vulnerabilidade, justamente por não ser do tipo String e sim, long {id}.

Caso fosse string, deveríamos utilizar algum tipo de escape, como Encode.forHtml(variavel) ou regex , como " /^[A-Za-z0–9]+(?:[ _-][A-Za-z0–9]+)*$/"

# Hardcoded Password

As vezes, as ferramentas de SAST, apenas por encontrar a palavra "password" no código, já entende que o código contém uma senha hardcoded.

Nesse exemplo acima, podemos ver que a palavra password é apenas para declarar uma variável de ambiente (env) — que é o jeito certo de não expor senha em código.

# XSS

Aqui, podemos ver que não há vulnerabilidade, justamente por não ser do tipo String e sim, long {id}.

# CSRF

Aqui nesse código, vale comentarmos duas ideias. A primeira, é verificar a sessão quando for se autenticar (fazer o login) na aplicação. Isso deve ocorrer para evitar que alguma informação do sistema não possa ser acessado sem se autenticar.

A segunda situação, utilizar alguns headers na aplicação para evitar algumas vulnerabilidades . Nesse exemplo, csrf().disable() torna a aplicação vulnerável a CSRF. Portanto, devemos remover a opção disable.

Outro ponto, sobre cabeçalhos, sempre usar para evitar algumas vulnerabilidades como XSS, forçar uso de HSTS e ClickJacking:

http.headers().xssProtection().and().contentSecurityPolicy(“script-src ‘self’”).contentTypeOptions().httpStrictTransportSecurity().frameOptions()

e adicionar no arquivo pom.xml (caso seja uma aplicação Java e que utilize SpringBoot)

<dependency>

<groupId>org.springframework.security</groupId>

<artifactId>spring-security-core</artifactId> <version>5.3.3.RELEASE</version>

</dependency>

# File Transversal

Aqui, podemos ver a forma de evitar a vulnerabilidade de file transversal. Devemos sempre criar uma white list (permitindo apenas o que esperamos de diretório) para não deixar que o usuário possa encontrar a vulnerabilidade e acessar arquivos do servidor

Espero que gostem 💜

--

--

Michelle Mesquita
Michelle Mesquita

Written by Michelle Mesquita

DevSecOps & AppSec Engineer & Developer girl 👩‍💻

Responses (1)