17 de fevereiro de 2018

A fiabilidade do hardware e a segurança da informação

A perceção comum que o computador nunca comete erros na execução das operações é traduzida na expressão «a máquina nunca se engana ou a máquina tem sempre razão». Podemos confiar nas máquinas, por exemplo, para efetuar operações aritméticas com números de elevado valor ou de grande precisão ou para confirmar as que efetuamos manualmente. Isto é válido para a grande maioria das aplicações numéricas, mas para um tipo muito específico de cálculos com números de elevado valor e com parte fracionária foi descoberta pelo professor de matemática Thomas Nicely, em 1994, uma falha na execução de uma série de cálculos programados em software que “corria” num computador equipado com o microprocessador Intel Pentium, erro que ficou conhecido por “bug” FDIV. Os números com parte fracionária são representados num formato de vírgula flutuante (vide Correio dos Açores, 8-9-2016, pág. 21), diferente do usado para os números inteiros (sem parte fracionária) e por consequência são diferentes os algoritmos utilizados para efetuar as operações aritméticas. O professor Nicely investigou e concluiu que existia um erro na implementação da operação de divisão com números no formato de vírgula flutuante (floating-point division, FDIV) e informou o fabricante que o corrigiu no modelo seguinte dos processadores Intel Pentium. Até há pouco tempo era consensual que as ameaças à segurança informática eram devidas a vulnerabilidades no software (programas) e nos protocolos de comunicações. Recentemente surgiram notícias da descoberta de falhas no funcionamento do hardware dos computadores (mais concretamente nos processadores) que podem afetar a segurança da informação neles armazenada e por eles processada. No inicio deste ano foi publicamente divulgada e oficialmente assumida pelos fabricantes a existência de duas vulnerabilidades, denominadas Meltdown (fusão)e Spectre (espetro), que derivam do modo como os processadores modernos executam os programas informáticos. Estas vulnerabilidades, registas na base de dados global CVE (Common Vulnerabilities and Exposures), podem ser exploradas por software maligno que tira partido dos efeitos laterias ou secundários de modelos de processamento para aceder indevidamente a informação privilegiada do sistema operativo ou informações manipuladas por outros programas que se encontrem em execução. Os processadores dos maiores fabricantes que equipam os nossos computadores de secretária, portáteis ou smartphones sofrem desta falha e embora não haja notícia que já algum tenha sido afetado por software maligno que as explorem, é provável que venha a acontecer. Não será possível a eliminação completa dos efeitos destas vulnerabilidades, consequência de falhas no desenho (projeto) dos processadores, mas será possível impedir a sua exploração efetuando atualizações aos sistemas operativos. Estas modificações não permitirão que os processadores recorram a determinados modos de execução do software e terão como consequência um menor desempenho no processamento da informação. Segundo os fabricantes dos processadores, esta diminuição do desempenho dos processadores afetará mais os computadores com uma utilização mais intensa e exigente (os servidores) do que os pessoais. O Centro Nacional de Cibersegurança emitiu um alerta relativo ao impacto que estas duas vulnerabilidades podem representar para segurança informática e aconselha a atualização dos sistemas operativos de acordo com as indicações dos respetivos fornecedores. Embora se tenha registado uma evolução tecnológica muito acentuada desde o surgimento do primeiro computador em meados da década de 40 do século XX, os componentes principais são os mesmos que foram definidos naquela altura no modelo de arquitetura de von Neumann. Nos computadores de hoje continuamos a identificar uma unidade de processamento central (CPU) ou processador, os sistemas de memória e as unidades de entrada e saída conectadas aos periféricos, que correspondem respetivamente às funções de processamento, armazenamento e transmissão da informação. O processador executa as instruções que compõem os programas (software) usando os dados (que representam informações) contidos na memória e controla a operação de todos componentes do computador.Durantes várias décadas o desempenho de cada componente melhorou, fruto de uma maior rapidez de operação e capacidade de processamento ou de armazenamento. No entanto, as instruções de um programa continuaram a ser executadas de um modo sequencial como inicialmente especificado na arquitetura de von Neumann, ou seja, só depois de concluídas todas as ações respeitantes à execução de uma instrução era iniciada a execução da instrução seguinte. Na impossibilidade de aumentar continuamente a frequência ou ritmo de execução das instruções,o que originaria um elevado consumo de energia, aumento da temperatura dos dispositivos e elevadas perdas por dissipação, os projetistas dos processadores estudaram processos que maximizassem a eficiência de execução do software. Com este objetivo foram identificadas na execução de uma instrução fases bem distintas em que as correspondentes tarefas podem ser realizadas por componentes do processador que operam de forma autónoma. Assim, será possível ter em execução várias instruções, cada uma numa fase distinta, à semelhança do que acontece numa linha de montagem de produtos numa instalação fabril em que cada operário executa uma tarefa específica.Com este modo de execução de instruções, denominado em “pipelining”, são conseguidos elevados ganhos no número de instruções por segundo que o processador consegue executar. Se existirem várias linhas de montagem (pipelines), aumentará o número de unidades produzidas, no processador, o número de instruções executadas - é o chamado processamento paralelo. A natureza das tarefas e os custos associados aos recursos necessários para as realizar, limitam o número de etapas (e de linhas) de montagem, bem como o número de fases (estágios) de execução em modo “pipeline” e de vias de processamento paralelo. No funcionamento dos processadores não existem as mesmas restrições quanto ao armazenamento da informação e execução de instruções que as verificadas nas linhas de montagem, que limitam o número de produtos em produção simultânea e impossibilitam a suspensão da montagem de um produto para prosseguir com a de outro. O processador nunca “para” e está sempre disponível para a realização de tarefas, dando oportunidade para organizar a realização das várias fases de execução das instruções por forma a aproveitar esta disponibilidade. Quando temos um conjunto de tarefas para realizar e algumas delas são mais demoradas que outras, enquanto esperamos que alguma decorra, podemos avançar em algumas ou «adiantar serviço» em vez de ficarmos inativos. Assim acontece na preparação de uma refeição: enquanto algum ingrediente descongela ou aquece podemos preparar outros e quando todos estiverem nas devidas condições juntá-los para obter o prato pretendido. Este método de preparação de refeições aplica-se na cozinha de um restaurante para responder a vários pedidos de diferentes pratos. Quando o processador está a aguardar que uma fase mais demorada de uma instrução termine (uma busca de dados à memória) poderá avançar na execução de uma fase de outra instrução. As instruções de um programa têm uma sequência e devem ser concluídas nessa ordem porque muitas vezes existem dependências entre elas: umas necessitam de resultados calculados por outras. Esta é a chamada execução fora-de-ordem que exige uma coordenação eficaz para que os resultados sejam idênticos aos que seriam obtidos numa execução sequencial. Num restaurante, será desejável que os pedidos sejam atendidos pela ordem que foram feitos, embora as alterações na sequência de saída não afetem a qualidade dos pratos, mas não agradem aos clientes em espera. Na vulnerabilidade Meltdown, a execução de instruções em modo fora-de-ordem é explorada por software maligno para aceder a zonas de memória reservados ao sistema operativo e obter informação privilegiada relativa a todos os processos em curso. Na execução de um programa existem pontos de derivação em que a escolha da via a prosseguir depende de valores calculados em instruções anteriores. Para preencher os períodos de inatividade o processador poderá efetuar uma previsão da via que será seguida após a derivação e avançar na execução as instruções que se lhe seguem. Se a previsão estiver correta, esta execução, designada especulativa, resulta num aumento da rapidez de processamento; se estiver incorreta, não representa uma diminuição porque o processador estaria inativo. Na realidade, a taxa de sucesso nestas previsões é superior a noventa por cento. Facilmente se percebe o quanto seria desastrosa, na gestão da cozinha de um restaurante, a preparação de pratos com base na previsão dos pedidos dos clientes pelas perdas que implicaria. O software maligno que explora a vulnerabilidade Spectre promove intensionalmente a execução especulativa para aceder informações colocadas em zonas de memória (memória cache) partilhadas por outros programas. Nas execuções fora-de-ordem e especulativa, os processadores atuais não verificam, como deveriam, se as instruções referenciam apenas as zonas de memórias reservadas aos respetivos programas porque estes modos de execução são controlados pelo processador e foram considerados, erradamente, invisíveis aos programas. A atualização do sistema operativo dos computadores poderá introduzir uma proteção, não completamente eficaz, contra a vulnerabilidade Meltdown, mas os riscos da Spectre apenas são podem ser eliminados inibindo a execução especulativa no processador. Ambas as falhas exigirão um redesenho dos processadores.
Print

Categorias: Opinião

Tags:

Theme picker