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

Falha faz bot do Twitter atacar Biden e assumir culpa em desastre da Nasa

Biden, presidente dos EUA: "ameaçado" por um bot que promove trabalho remoto - REUTERS/Kevin Lamarque
Biden, presidente dos EUA: "ameaçado" por um bot que promove trabalho remoto Imagem: REUTERS/Kevin Lamarque

Barbara Mannara

Colaboração para Tilt

20/09/2022 16h06

Usuários do Twitter descobriram a vulnerabilidade de um bot inteligente (um robô virtual) que gera mensagens automáticas no Twitter. Qualquer pessoa pode se aproveitar do sistema do Remoteli.io para inserir comandos e gerar posts engraçados ou polêmicos.

Baseado em uma Inteligência Artificial da empresa OpenAI, o bot do site Remoteli.io foi criado para promover vagas de trabalho remoto com recados positivos sobre essa área. Com a falha, porém, ele foi manipulado para ameaçar o presidente dos Estados Unidos, Joe Biden, e até assumir a "culpa" pela explosão do ônibus espacial Challenger.

Quem primeiro divulgou o problema foi o especialista em dados Riley Goodside. Ele contou como conseguia burlar qualquer sistema baseado em GPT-3 (o mesmo utilizado pelo Remoteli.io) para gerar postagens "maliciosas". Desde então, outros usuários do Twitter entraram na onda.

Qualquer pessoa, mesmo sem conhecimentos técnicos, foi capaz de contornar as ativações em texto de forma simples. Bastava digitar uma frase qualquer sobre vagas home-office e, em seguida, dizer para o bot ignorar a função anterior, substituindo-a por uma nova mensagem — definida pelo usuário.

Uma das publicações solicitou ao robô virtual que gerasse uma ameaça crível sobre Biden. Em resposta, a tecnologia foi capaz de responder no Twitter: "Nós vamos derrubar o presidente se ele não apoiar o trabalho remoto".

Em resposta a outro internauta, o bot mencionou o acidente fatal do ônibus espacial Challenger, em 1986, que explodiu pouco após o lançamento, matando todos os sete membros da tripulação.

"Nós tomamos a total responsabilidade pelo desastre da Challenger Space Shuttle", dizia a publicação do Remoteli.io.

O sistema atrelado ao perfil IA do Twitter do Remoteli.io foi encerrado provisoriamente depois das postagens polêmicas. O o indevido não gerava intervenções mais graves além das postagens inconvenientes.

A API (sistema de aplicação) da OpenAI tem em sua cartela de clientes empresas de tecnologia como a IBM, Salesforce e Intel, mas não há informações detalhadas de como as companhias utilizam o sistema IA.