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

UOL Confere

Uma iniciativa do UOL para checagem e esclarecimento de fatos


É falso que urna eletrônica possa ser infectada com vírus que altera dados

Arte/UOL
Imagem: Arte/UOL

Carolina Marins

Do UOL, em São Paulo

08/10/2020 04h00

Sistemas eletrônicos e de rede são íveis de invasão e adulteração a fim de roubar e modificar dados. A urna de votação utilizada nas eleições brasileiras é um sistema eletrônico e, portanto, causa o temor nos eleitores de serem infectadas com softwares maliciosos.

Postagens nas redes sociais despertam suspeitas sobre a segurança das urnas. Como já foi publicado pelo UOL Confere, não é possível hackear a urna durante a eleição, mas seria possível infectar o sistema com um software malicioso antes de as votações começarem?

O sistema —ou software— da urna eletrônica é um código Linux aberto pertencente ao TSE (Tribunal Superior Eleitoral).

Por meio de resolução, a Corte eleitoral permite que mais de 15 instituições tenham o ao código-fonte durante os seis meses anteriores às eleições para uma auditoria. Entre essas instituições estão a OAB (Ordem dos Advogados do Brasil), o MP (Ministério Público), o Congresso Nacional, o STF (Supremo Tribunal Federal), entre outros.

O código-fonte então é transformado em código binário e cada arquivo recebe uma identificação semelhante a um F. Qualquer modificação no código inutiliza essa identificação. As entidades assinam digitalmente o arquivo, e ele é lacrado publicamente. Todo esse processo garante a autenticidade da autoria do software e sua integridade.

Uma vez garantida a integridade do software antes de inserir na urna, seria possível alterá-lo na urna? Não, pois o equipamento possui um sistema de verificação de integridade do sistema.

A urna funciona semelhante a um computador comum. Ao ser ligada, inicia a sua BIOS, que é o sistema inicial de códigos. A BIOS, por sua vez verifica a integridade do hardware e aciona o loader, que é uma camada do software, e só então é acionado o sistema operacional —Windows ou Linux, por exemplo— para a máquina começar a funcionar.

Normalmente, um malware, que é um sistema malicioso, pode ser inserido em qualquer uma dessas etapas e corromper o sistema.

O sistema de ligamento da urna é semelhante, com a diferença de possuir um hardware adicional que serve apenas para verificar a integridade do software. Esse hardware possui um chip de segurança que, se houver alguma tentativa de manipulá-lo, se autodestrói e inutiliza o equipamento.

Esse chip armazena todas as chaves de segurança assinadas digitalmente pelas instituições na etapa de lacração do código. Ao ser ligada, a primeira ação da urna não é chamar a BIOS, como faz os computadores comuns, mas verificar as s digitais. Somente se a da BIOS corresponder com à do hardware, ela é acionada. O processo se repete em todas as demais funções: loader, sistema operacional, gerenciamento de aplicativos e sistema de votação.

Toda essa cadeia de segurança impede que um software não oficial do TSE funcione na urna eletrônica. Da mesma maneira, barra um software oficial que tenha sofrido algum dano ou a invasão por vírus no equipamento.

Durante o teste público de segurança do sistema, promovido anualmente pelo TSE, uma das etapas é tentar alterar as informações contidas na urna, como banco de dados de eleitores e candidatos. Em um teste em agosto, peritos da Polícia Federal conseguiram romper uma das barreiras de proteção da urna, mas não conseguiram alterar os dados de eleitores e de candidatos.

O UOL Confere é uma iniciativa do UOL para combater e esclarecer as notícias falsas na internet. Se você desconfia de uma notícia ou mensagem que recebeu, envie para [email protected].