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

Caso Henry: como software israelense achou dados apagados em celulares

Polícia Civil mostra troca de mensagens de Monique com a babá - Divulgação/Polícia Civil
Polícia Civil mostra troca de mensagens de Monique com a babá Imagem: Divulgação/Polícia Civil

De Tilt, em São Paulo

09/04/2021 12h08

Uma das principais contribuições que levaram à prisão do Dr. Jairinho (vereador expulso do Solidariedade) e Monique Medeiros pela morte do garoto Henry Borel, nessa quinta-feira (8), foi o conteúdo de mensagens nos celulares do casal. De acordo com a Polícia Civil, foi usado um software da empresa israelense Cellebrite para recuperação das conversas, que haviam sido apagadas anteriormente.

Os serviços da Cellebrite já foram usados para desbloquear os celulares em algumas investigações no Brasil, como as da vereadora do Rio de Janeiro Marielle Franco, assassinada em 2018; da Vaza Jato, com vazamentos de conversas privadas da equipe da Operação LavaJato; e da prisão de Fabrício Queiroz, ex-assessor do senador Flávio Bolsonaro.

A tecnologia é usada apenas por autoridades policiais e permite o desbloqueio de celulares e recuperação de dados apagados a partir de brechas de segurança.

Na investigação da morte de Henry, o software permitiu recuperar prints de conversas via WhatsApp entre Monique e a babá da criança. As mensagens haviam sido apagadas anteriormente do celular de Monique.

"O Cellebrite foi uma prova técnica essencial, muito forte", disse o delegado Antenor Lopes, diretor do Departamento Geral de Polícia da Capital (DGPC).

No site da empresa israelense, ela informa que seu produto garante "o a todos os dispositivos iOS e Android de última geração", capaz de desbloquear celulares e extrair informações. Não é informado, no entanto, os métodos usados para contornar as proteções de segurança das plataformas.

Como foi feita a recuperação?

Uma grande parte dos dados que são deletados dos aplicativos e sistemas continua no aparelho. Depois de apagados, eles são movidos de uma pasta para outra, que funciona como lixeira.

Os aplicativos precisam ter certeza que de fato o dado foi deletado, então conforme vai ando o tempo, periodicamente, o próprio aplicativo sobrepõe os arquivos e apaga os antigos.

Nesse ponto, o processo de decodificar e analisar as informações do celular vira uma corrida contra o tempo. Por conta desse processo de sobreposição de arquivos apagados na memória, a cada minuto que a menos informações sobre a pessoa investigada ficam disponíveis.

Mas, ainda se houver sobreposição, ainda há jeito. As técnicas vasculham dados de aplicativos, que costumam salvar informações em seus respectivos servidores na nuvem.

"Aplicativos de uso corriqueiro fazem isso: os de carona, como Uber, de mensagens, como Messenger ou Slack, e até os de fitness, como o Fitbit. Um criminoso pode deletar todos os arquivos físicos do celular, mas os investigadores podem ainda assim achar elementos", explicou Ronen Engler, gerente-sênior da Cellebrite, em reportagem especial de Tilt sobre o tema.

"São informações cruciais que os investigadores e peritos têm o na nuvem e que podem levar a uma condenação. Muitos não entendem que a remoção de um dado físico do dispositivo não significa que ele está perdido para sempre", completou.

E a criptografia?

As mensagens do WhatsApp estão protegidas pela criptografia ponta a ponta, mas não no caso da perícia. Isso porque as conversas já descriptografadas ficam dentro dos aparelhos e, ao entrarem no celular investigado, os peritos vão ver as mesmas informações que uma pessoa comum veria.

Mesmo dados apagados do WhatsApp podem ser recuperados se ainda não tiverem sido sobrepostos no sistema. Uma ferramenta das perícias nesses casos também costuma ser o backup, que fica fora do WhatsApp, no próprio telefone ou em serviços como Google Drive e iCloud. Nestes casos, é preciso tirar a encriptação, ou seja, decodificar a estrutura que deixa o texto bagunçado e ilegível.

O mesmo vale para SMS e outros aplicativos de mensagem. Somente no caso das mensagens autodestrutivas de apps, como Telegram e Signal, os dados são rapidamente sobrepostos e perdidos.