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

Adolescente é preso nos EUA por hack que afetou personalidades no Twitter

Golpe aplicado por jovem de 17 resultou em milhares de dólares roubados por bitcoin - Estúdio Rebimboca/UOL
Golpe aplicado por jovem de 17 resultou em milhares de dólares roubados por bitcoin Imagem: Estúdio Rebimboca/UOL

Felipe Oliveira

Colaboração para Tilt

31/07/2020 18h23

Um adolescente de 17 anos foi preso nesta sexta-feira (31) na Flórida, Estados Unidos, acusado de ser o mentor da maior violação de segurança da história do Twitter. O ataque, que atingiu cerca de 130 contas na rede social no dia 15 de julho, afetou personalidades como o candidato a presidência Joe Biden, o ex-presidente Barack Obama e os bilionários da tecnologia Bill Gates e Elon Musk.

Todas as contas hackeadas publicaram mensagem semelhante: um golpe para que usuários da rede social deem dinheiro para um endereço de bitcoin. O conteúdo já foi apagado da rede social.

O jovem foi acusado de mais de 30 crimes pela Procuradoria da Flórida do Condado de Hillsborough, incluindo fraude em comunicação, roubo de identidade, fraude organizada e o ao computador ou dispositivo eletrônico sem autorização.

O procurador estadual Andrew Warren disse, em entrevista coletiva, que não podia comentar se o adolescente atuou sozinho. Mas, afirmou que ele está sendo acusado como adulto, já que "esse não era um garoto comum de 17 anos".

"Esses crimes foram cometidos usando os nomes de pessoas famosas e celebridades, mas não são elas as principais vítimas aqui. Este 'Bit-Con' foi projetado para roubar dinheiro de americanos comuns de todo o país, inclusive aqui na Flórida. Essa fraude maciça foi orquestrada aqui mesmo em nosso quintal, e não vamos aceitar isso", disse Warren.

De acordo com as investigações, o esquema de fraude arrecadou mais de US$ 100 mil em bitcoins em apenas um dia. Por ser uma criptomoeda, o bitcoin é difícil de ser rastreado e recuperado nesses casos.

"Conseguir enganar as pessoas com seu dinheiro suado sempre está errado. Esteja você tirando proveito de alguém pessoalmente ou na internet, tentando roubar dinheiro ou criptomoeda, é fraude, é ilegal e você não vai se safar", destacou Warren em seu comunicado.

Embora o FBI tenha aberto sua própria investigação inicialmente, não está claro se isso ainda está em andamento. "O FBI e o Departamento de Justiça continuarão a se associar ao escritório durante toda a acusação", diz o texto.

Twitter se manifesta

Na quinta (30), o Twitter fez sua primeira tentativa para explicar a forma como os invasores conseguiram burlar as ferramentas de segurança para ar as contas.

A empresa afirmou que vários funcionários foram alvo de um "ataque de spear phishing". Funcionaria assim: hackers teriam ligado para funcionários do Twitter e se aram por membros de segurança da empresa para que eles revelassem suas credenciais.

O Twitter alega que nenhum usuário verificado teve suas mensagens privadas ou caches de dados comprometidos, sugerindo que as mensagens particulares de Biden, Obama e outros poderiam estar seguras. A conta do Twitter do presidente Trump possui proteções extras, o que pode explicar por que não foi invadida.

Após a ação desta sexta-feira, a rede social mais uma vez se manifestou para agradecer o trabalho da polícia. "Agradecemos as ações rápidas da aplicação da lei nesta investigação e continuaremos a cooperar à medida que o caso avança. De nossa parte, nosso foco é ser transparente e fornecer atualizações regularmente", disse em uma postagem.