;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Falha no Bradesco permitia que hacker 'sequestrasse' conta online

Falha de segurança em site do Bradesco foi identificada por técnico de redes - Getty Images/iStockphoto
Falha de segurança em site do Bradesco foi identificada por técnico de redes Imagem: Getty Images/iStockphoto

Helton Simões Gomes

De Tilt, em São Paulo

09/11/2019 04h00

Sem tempo, irmão

  • Técnico em redes encontrou falha no site do Bradesco, um dos maiores bancos do Brasil
  • Erro foi classificado como 'grave' pela PSafe, especializada em segurança cibernética
  • Hackers poderiam explorar o problema inserindo páginas falsas sob o domínio do banco
  • Também poderiam roubar credenciais de o de vítimas e 'clonar' sessões de Internet Banking

Uma falha em uma das páginas de internet do banco Bradesco permitia que hackers criassem sites falsos usando o domínio oficial da internet da instituição, o "bradesco.com.br". Além disso, dava a eles o poder de enviar avisos falsos que induziam ao de vírus, ou consultar dados bancários da vítima sem usar qualquer credenciais de o, como agência, conta ou senha.

O problema foi comunicado a Tilt pelo técnico de redes Mateus Gomes, que identificou a falha. A reportagem consultou a empresa especializada em segurança cibernética PSafe, que constatou se tratar de algo grave.

Avisado pela reportagem nesta sexta-feira (8), o Bradesco rapidamente desativou a página defeituosa. Ainda que testes de Gomes não mostrem isso, informou que "a página não tem nenhuma associação com o Internet Banking ou outros canais transacionais".

Entenda a falha

Gomes já havia identificado uma falha semelhante em um site da Caixa Econômica Federal destinado ao Fundo de Financiamento Estudantil (Fies), quando tentava cancelar seu próprio financiamento. Ele avisara a plataforma Open Bug Bounty, site de pesquisadores independentes de vulnerabilidades na internet, que confirmou o problema e emitiu um relatório. Mateus Gomes disse que tentou, em vão, contato com a Caixa para avisar sobre o problema.

A partir daí, ele ou a procurar se o mesmo problema se repetia nos serviços online de outras instituições financeiras. Encontrou em uma das páginas do Bradesco, ou seja, em um subdomínio de "bradesco.com.br".

Essas páginas recebem informações do domínio original, como cookies de arquivos salvos como credenciais de o. Tecnicamente, isso é normal. Diversas aplicações na internet a utilizam para trazer comodidade aos usuários. É ela que permite que um usuário, após fazer o primeiro , não tenha que se logar novamente ao ar uma nova página do mesmo serviço.

Do ponto de vista do conteúdo, esses subdomínios são geralmente destinados a abrigar subáreas ou serviços específicos dentro do site principal. A página que continha o erro era o subdomínio "www.edi7.bradesco.com.br", destinada a funcionários do Bradesco.

A brecha de segurança identificada por Gomes é chamada de cross-site scripting, ou XSS.

O que acontece no Bradesco é que ele possui um sistema de autenticação compartilhada, ou seja, todas as sessões geradas em qualquer lugar seja de 'x.bradesco.com.br' ou 'y.bradesco.com.br' são compartilhadas. Isso acontece porque o servidor web confia em qualquer coisa que vai estar antes de 'bradesco.com.br'. Mas, se um subdomínio é afetado, a segurança dos dados estará comprometida
Mateus Gomes, técnico em redes

Emilio Simoni, diretor da Dfndr Lab, da PSafe, classificou como "grave" o problema descoberto por Gomes. "É uma falha que acontece em páginas que recebem alguma entrada do usuário e essa entrada não é corretamente validada", diz. "Quem desenvolveu essa parte [do site], deu esse mole."

Ao explorá-la, cibercriminosos poderiam fazer modificações na página em que o usuário do banco estivesse sem que ele notasse. Essas alterações poderiam ser coisas simples, como incluir mensagens falsas, ou mais complexas e perigosas, como:

  • inserir uma página inteiramente falsa sob o domínio "bradesco.com.br", destinada a roubar os cookies salvos com as credenciais de o da vítima (agência, conta bancária e senha);
  • indicar o de um arquivo malicioso disfarçado de um programa verídico;
  • "clonar" em outra aba uma sessão iniciada legitimamente pelo cliente do banco no Internet Banking.

A imagem abaixo é um exemplo de como uma página falsa poderia ser inserida abaixo do domínio do Bradesco.

bradesco_falha - Arquivo Pessoal/Mateus Gomes - Arquivo Pessoal/Mateus Gomes
Falha permitia que hackers remodelassem site do Bradesco para aplicar golpes
Imagem: Arquivo Pessoal/Mateus Gomes

Como hackers poderiam explorar a falha?

Segundo Simoni, pelo menos dois ciberataques poderiam ser executados por meio da brecha no site do Bradesco. O primeiro caso seria o de phishing, em que um golpista dispara uma comunicação falsa à vítima par imitar um serviço real, e enganar a vítima para que ela colabore com o ataque.

Nesse caso, ele mandaria para a vítima um SMS do tipo: 'e o site do Bradesco neste link para cancelar um pagamento não autorizado'. E, como o link é de um próprio site do Bradesco mas modificado por comandos [maliciosos], a vítima enviaria informações ao atacante ao colocar agência, conta e senha

O segundo caso seria o de clonagem de sessões no Internet Banking. "Um cenário mais grave — mas mais difícil de acontecer— seria ele aproveitar uma vítima que já está logada no banco ou induzir uma vítima a se logar no banco primeiro e depois abrir o link dele. Nesse caso, ele poderia clonar a sessão", diz o diretor do Dfndr.

Gomes completa: "Se o atacante consegue o aporte da vítima, não precisa necessariamente saber as credenciais dela para se autenticar. Ou seja: se consegue capturar uma sessão que está ativa, o invasor pode entrar em determinada conta bancária sem saber nenhum tipo de credencial, como agência, conta ou senha."

Mas essa segunda modalidade de golpe só seria possível se o banco não usasse um sistema que validasse o número do IP do o. Ainda que o banco não fizesse isso, o cibercriminoso não conseguiria realizar transações: apenas fazer checagens, como conferir extrato bancário e outras movimentações.

SIGA TILT NAS REDES SOCIAIS