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

Criminosos intimidam crianças com dados obtidos de Apple e Meta; entenda

Vitaly Vlasov/ Pexels
Imagem: Vitaly Vlasov/ Pexels

Marcella Duarte

Colaboração para Tilt, em São Paulo

30/04/2022 16h13

A Apple, a Meta, o Twitter e outras gigantes da tecnologia têm sido enganadas por hackers, e podem ter contribuído para a extorsão de menores e mulheres. Os criminosos se am por policiais para conseguir dados pessoais sensíveis de usuários dessas companhias, e então entram em contato com eles.

Esta tática já havia sido empregada em fraudes financeiras, mas agora também foi usada para extorquir sexualmente as vítimas, que são forçadas a produzir e enviar fotos e vídeos íntimos. Google, Snap e Discord também estão entre as empresas alvo do golpe.

Não se sabe quantos pedidos falsos de dados as big techs já receberam, já que eles parecem vir de órgãos da lei legítimos. De acordo as autoridades norte-americanas, estes incidentes se tornaram "mais prevalentes" nos últimos meses.

Como se proteger?

Este golpe é especialmente efetivo pois as vítimas não tiveram nem chance de se proteger — o simples uso das plataformas as deixou expostas. A única maneira de evitar é não usar os serviços das empresas, o que é quase impossível nos dias de hoje.

Os hackers tiveram sucesso pois, normalmente, as gigantes de tecnologia respondem a apelos de emergência das autoridades (casos de perigo iminente, como suicídio, assassinato ou sequestro) compartilhando uma quantidade limitada de informações primeiro, mesmo sem ordem judicial, em sinal de boa fé, e fazendo perguntas depois.

Os dados enviados costumam incluir nome, IP, email e endereço físico. Não é muito, mas mais que suficiente para criminosos realizarem práticas de phishing (conseguir senhas, número de cartão etc), doxing (divulgar informações pessoais), swatting (enviar uma equipe de polícia para a casa da pessoa) e outros golpes.

De acordo com a Bloomberg, alguns dos hackers invadiram as contas das redes sociais das vítimas para conseguir fotos e vídeos íntimos, ou fizeram amizade com mulheres e menores, encorajando-os a enviar imagens explícitas.

Também ameaçaram vazar estes conteúdos para amigos, familiares e diretores de escola, se não cumprissem algumas ordens. Em alguns casos, as vítimas foram pressionadas a cortar sua pele com o nome do hacker.

Acredita-se que muitos dos criminosos sejam adolescentes, residentes nos Estados Unidos e de outros países.

Há solução?

E agora, como diferenciar as autoridades falsas das reais, sem comprometer o andamento da Justiça? "Ninguém quer que as empresas de tecnologia recusem pedidos legítimos de emergência, quando a segurança de alguém está em jogo", disse o senador Ron Wyden. "Mas o sistema atual tem pontos fracos claros que precisam ser resolvidos."

"Nós revisamos todos os pedidos de dados e usamos sistemas e processos avançados para validar solicitações de aplicação da lei e detectar abusos", disse Andy Stone, porta-voz da Meta, ao Engadget. "Bloqueamos contas comprometidas de fazer solicitações e trabalhamos com a aplicação da lei para responder a incidentes envolvendo solicitações fraudulentas suspeitas."

As big techs podem ter de implementar algum tipo de "autenticação de dois fatores" com a polícia, como uma chamada de volta, ou mesmo um sistema específico para realização destes pedidos, no qual seria mais fácil detectar uma invasão hacker.