Dorking - O que podemos aprender sobre vazamento de dados por indexação involuntária em ferramentas de busca
Tags: security, devops, webdev
Published: 2020-07-09 19:52:08

Esta semana o mercado da tecnologia aqui no Brasil foi ligeiramente movimentado pelo vazamento de alguns dados de correntistas de uma grande _fintech_, que estavam disponíveis nos resultados de busca do Google.

A empresa em questão (a qual sou um cliente bem satisfeito) já resolveu a situação e emitiu notas oficiais para esclarecimento, mas de qualquer forma acho que esta é uma boa oportunidade, diante de situações adversas, para evoluirmos e nos aperfeiçoarmos, por isso precisamos falar sobre o assunto.

#### Disclaimer

Gostaria de deixar bem explícito que **esta postagem não é uma crítica à empresa**, mas sim uma discussão técnica para evitar que futuramente isso venha a acontecer com outras equipes, produtos ou serviços.

#### Dito isso, vamos ao ocorrido.

Para facilitar a transferência de valores entre correntistas, o serviço disponibiliza um link (público e sem autenticação) que pode ser compartilhado entre diferentes pessoas para, a partir da leitura de um QR code, realizar uma transferência no aplicativo autorizado. Cada link listava algumas informações pessoais, como Nome, CPF, Agência, Conta, entre outros.

Estes links, que não são expirados e são públicos, acabaram sendo listados no índice de páginas do Google (de outros buscadores também), e com um pouco de "Google Hacking", uma pessoa desenvolvedora conseguiu encontrar vários destes links (contendo diferentes transferências entre contas), e escrever um script que "puxasse" estas informações de dentro do HTML dos documentos listados nos buscadores, podendo criar uma base com os dados extraídos. Estas informações podem ser usadas em tentativas de força-bruta ou até mesmo vendidas para terceiros, mas no caso citado a pessoa foi bem intencionada e reportou o problema para a empresa.

#### Tudo começa com uma busca no Google

Digamos que queiramos listar todas as páginas da _Wikipédia_ que possuem `/computação/` no endereço. Basta usar as diretivas `site:` e `inurl:`

![Listar todas páginas da Wikipédia com computação na URL](https://user-images.githubusercontent.com/526075/87069641-ef095e80-c1ed-11ea-9c0a-50be019e20fd.png)

Esse tipo de técnica é conhecido como _Google Hacking_ ou _Google Dorking_, e é muito utilizada por hackers ou profissionais de PenTesting. É importante dizer que existem [bancos de dados com estas brechas disponíveis](https://www.exploit-db.com/google-hacking-database) para que outras pessoas consultem. Faça uma busca nas ferramentas e veja se alguma parte dos seus serviços estão listados. Existem várias diretivas que podem ser usadas, não somente `site:` e `inurl:`, no futuro compartilharei mais materiais sobre isso.

Mas, voltando ao contexto do ocorrido desta semana, a parte da URL `/computação/` pode ser substituída por algo específico como `/transferir/`, que nos faria chegar na página de transferência de valores.

Exemplo de link: `https://minhaempresa.com.br/transferir/sf9y8JV7b0Z`

Pesquisa no Google:
`site:minhaempresa.com.br inurl:/transferir/`

A partir daí, basta escrever um script que acesse os links, interprete o conteúdo do documento HTML e extraia dele as informações desejadas (processo conhecido como [_web scraping_](https://pt.wikipedia.org/wiki/Coleta_de_dados_web)). O Google aplica alguns bloqueios como reCAPTCHA em muitas tentativas de busca com estas diretivas, mas é possível automatizar todo o processo com quebradores de captcha ou requisições intervaladas.

#### Solução

Caso você se depare com esse tipo de exposição, você tem algumas opções:

1. [Solicitar remoção das informações para o Google](https://support.google.com/webmasters/answer/6332384), bem recomendado como medida emergencial;
2. Alterar seu sistema para marcar os documentos como "não listáveis" em mecanismos de buscas;
3. Avaliar colocar mecanismos de autenticação (ou até mesmo reCAPTCHA) antes de exibir as informações (essa opção afeta experiência de uso)

Por ser tratar de uma abordagem preventiva, vou focar no item 2. Podemos escolher quais páginas/documentos desejamos **não ter indexados** nos buscadores e, mais ainda, instruir o mecanismo de busca para **não seguir os links destes documentos**. O primeiro nós resolvemos com a instrução `noindex`, e o segundo com a instrução `nofollow`. Podemos configurar isso de duas maneiras (bem simples):

1. Adicionando a metatag `robots` no HTML; ou
2. Alterando o cabeçalho HTTP `X-Robots-Tag`

#### Metatag robots

Você pode instruir os mecanismos de busca a não indexarem seus documentos colocando a seguinte metatag no `head` do HTML:

```html
<head>
  <meta name="robots" content="noindex,nofollow" />
</head>
```

Todo documento que você deseja não indexar deverá incluir esta metatag. Para evitar a replicação, você pode procurar utilizar hierarquia de layouts ([como este exemplo em pug](https://pugjs.org/language/inheritance.html)), que é uma técnica comum em várias ferramentas e frameworks de desenvolvimento frontend.

Você pode alterar a metatag para buscadores específicos, bastando alterar o valor de _name_. Exemplo: para bloquear somente indexação no Bing, altere de `robots` para `bingbot`.

#### Cabeçalho X-Robots-Tag

Alternativamente, você pode preencher o cabeçalho HTTP `X-Robots-Tag` na resposta do documento HTML. Isto pode ser feito na configuração do servidor (ex: Apache, nginx, IIS, etc) ou no próprio código da aplicação. Vejamos alguns exemplos:

nginx (_httpd.conf_)

```nginx
# avoid crawling of all html files
location ~* \.html$ {
  add_header X-Robots-Tag "noindex, nofollow";
}
```

Apache (_.htaccess_)

```apache
# avoid crawling of all html files
<Files ~ "\.html$">
  Header set X-Robots-Tag "noindex, nofollow"
</Files>
```

Flask (nível de código)

```python
from flask import make_response

@app.route('/')
def home():
   res = make_response(render_template('index.html'))
   res.headers.set('X-Robots-Tag', 'noindex,nofollow')
   return res
```

Express

```javascript
const express = require('express')
const app = express()

app.get('/', (req, res) => {
  res.set('X-Robots-Tag', 'noindex,nofollow')
  res.render('index.html')
})
```

#### Conclusão

Os danos da extração de dados por esse tipo de _dorking_ podem ser muito altos, e como vimos, a solução preventiva é bem simples. Muitas vezes, falando de segurança da informação, as soluções são simples, mas infelizmente acabam não sendo priorizadas (não estou dizendo que foi o caso citado). Temos que manter o pilar da segurança aliado com os demais atributos que compõe a qualidade de um software e, ainda assim, correremos o risco constante de ciberataques.

* Avalie seu portfólio de produtos e serviços e questione quais deles realmente precisam ser bem indexados em ferramentas de busca (como um dos maiores exemplos, geralmente sistemas administrativos internos não precisam ser indexados e ainda assim é fácil encontrá-los no Google).
* Sempre que possível, implemente a expiração dos links públicos.
* Utilizar autenticação sempre é uma ideia segura, mas por vezes ela interfere bastante na experiência de uso. Discuta com especialistas de produto e equilibre os pratos da balança, tente encontrar a solução com maior valor entregue ao seu cliente **de uma forma segura**.