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

Russos derrubam antenas de 3G na Ucrânia, mas acabam sem sinal de celular

Colaboração para Tilt, do Rio de Janeiro

11/03/2022 19h11Atualizada em 14/03/2022 16h53

Após derrubarem diversas antenas de 3G na Ucrânia, militares russos ficaram sem sinal de telefonia e acabaram hackeados. A informação foi divulgada na última segunda-feira (7) pelo jornalista Christo Grozev, da organização de jornalismo investigativo Bellingcat.

De acordo com Grozev, que publicou uma série de tuítes explicando a situação, essa interceptação foi possível porque os celulares criptografados usados até então pelos russos necessitavam justamente de comunicação 3G para funcionar.

Para entrar em contato com suas bases militares, os combatentes da Rússia haviam montado uma rede criptografada dentro da própria rede ucraniana, chamada "rede Era". Quando as torres foram derrubadas durante a guerra, o funcionamento dos seus telefones foi abalado.

Após a queda das antenas, para manter contato com as bases militares, os soldados da Rússia precisaram, então, recorrer a telefones e walkie talkies comuns, sem uso de criptografia. Foi a partir dessa brecha na segurança, segundo Grozev, que agentes de inteligência ucraniana conseguiram o a conversas de vários combatentes russos.

"Os idiotas tentaram usar os celulares criptografados Era em Kharviv depois de destruir várias torres de 3G e substituí-las por stingrays", escreveu Grozev em um de seus tuítes. Os stingrays são ferramentas que simulam redes de Internet e que, comumente utilizados para vigilância, permitem a interceptação de dados dos dispositivos conectados a elas.

3G da Ucrânia era importante para os russos

Ainda de acordo com Grozev, o conteúdo de uma dessas conversas revelou que, por causa da derrubada dessas antenas, os russos perderam o a todos os seus dispositivos de comunicação segura. Isso porque todos eles eram mantidos pelo sistema de criptografia Era, que foi introduzido pelo Ministério da Defesa da Rússia em 2021.

"O [sistema] Era precisa de 3G/4G para se comunicar. Os militares russos estão equipados de telefones seguros que não funcionam nas áreas em que eles estão", escreveu Grozev.

Até esse ataque, os militares da Rússia não haviam ainda derrubado torres de comunicação 3G na Ucrânia. A situação vai ao encontro da tese do diretor do programa de tecnologias estratégicas do Centro de Estudos Estratégicos e Internacionais, James Lewis.

Ao jornal europeu Politico, ele explicou que os russos ainda não teriam derrubado torres de telefonia da Ucrânia provavelmente porque, além de utilizá-las para interceptar os telefones dos ucranianos, estariam também fazendo uso dessas comunicações.

"Em geral, eles [os russos] vão querer manter os celulares funcionando em Kyiv porque [aí] podem escutá-los", o especialista disse ao Politico ainda na segunda-feira.

Também segundo o jornalista da Bellingcat, foi por intermédio dessa interceptação que foi revelada pela inteligência ucraniana a morte de mais um general russo, o Major Vitaly Gerassimov. O militar foi o segundo combatente russo deste escalão a perder a vida durante o confronto.