;(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

Brecha em site da Claro deixou expostos os dados de 8 milhões de pessoas

Falha no site da Claro deixava caminho aberto para ar dados de milhões de pessoas - Estúdio Rebimboca/UOL
Falha no site da Claro deixava caminho aberto para ar dados de milhões de pessoas Imagem: Estúdio Rebimboca/UOL

Helton Simões Gomes

De Tilt, em São Paulo

18/11/2019 16h48Atualizada em 19/11/2019 15h38

Sem tempo, irmão

  • Pesquisadores acharam falha no site da Claro que expôs 8 milhões de pessoas
  • Já fora do ar, ela permitia ver dados tanto de clientes quanto de ex-clientes
  • Bastava mudar os últimos números da URL mostrada pela operadora
  • Falha dava o a dados pessoais e até endereço residencial de vítimas

Uma falha no site da empresa de telecomunicação Claro expôs as informações pessoais de pelo menos 8 milhões de pessoas, entre clientes e ex-clientes. O problema foi descoberto pelo grupo de pesquisadores de segurança Whitehat Brasil, que busca identificar brechas em plataformas que dispõem de grandes bases de dados e já havia identificado uma falha similar em uma página da Vivo.

A brecha de segurança que expunha milhões de brasileiros estava presente na página "Minha Claro Residencial". É por meio dela que clientes am sua conta e podem ver detalhes dos serviços prestados pela empresa —internet, telefonia fixa, celular ou TV paga.

Até então, era possível consultar todo o perfil de clientes e ex-clientes da Claro apenas mudando alguns caracteres na URL de o. Assim, era possível obter as seguintes informações de clientes da Claro:

  • Endereço
  • Telefone e celular
  • Data de nascimento
  • F
  • Nome da mãe
  • Número de dependentes

A falha esteve ativa até quinta-feira (14). Tilt conversou com um dos pesquisadores da Whitehat Brasil, que preferiu não se identificar.

Após a publicação da reportagem, a Claro informou em nota que "identificou e corrigiu rapidamente, no dia 14 de novembro, a eventual vulnerabilidade na aplicação Minha Claro Residencial e não foi identificado nenhum prejuízo aos clientes". Além disso, a empresa diz "investir constantemente em políticas e procedimentos de segurança, adotando medidas rígidas para evitar ações indevidas contra seus clientes".

Como funciona?

O pesquisador usa um programa que registra os dados enviados a um servidor e aqueles que são mandados de volta. Após inserir e senha no site da Claro, ele recebeu uma URL, que correspondia ao endereço do seu perfil na Claro, e um "token", uma sequência de números que serve como chave segura e deveria ser única.

O problema foi que esse token não era único. Para ter o à conta de outra pessoa, bastava trocar os últimos números da URL, que representavam o F dos clientes, e usar o mesmo token.

Para mostrar que a falha estava ativa, o programa criou um site, que mostrava os dados capturados. Tilt viu as informações de 14 dos perfis expostos. Havia tanto clientes antigos da Claro, que haviam cancelado o serviço, quanto consumidores ativos.

O grupo que descobriu a falha é o mesmo que já havia revelado em outubro uma brecha no site do Detran do Rio Grande do Norte, que deixou expostas as informações pessoais de 70 milhões de pessoas, incluindo as de personalidades como o apresentador Luciano Huck e o youtuber Whindersson Nunes, e de pessoas influentes, como o presidente Jair Bolsonaro, e os empresários Eike Batista e Edir Macedo.

O Brasil já possui uma lei que obriga empresas a protegerem os dados pessoais de seus consumidores: a Lei Geral de Proteção de Dados Pessoais (LGPD). Ela só a a valer em agosto de 2020. A partir desta data, companhias que não protegerem os dados que armazenam poderão ser punidas por vazamentos. As sanções variam de processos istrativos a multas que podem chegar a 2% do faturamento da infratora, limitada a R$ 50 milhões.

Ainda que a LGPD seja encarada por especialistas como um avanço, já há um projeto de lei pedindo que seus efeitos sejam prorrogados porque algumas companhias não conseguiriam se adaptar em tão pouco tempo. A LGPD foi sancionada pelo ex-presidente Michel Temer em dezembro de 2018.

SIGA TILT NAS REDES SOCIAIS

Errata: este conteúdo foi atualizado
Diferentemente do informado no texto, a operadora destacada no intertítulo "Como funciona" foi a Vivo. No entanto, a empresa envolvida no problema foi Claro. O erro foi corrigido.