Jump to content
  • Spectre e Meltdown - Entendendo vulnerabilidades de processadores

       (1 review)

    esoj
     Share

    Neste artigo vamos abordar os principais tópicos referentes a microprocessadores modernos como hierarquia de memória, pipelines, execução fora de ordem e analisar como essas features contribuiram para o surgimento de vulnerabilidades especulativas como o Spectre e o Meltdown.

    Como CPUs funcionam?

    As CPUs contêm um grupo de comandos bem definidos que permitem realizar operações lógicas e aritiméticas, ler e escrever na memória, fazer comparações, e controlar o fluxo de execução do próprio programa. O programador tem acesso a parte dessa interface da CPU através de instruções de máquina, que permitem ao programador solicitar diretamente à CPU para que esses comandos sejam realizados. Um exemplo de sequência de instruções é:

    1.mov ax,8
    2.mov bx,10
    3.add ax,bx
    

    Registradores são as unidades de armazenamento mais rápidas em termos de tempo de acesso, pois estão presentes dentro da CPU e estão fisicamente próximas das unidades de execução, que serão responsáveis por realizar as operações matemáticas na Unidade Lógica aritimética (ULA). 

    No exemplo acima foram utilizados dois registradores, o ax e o bx para realizar uma soma. Para o programador é importante que essas instruções sejam executadas na ordem correta, pois caso as instruções 2 e 3 troquem de posição isso poderia resultar em um comportamento inesperado do programa.

    Todavia, o ciclo completo de execução de uma única instrução possui várias etapas demoradas. Entre elas pode-se citar:

    - A leitura da própria instrução;
    - A decodificação da instrução pela CPU, realizando o chaveamento e a decisão de qual caminho o dado manipulado deve tomar;
    - A resolução dos acessos a memória, se houverem;
    - A execução da operação aritimética ou lógica, se houver;
    - A escrita do resultado na memória, se houver.

    Hierarquia de memória

    Para compreender por que certas operações demoram mais que as outras é preciso abordar o conceito de hierarquia de memória.
    Devido a questões de tecnologia empregada, proximidade física e densidade de armazenamento, os computadores utilizam uma combinação de dispositivos de armazenamento. Em geral componentes mais rápidos como registradores e caches localizam-se próximos a CPU, pois são constantemente utilizados. Esses componentes priorizam velocidade acima de densidade de bits ou custo e pelo fato de estarem próximos ao local de uso estão restritos a uma quantidade pequena. No outro extremo estão componentes lentos, mas com alta capacidade como SSDs e HDDs, que acabam priorizando armazenamento total e custo ao invés de velocidade.

    | Tecnologia empregada      | Tempo tipico de acesso      | $ por GB em 2012 |
    | --------                  | --------                    | --------         |
    | SRAM                      | 0.5-2.5 ns                  | $500-$1000       |
    | DRAM                      | 50-70 ns                    | $10-$20          |
    | FLASH                     | 5000 5000                   | $0.75-$1.00      |
    | Disco Magnético           | 5000000 - 20000000 ns       | $0.05-$0.10      |
    
    Adaptado de Computer Organization and Design RISC-V Edition: The Hardware Software Interface

    Localidade Temporal e espacial

    A hierarquia de memória se baseia no princípio de que o acesso aos dados não é puramente aleatório. Devido à estrutura das operações mais comuns em programas como loops, acessos sequenciais a listas, e até mesmo o acesso das próprias instruções que tendem a seguir um fluxo sequencial, tem-se os conceitos de localidade temporal e espacial. 

    A localidade temporal é quando um dado recentemente acessado tem alta probabilidade de ser acessado novamente, como em índices de loops e contadores.

    A localidade espacial diz respeito ao acesso de posições de memória próximas. Por exemplo, quando o elemento 2 de uma lista é acessado, provavelmente o elemento 3 também será.

    Quando esses dados são trazidos para níveis superiores da hierarquia de memória, a próxima vez que esses itens precisarem ser acessados, os níveis inferiores não precisarão ser consultados, permitindo um acesso mais rápido ao dado.

    Hit rate, Miss rate

    Sabendo as taxas de acerto dos componentes da hierarquia pode-se calcular o tempo de acesso médio a memória e observar o impacto que determinados componentes possuem. Tomando como exemplo (não muito realista) a seguinte estrutura:

    | Componente    |Tempo de acesso | Taxa de Acerto |    
    | --------      | --------       | -----          |
    | Cache         | 2 ns           | 90%            |
    | DRAM          | 70ns           |90%             |
    | FLASH         |5000ns          |100%            |

    Acontece que:

    • Em 90% dos acessos o dado estará na cache e tempo de resposta será 2ns;
    • Em 90% das 10% (9%) das ocorrências em que o dado não estava na cache, ele estará na DRAM e o tempo de resposta será 2ns (busca na cache) + 70ns (busca na DRAM);
    • Nos 1% de acessos que não foram satisfeitos pelos componentes superiores o tempo de acesso será 5000ns +70ns+2ns.

    Portanto, o tempo médio de acesso será:

    0.9 * 2ns + 0.09 * 72ns + 0.01 * 572ns = 14ns
    

    Ao remover a cache o tempo médio subiria para:

    0.99 * 70ns + 0.01 * 570ns = 75ns

    Pipeline

    Conforme visto no programa abaixo, diversas etapas são necessarias para a execução completa de uma instrução. Todavia, durante esse processo o dado é utilizado apenas em um componente por vez, deixando os demais elementos da CPU ociosos, por exemplo durante o cálculo de uma soma na ULA não existem leituras de instruções feitas pela memória. Uma forma de melhorar o Throughtput de instruções seria permitir que os componentes ociosos trabalhem em forma de uma cadeia de produção, assim como ocorrem em uma linha de montagem, permitindo então reduzir o período de clock total pois cada etapa do processo pode ser feita em menos tempo.

    |Operação            | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
    |------------------------------------------------|
    |Leitura de instrução| A | B | C |   |   |   |   |
    |Decodificacao       |   | A | B | C |   |   |   |
    |Execução            |   |   | A | B | C |   |   |
    |Memória             |   |   |   | A | B | C |   |
    |Escrita             |   |   |   |   | A | B |   |
    

     

    Diagrama da execução das instruções A B e C ao longo dos ciclos 1-7 no estágio 3 por exemplo as unidades de Leitura, decodificação e execução estão ativas simultaneamente

    Todavia ao contrário de uma linha de produção em uma fábrica, instruções não são completamente independentes umas das outras. Considere a seguinte sequência:

    A. add ax,[bx]
    B. jz $+1
    C. nop 
    

    Neste caso, a finalização da instrução A ocorrerá no melhor dos casos, apenas no ciclo 5, podendo levar ainda mais tempo dependendo de qual posição na hierarquia de memória o dado apontado por bx está. Todavia o pipeline necessita escolher se faz a leitura da instrução C ou a próxima ($+1) logo no ciclo 3. Quando isso ocorre, a CPU pode decidir esperar o resultado da operação o que acarretaria em perda de performance ou realizar uma predição sobre o pulo.

    Predição

    O exemplo acima trata de um desvio condicional. Ou seja, existem apenas dois caminhos possíveis que a CPU pode executar, tomar ou não tomar o pulo. Para auxiliar a decisão existem componentes internos na CPU chamados preditores de desvio, que coletam informações sobre os pulos recentes tomados para auxiliar na decisão. O exemplo mais simples é do contador de saturação ilustrado abaixo. Quando o desvio é tomado diversas vezes o preditor se adapta e passa a aceitar os próximos pulos tomados.

     

    FwIv8Ux.thumb.png.386fb333e38c3b227f9d30856a231a4a.png

    Preditor condicional de 2 bits. Extraido de https://en.wikipedia.org/wiki/Branch_predictor

     

    if (*canRun){
        f1();
    }
    else{
        f2();
    }
    

    Exemplo de código que pode gerar comportamento especulativo caso a variável apontada por canRun não esteja na cache por exemplo

    Quando é necessário predizer o próximo endereço, é realizada uma execução especulativa ou seja, o processador não tem certeza se o caminho de execução está correto, então todos os resultados feitos a partir da predição são armazenados em registradores de rascunho. Quando a condicional que gerou a execução especulativa for resolvida (canRun foi lida da memória por exemplo), caso o caminho tomado esteja correto os resultados são gravados nos registradores verdadeiros, levando a um ganho de desempenho. Se o caminho tomado estiver incorreto os resultados presentes nos registradores de rascunho são descartados e é necessário executar o caminho correto dessa vez, levando a um desempenho semelhante ao obtido se o processador tivesse esperado a avaliação ter sido concluida.

    Processador superescalar e execução fora de ordem

    As CPUs modernas possuem mais do que uma única unidade de execução por núcleo, permitindo em algumas situações realizar mais do que uma instrução por ciclo de clock. Para que o uso de mais de um unidade de execução simultânea seja funcional ele deve ser capaz de alocar as instruções sem que haja uma alteração no resultado da operação a ser computada visando paralelizar as operações a serem realizadas. As instruções podem ser re-ordenadas e executadas fora de ordem desde que a dependência entre elas seja obedecida.

    Para que as instruções possam ser reordenadas elas devem respeitar os três riscos ao pipeline

    Read After Write

    mov rax,2
    mov rbx,rax
    Não podem ser trocadas de ordem pois o resultado da segunda instrução seria alterado
    

    Write After Read

    mov rbx,rax
    mov rax,2
    Não podem ser trocadas de ordem pois o resultado da primeira instrução seria alterado
    

    Write After Write

    mov rbx,rax
    mov rax,rbx
    Não podem ser trocadas de ordem pois o resultado de ambas instrução seriam alterados
    

    Desde que respeitadas essas dependências a CPU pode reordenar instruções para executar várias operações em paralelo. Abaixo esta representada a unidade de execução de uma CPU moderna.

    8WBb6MA.png.ea59140e73960038ad2152180678fcde.png
    Unidades de execução presentes em um único núcleo de uma CPU modernas intel. Extraído de https://mdsattacks.com/

    Uma forma simples de demonstrar o paralelismo a nivel de instrução é com o código a seguir. No primeiro bloco existem 200 instruções inc esi . Devido a dependência Write after Write elas não poderão ser trocadas de ordem ou executadas em paralelo.

    No segundo bloco existem 100 instruções inc esi e 100 instruções inc edi. Embora haja dependência entre o valor atual do registrador esi e o anterior, o par de instruções pode ser executado em paralelo, pois não há dependência entre eles. 

    Dessa forma, é esperado um desempenho próximo de 200 ciclos para o primeiro bloco e próximo de 100 ciclos para o segundo bloco. Foram utilizadas as instruções rdtsc para realizar a medição do "tempo" de execução e lfence para serializar a instrução rdtsc, garantindo que ela não será reordenada.

    O resultado do programa (executado em um i5-7500) mostra 264 ciclos para o primeiro bloco e 146 para o segundo. Considerando o overhead esperado pela execução do rdstd; lfence os resultados indicam um throughput mínimo de 0.75 instruções por ciclo para o primeiro bloco e 1.36 para o segundo bloco, evidenciando o comportamento superescalar da CPU.

    //gcc  -masm=intel -o ilp ilp.c
    #include <stdio.h>
    int main(){
        int time1;
        int time2;
        asm __volatile__(
                "lfence            ;"
                "rdtsc            ;"
                "lfence            ;"
                "mov ecx,eax    ;"
                
                ".rept 200        ;"
                "inc esi        ;"
                ".endr            ;"
    
                "lfence            ;"
                "rdtsc            ;"
                "sub eax,ecx    ;"
                "mov %0,eax        ;"
                :"=r"(time1)
                );
    
        asm __volatile__(
                "lfence            ;"
                "rdtsc            ;"
                "lfence            ;"
                "mov ecx,eax    ;"
                
                ".rept 100        ;"
                "inc edi        ;"
                "inc esi        ;"
                ".endr            ;"
    
                "lfence            ;"
                "rdtsc            ;"
                "sub eax,ecx    ;"
                "mov %0,eax        ;"
                :"=r"(time2)
                );
    
        printf("Ciclos gastos no bloco 1: %i\n",time1);
        printf("Ciclos gastos na bloco 2: %i\n",time2);
        
    }
    
    $ ./ilp
    Ciclos gastos no bloco 1: 264
    Ciclos gastos na bloco 2: 146

     

    Operação da Cache

    A Cache de um processador funciona como uma pequena e rápida memória dentro do chip da CPU que salva o conteúdo dos últimos e próximos endereços a serem acessados. Quando uma CPU solicita um byte para a memória devido ao barramento ser de 64 bits e as memórias serem otimizadas para operação em modo burst bem mais dados do que o que foi solicitados chegam a CPU, assim a cache guarda os dados recebidos para quando eles forem solicitados novamente não seja necessário requisitar a memória novamente e a resposta seja muito mais rápida. 

    A cache armazena os dados em forma de linhas, onde cada linha contém múltiplos bytes (64 bytes atualmente).

    Quando o endereço solicitado chega a cache, ele é dividido da seguinte forma:

    | Tag | Set | Offset|
    | --- | --- | ---   |

    Offset é a posição do byte na linha da cache, Set é o endereço da linha na Cache e a Tag é o restante. A tag é guardada para poder diferenciar endereços com mesmo set e offset. Em uma CPU com 256 linhas e 64 bytes cada linha o tamanho de cada parte seria:

    |Offset | bits 0-5   |
    |Set    | bits 6-13  |
    |Tag    | bits 14-63 |

    Paginação e Translation Lookasidebuffer

    Processadores modernos necessitam executar múltiplos programas simultaneamente, para isso um dos problemas a ser resolvido é o gerenciamento de memória.Um processo A não deve ser capaz de ler ou escrever na memória de um processo B, se isso fosse possível um programa mal escrito provavelmente causaria um crash acidental nos demais programas ao escrever no endereço errado, ou então um malware seria capaz de ler memória de outros usuários da mesma máquina. Além disso, programas que foram compilados para utilizarem endereços virtuais idênticos devem ser capazes de executar ao mesmo. O compilador não é capaz de conhecer previamente quais endereços estarão sendo utilizados durante a execução do programa.Para isso, o sistema operacional é responsável em realizar a tradução de endereços virtuais(escolhidos pelo compilador) para endereços físicos(utilizados pelo chip de ram).

    #include <stdio.h>
    int main(){
        printf("ola mundo!\n");
    }
    
    $objdump -s test
    Contents of section .rodata:
     402000 01000200 6f6c6120 6d756e64 6f2100    ....ola mundo!.

    Endereço virtual 0x402000 utilizado para a string "ola mundo!"

     

    Os sistemas operacionais atuais isolam a memória de processos através de paginação. Toda vez que um programa acessa a memória o endereço é traduzido de endereço virtual para físico através da consulta da tabela de páginação no sistema operacional. Essa tradução é feita através da tabela de paginação, uma região de memória em que o kernel pode escrever os valores do endereço físico de cada página a ser traduzida. Por questões de economia de espaço, ela é dividida em níveis. Caso essa divisão não exsitisse, para páginas de 4kb de tamanho e 48-bits de espaço de endereçamento e 8 bytes de entrada seriam necessários 2^36 indices, portanto 2^36 * 8 = 512GB para um único processo. Quando a tabela de paginação é divida em dirietórios, se o diretório superior possui 10 entradas, apenas as entradas utilizadas provocarão uma alocação dos diretórios inferiores, reduzindo o total de espaço alocado para a tabela de paginação.

    É importante ressaltar que junto ao endereço físico armazenado em cada entrada, estão presentes também as permissões da cada página como leitura, escrita e execução. Caso uma instrução viole a permissão de leitura ou escrita por exemplo a CPU gera uma exceção de Segmentation Fault que pode fazer com que a execução do programa seja suspensa.

    IDgEEjo.thumb.png.ac7ed22374d512f36fe4329dfcfc5798.png
    Esquema de páginação de 4 níveis utilizado no linux. Adaptado de https://jasoncc.github.io/kernel/jasonc-mm-x86.html

    Para aumentar o desempenho essa tabela é cacheada através do Translation lookaside buffer, que guarda os mapeamentos recentes entre endereço virtual e físico, evitando assim com que a memória seja consultada toda vez que um endereço seja acessado.
    Quando uma troca de contexto ocorre como o chaveamento entre dois processos, o registrador CR3 que aponta para a base da tabela é trocado e a TLB deve receber um flush para invalidar suas entradas.

    ---
    Observação

    Devido ao desuso da segmentação, o endereço virtual usualmente será o mesmo que o endereço linear que seria obtido após a segmentação e utilizado como entrada para o mecanismo de paginação.

    ---

    Observando o estado da micro arquitetura - Cache Side Channels Attacks

    Um ataque de side channel é um ataque que ao invés de buscar uma falha no algoritmo, exfiltra ou obtem informação sensível de um sistema baseado em algum efeito colateral durante a sua execução.

    Alguns exemplos de side channel

    • Frequencia de rádio
      • Air-Fi permite um atacante exfiltrar dados de um computador comprometido mas sem acesso a internet, utilizando o barramento de memória como placa de rede sem fio.
      • TempestSDR permite um atacante recuperar a imagem transmitida para um monitor através das ondas eletromagnéticas transmitidas pelo cabo HDMI.
    • Consumo de energia
      • Ataques de análise de consumo de energia podem ser capazes de identificar quais etapas do algoritmo de encriptação estão sendo executadas e assim extrair a chave utilizada. (rhme2 CTF https://github.com/Riscure/Rhme-2016)
    • Tempo
      • Checagens de senhas com tempo variável podem permitir descobrir quantos caracteres em uma senha estão corretos e assim realizar um ataque de força bruta com muito mais facilidade
    • Cache
      • Permite observar efeitos colaterais da execução de outros programas, bem como observar os efeitos de operações internas de CPU que deveriam ser invisíveis ao programador, como execução especulativa por exemplo.

    Para compreender melhor os ataques a seguir vamos escolher um tipo de side channel de cache que será utilizado como método de exfiltração dos segredos obtidos pelos ataques a seguir.

    Copy on write e ataques de side channel

    Porém, nem sempre é desejavel que os processos isolem completamente sua memória. Seções de memória comuns a diversos processos como bibliotecas podem ser compartilhadas através do mecanismo de Copy on Write. Nele, quando uma página é carregada através da syscall de mmap com um arquivo como parâmetro se aquele arquivo já estiver mapeado em memória não é criada uma nova página. Caso o processo deseje alterá-lo, uma cópia privada da página é criada e passa a ser exclusiva para aquele processo, por isso o nome Copy on Write. Embora não haja nenhum problema de segurança inerente desse mecanismo pois para que haja compartilhamento as seções devem ser idênticas, o mero compartilhamento da memória física pode gerar interferências entre processos, como será visto ao analisar o tempo de resposta da memória para essas regiões.

    XcsQ9MM.thumb.png.1bbab353b6fa8cf98b0b4d8d675577ef.png
    Diagrama de dois processos compartilhando a região de bibliotecas. Quando o endereço virtual referente a biblioteca é traduzido, ele aponta para uma única região da memória RAM

    Exemplo de programa vulnerável a side channel

    void main(){
        //emojiList é compartilhada por COW pois está em uma biblioteca
        char *flag="segredo";
        char t;
        while (1){
            for (int i=0;flag[i]!='\0';i++){
              t = emojiList[flag[i] * 160];
            }
        }
    }

    No exemplo acima, o conteúdo da variável flag, a principio não conhecida pelo atacante é utilizado como índice para acessar o array `emojiList`. Quando um acesso ocorre, o emoji passa estar presente na cache, de tal forma que o próximo acesso vai ter um tempo de resposta inferior. Sabendo disso um atacante poderia constantemente medir o tempo de resposta de cada valor possível do emojiList e quando detectar um tempo de resposta rápido, inferir qual caracter foi utilizado como índice.

    Para essa manipulação de cache, são utilizados duas instruções 

    • RDTSC - Read Time Stamp Counter, que lê um registrador que conta quantos ciclos se passaram desde o boot da máquina. É utilizada como um relógio muito preciso para a medição de tempo
    • CLFLUSH - Permite invalidar uma linha da cache dado um endereço. É utilizada para impedir que a própria medição do tempo de acesso leve a um falso positivo na proxima medição
    • LFENCE - Realiza uma operação de serialização em todos os pedidos de leitura da memória anteriores a instrução LFENCE. Instruções subsequentes a LFENCE podem ser lidas mas elas não serão executadas especulativamente até a finalização da LFENCE.
    • MFENCE - Funciona de forma semelhante a LFENCE mas funciona também para pedidos de escrita.

    Um exemplo de medição seria

    unsigned long probe_timing(char *adrs) {
        volatile unsigned long time;
    
        asm volatile(
            "    mfence             \n"
            "    lfence             \n"
            "    rdtsc              \n"
            "    lfence             \n"
            "    movl %%eax, %%esi  \n"
            "    movl (%1), %%eax   \n"
            "    lfence             \n"
            "    rdtsc              \n"
            "    subl %%esi, %%eax  \n"
            "    clflush 0(%1)      \n"
            : "=a" (time)
            : "c" (adrs)
            : "%esi", "%edx"
        );
        return time;
    }


    Para que um sistema seja vulnerável a esse tipo de ataque é necessário que haja uma clara distinção entre o tempo de resposta de um dado presente apenas na memória e um dado em cache. Para isso é possível testar:
     

    char globalVar[4096]={1,4,7,8,5,9,1};
    
    int main(){
    
      unsigned long t1,t2;
      unsigned long count=0;
      double total_access,total_evict;
    
      total_access=0;
      total_evict=0;
      for(unsigned i=0;i<100;i++){
        if (i%2==0){
          maccess((void *)&globalVar[44]);
        }
        t1=probe_timing((void *)&globalVar[44]);
        count++;
        if (i%2==0){
          printf("time w acess: %lu\n",t1);
          total_access+=(double)t1;
    
        }
        else{
          printf("time no acess: %lu\n",t1);
          total_evict+=(double)t1;
        }
    
      
      }
      printf("avg cached=%lf\n",total_access/50);
      printf("avg evicted=%lf\n",total_evict/50);
    
      return 0;
    ...
    time w acess: 68
    time no acess: 304
    time w acess: 66
    time no acess: 308
    avg cached=68.400000
    avg evicted=347.200000
    
    # head /proc/cpuinfo 
    processor    : 0
    vendor_id    : GenuineIntel
    cpu family    : 6
    model        : 158
    model name    : Intel(R) Core(TM) i5-7500 CPU @ 3.40GHz
    stepping    : 9
    cpu MHz        : 3408.006
    cache size    : 6144 KB


    Botando o tempo de resposta de cada acesso no gráfico, pode-se perceber a diferença do tempo de acesso entre dados presentes na cache e na memória principal e se estabelecer um limite para decidir se o dado esta na cache.

    cache.thumb.png.e1d42ef76ce7803fc23908e69e1c9ca0.png

    Diferença do tempo de resposta da memória para dados em cache


    Z8rsIPS.thumb.png.378b5ae6ba10b3ea452e3b5bf1d9621c.png


    O ataque originalmente foi criado para vazar chaves criptográficas entre usuários usando a biblioteca GnuPG. Posterioremente o exploit foi adotado em outros ataques de micro arquitetura como canal para vazar segredos obtidos de forma especulativa.

    Spectre

    O spectre se baseia no envenenamento de preditores para realizar a execução de código que não deveria ser executado. Dessa forma um atacante consegue enganar a CPU a burlar checagens de limite ou até obter execução de código (espculativa) no processo da vitima. Isso traz implicações sérias de segurança para o isolamento entre processos e sandboxes como navegadores. 

    Variant 1 - Exploiting Conditional Branch Missprediction  

    if (x < array1_size)
        y = array2[array1[x] * 4096];


    O código acima mostra um exemplo de programa vulnerável ao spectre em que o atacante possui controle da variável x.Na primeira linha existe uma checagem do limite do valor x para impedir que o conteúdo do array1 seja acessado fora desse limite o que poderia gerar uma exceção ou um acesso a um dado sensível no espaço de endereço do processo da vítima. A segunda linha consistem em um alvo para um side channel attack. O conteúdo do array1 é utilizado como indice para o array2. É possível mensurar quais elementos do array2 estão em cache através de ataques como flush+reload caso array2 seja compartilhado via COW ou através de outros side channels mais complexos como prime+probe que não necessitam de memória compartilhada. 

    Utilizando apenas o side channel é possível obter o conteúdo do array1, porém o exploit do spectre amplia o escopo do ataque permitindo vazar endereços fora do limite do array.

    Manipulação de preditor

    A primeira linha realiza uma checagem que está passível a ser especulada. Caso o valor de array1_size demore para ser lido, o processador criará um ponto de especulação e tera de decidir se o desvio será tomado. Um atacante com o controle do x pode manipular o preditor para treinar a CPU a sempre executar o bloco dentro da condicional. Supondo um valor de array1_size=10 por exemplo uma sequencia de entradas como: 0,0,0,0,0,0,0,0,20 faria o preditor saturar na posição de desvio não tomado fazendo com que ao tratar a entrada x=20; y = array2[array1[20] * 4096];  seja executado de forma especulativa e o segredo presente na posição 20 seja vazado, o que pode ser outra variável. 

    Exploits dessa categoria são perigosos para navegadores pois podem ser implementados de forma semelhante em javascript. Um código em javascript que seja capaz de ler a memória do próprio processo pode extrair cookies e dados sensíveis de outros domínios.

    hQfbj3D.thumb.png.8a3725aa50aacc0b9e1171734a4b2753.png

    Antes da checagem de limite ser realizada, o preditor de desvio continua a execução no caminho mais provável, levando a uma melhora do desempenho quando correto. Todavia se a checagem do limite for indevidamente predita como verdadeira pode levar um atacante a vazar informação em algumas sitauções. Extraido de: Spectre Attacks: Exploiting Speculative Execution

    É importante notar também que cada núcleo da CPU possui o próprio preditor de desvio, portanto para que esse ataque seja bem sucedido quando executado em processos diferentes eles sejam escalonados para executarem no mesmo núcleo, seja através do escalonador do sistema operacional ou através de mecanismos Simultaneous MultiThreading (SMT).


    V2 Poisoning Indirect Branches

    Conforme já foi abordado, preditores condicionais tem apenas duas opções para escolher sobre o pulo, tomar ou não tomar. Porém existem instruções que permitem pulos para endereços armazenados em variáveis por exemplo que possuem um comportamento um pouco mais complicado de predizer.

    call rbx              ;branch direto
    jump rcx              ;branch direto
    call [rax]            ;branch indireto
    São todas instruções que necessitam do preditor indireto.
    

    Esses tipos de instruções são geradas quando o programa precisa dinamicamente descobrir o que executar. funções que recebem ponteiros para outras funções ou até mesmo Virtual tables podem gerar esse comportamento. Para realizar essa predição a CPU possui um Branch Target Buffer (BTB) que armazena os endereços de origem e destino dos desvios indiretos mais recentes.

    6dIILAX.thumb.png.14bb8d4841dcc69d55e3d1c16309366b.png

    Diagrama do preditor de desvio Incondicional - Extraído de Exploiting Speculative Execution

    Para efetuar o ataque o programa do atacante deve treinar o BTB para que quando a vitima execute o desvio indireto o atacante tenha controle do endereço de destino. A técnica utilizada é muito semelhante a Return Oriented Programing (ROP), pois constrói o código de ataque utilizando pedaços do código da vítima, porém não há nenhuma corrupção de memória envolvida.O único meio de obter informação é através do estado da cache.

    qjyhfv3.thumb.png.24c076bec0a97cc0e6daca12f1b17df8.png

    Layout de um ataque de Spectre V2

    Para performar o ataque o atacante deve alinhar em seu processo o endereço do pulo ou chamada e treinar o preditor para outro endereço. Como entrada para o preditor são utilizados os endereços virtuais do programa, portanto além de ser necessário identificar a existência de um spectre gadget é necessário também saber o seu endereço.

    Exemplo de gadget encontrado na função Sleep em ntdll.dll no Windows

    adc edi,dword ptr [ebx+edx+13BE13BDh]
    adc dl,byte ptr [edi]
    

    Quando os registradores ebx e edi são controlados pelo atacante através de entradas para o programa, o atacante é capaz de fornecer um endereço alvo, tal que ebx = alvo - edx -13BE13BDh e manipular edi para ser a base do array de medição. A primeira instrução executa uma leitura no endereço desejado e a segunda instrução utiliza o segredo lido como endereço para acessar o array. Posteriormente o atacante deve executar um dos ataques de side channel para descobrir qual endereço foi acessado de forma especulativa, vazando assim o dado condido no endereço apontado por alvo

    Mitigações

    Devido ao spectre se basear em padrões específicos de outros programas, a mitigação não é trivial e é usualmente feita de forma individual.

    Prevenção de especulação

    É possível utilizar instruções de serialização ou de bloqueio de especulação como LFENCE antes de trechos de código vulneráveis como branches condicionais ou indiretos. 

    Prevenção do envenenamento de branches

    Alguns mecanismos são capazes de previnir a especulação entre diferentes domínios:

    • Indirect Branch Restricted Speculation (IBRS) impede com que branches de código menos privilegiado afetem branches de código de maior privilégio;
    • Single Thread Indirect Branch Prediction (STIBP) evita que códigos executados no mesmo núcleo e em threads diferentes (exemplo hyperthreading) compartilhem as mesmas predições;
    • Indirect Branch Predictor Barrier (IBPB) permite colocar barreiras que impedem com que o estado do BTB afetem a próxima execução (através de flush do BTB por exemplo);
    • Retpotline substitui as chamadas indiretas por instruções de retorno, e forçam com que o endereço seja especulado para um endereço seguro.

    Meltdown

    O Meltdown ocorre devido ao tempo de resposta que uma exeção leva até que a execução do processo seja suspensa, ou a exceção seja tratada. Nesse período, o programa continua a executar de forma fora de ordem e/ou especulativa, mesmo após a ocorrência de uma exceção. O meltdown ameaça a barreiras de segurança sendo capaz de ler memória de outros processos, kernel e até memória de outros usuários em ambientes virtualizados em nuvem.

    Mapeamento de memória

    O espaço de endereçamento de um processo em execução é dividido em várias seções, cada uma contendo um ou mais páginas. 

    • Texto -  Estão presentes as instruções geradas a partir de funções, em resumo é o código do programa possui em geral permissões de leitura e execução;
    • Data - Utilizada para variáveis globais já inicializadas;
    • BSS - Contem as variáveis globais não inicializadas que são portanto criadas com o valor 0;
    • Heap - Armazena as variáveis criadas dinamicamente, como a heap possui tamanho dinâmico;
    • Stack - Guarda as variáveis de escopo local, como variáveis de funções, bem como endereços de retornos. Data, heap, BSS e stack possuem geralmente permissão de leitura e escrita;
    • Kernel - O kernel é mapeado em todos os processos em execução. Páginas de kernel possuem um bit indicando que não são acessíveis em modo usuário, portanto um acesso a essa região provoca um segfault.

    eZHjlE0.thumb.png.f84a79a0cb5e4f04232a8d002194fcb2.png

    Embora seja um pouco contraintuitivo, o kernel é mapeado como área do processo por uma questão de performance. Conforme foi visto anteriormente, durante toda troca de contexto é necessário limpar o TLB e ler novamente a tabela de paginação, o que leva tempo e traz um impacto negativo na performance, sobretudo se um programa realiza muitas chamadas de sistema operacional (diversas leituras de arquivo por exemplo), o que força a troca de contexto com maior frequência. Para reduzir esse efeito o kernel é mapeado no espaço de endereçamento virtual do processo, dessa forma não é necessário realizar o flush na TLB.

    Exceções e execução fora de ordem 

    No exemplo abaixo a primeira linha provoca uma exceção ao ler um endereço de memória que não possui permissão de leitura. Isso fará com que o programa seja terminado e portanto a segunda linha deveria ser incapaz de executar. Porém devido a forte característica de execução fora de ordem do processador, é possível que antes do controle ser passado ao Exception handler, as instruções subsequentes possam ser executadas provocando alteração de estado na micro arquitetura (ex cache), apesar de seus resultados nunca serem resgatados.

    raise_exception();
    access(probe_array[data * 4096]);
    

     

    jTcyoS0.png.c3446e61595dc2b546d10b8800756113.png

    Fluxo de execução após uma exceção. Extraido de Meltdown: Reading Kernel Memory from User Space

    Apesar de as instruções serem executadas de forma transiente, o programa ainda está destinado a terminar. Portanto é necessário ou tratar a excessão ou impedir que ela aconteça em primeiro lugar. 

    Tratamento de exceção

    O caso mais simples de tratameto de exceção é através da execução de um fork logo antes do acesso que gera o seg fault. Dessa forma o processo filho realiza a execução transiente, passando o segredo através de alterações do estado da cache para o processo pai.

    char readByte(unsigned char *addr){
      volatile char tmp;
      if(fork()){
        readSideChannel();
      }
      else{
        tmp = probe[(*addr)*4096];
      }
    }


    O problema ao utilizar fork como tratamento de exceção é o custo de criar um novo processo para a tentativa de leitura de um byte. Uma alternativa mais performática seria utilizar a syscall sys_rt_sigaction para instalar um exception handler que permita a continuação do programa mesmo após a ocorrência de um segfault. No exemplo abaixo, o acesso ao endereço 0 é capturado pelo handler instalado no programa.`

     

    #include <stdio.h>
    #define __USE_GNU
    #include <ucontext.h>
    #include <signal.h>
    
    void segFaultHandler(int signum, siginfo_t* ignored, void* context) {
      ((ucontext_t*)context)->uc_mcontext.gregs[REG_RIP]++;
      printf("Exception captured\n");
    }
    int main(){
        struct sigaction sigstruct;
        sigstruct.sa_handler = SIG_DFL ;
        sigstruct.sa_sigaction = segFaultHandler;
        sigstruct.sa_flags = SA_SIGINFO;
        sigaction(SIGSEGV, &sigstruct, NULL);
        int a =0;
        int b = *(int *)a;
        printf("finished execution\n");
    }
    
    $./sig
    Exception captured
    Exception captured
    finished execution



    Supressão de exceção

    Uma outra alternativa para evitar a finalização do processo é impedir que a exceção seja provocada em primeiro lugar. Utilizando uma técnica muito semelhante a vista na variante 1 do spectre, é possível induzir a CPU a acessar especulativamente o endereço de kernel através de uma perdição incorreta, dessa forma a exceção nunca será gerada.

     

    //adaptação do Spectre v1 para Metldown com supressão de exceção
    if (x < array1_size)
        y = array2[array1[kernel_offset] * 4096];


    Leitura de memória de outros processos

    Para que o kernel seja capaz de realizar operações como copy_from_user é conveniente que toda a memória física seja mapeada no espaço de endereçamento do kernel.

    Aj9z0eM.thumb.png.6c361a8ce43435f4e86577222aa552a4.png

    Toda a memória física esta mapeada no kernel. A seção em azul está mapeada tanto acessivel no espaço do usuário quanto no kernel através de mapeamentp direto. Extraído de Meltdown: Reading Kernel Memory from User Space

    Portanto um ataque que seja capaz de ler memória do kernel, ao iterar pelo espaço de usuário do kernel eventualmente lê a memória dos demais processos em execução.

    Mitigações

    Devido a vulnerabilidade se encontrar no comportamento de execução fora de ordem do processador as mitigações não são triviais, embora sejam mais efetivas que o spectre, devido ao comportamento específico de ataque ao kernel do spectre.

    KASLR

    De forma semelhante ao Address Space Layout Randomization (ASLR) disponível para modo de usuário, o kernel possui o Kernel Address Space Layout Randomization e serve como mitigação para ataques de corrupção de memória. Embora o Meltdown não se baseia nessa classe de ataques, ao randomizar o endereço base do kernel, o processo de leitura é dificultado. Todavia outras classes de ataque são capazes de revelar esse endereço, como por exemplo colisões de Branch target buffers, conforme descrito por Jump over ASLR.

    KPTI

    Kernel Page Table Isolation opera em cima da quantidade de dados que pode ser extraida utilizando o ataque. Quando a mitigação é implementada o kernel passa a gerenciar dois conjuntos de páginas. A parte do kernel mapeada no espaço de endereçamento do usuário é restrita apenas a funcionalidade mínima necessária como executar syscalls e exceções. O segundo conjunto contém além das páginas do usuário todo o mapeamento da memória fisica e pode ser utilizado para operações como copy_from_user. Caso seja necessário, o kernel deve trocar de espaço de endereçamento para o conjunto contendo o kernel completo.

    Bibliografia

    Flush + Reload https://eprint.iacr.org/2013/448.pdf
    Spectre https://spectreattack.com/spectre.pdf
    MDS attacks https://mdsattacks.com/
    Meltdown https://meltdownattack.com/meltdown.pdf
    RSA power analys https://www.youtube.com/watch?v=bFfyROX7V0s
    Linux memory management https://jasoncc.github.io/kernel/jasonc-mm-x86.html
    Sigaction https://man7.org/linux/man-pages/man2/sigaction.2.html
    Tabela de paginação https://www.kernel.org/doc/gorman/html/understand/understand006.html
    Jump over ASLR http://www.eecs.umich.edu/courses/eecs573/slides/38 - Secure and Bug-Free Systems.pdf
    PTI https://www.kernel.org/doc/html/latest/x86/pti.html
    rhme CTF https://github.com/Riscure/Rhme-2016
    Algumas provas de conceito https://github.com/Jos3Luiz/hackeando-cpus
    Computer Organization and Design RISC-V edition


    • Curtir 1
    • l33t 1
     Share


    User Feedback

    Join the conversation

    You can post now and register later. If you have an account, sign in now to post with your account.
    Note: Your post will require moderator approval before it will be visible.

    Guest

    • This will not be shown to other users.
    • Add a review...

      ×   Pasted as rich text.   Paste as plain text instead

        Only 75 emoji are allowed.

      ×   Your link has been automatically embedded.   Display as a link instead

      ×   Your previous content has been restored.   Clear editor

      ×   You cannot paste images directly. Upload or insert images from URL.


    Felipe.Silva

       2 of 2 members found this review helpful 2 / 2 members

    Muito bom.

    Link to review
    Share on other sites


  • Similar Content

    • By c4v0k
      Continuando a série de artigos com foco em criptografia, hoje veremos um dos primeiros algoritmos de chave assimétrica, o RSA, que permite estabelecer uma conexão segura entre duas entidades sem contato prévio entre elas.
      Antes de prosseguir, vale relembrar boas práticas apresentadas no artigo do Chinchila: nunca implemente um esquema criptográfico, utilize bibliotecas reconhecidas pela comunidade, preferencialmente de código aberto.
      Outro ponto importante é que o RSA parece simples em termos matemáticos, mas é fácil de ser utilizado de maneira incorreta na construção de protocolos e/ou implementado de forma a inserir várias vulnerabilidades. O algoritmo básico apresentado aqui não garante proteção contra a maioria de tais vulnerabilidades. Por fim, serão apresentadas simplificações no algoritmo e código em Python para auxiliar a compreensão.
       
      Criptografia de chave assimétrica
      Como apresentado no primeiro artigo de criptografia, algoritmos de chave assimétrica possuem 2 chaves: uma chave pública e uma chave privada (secreta). O uso correto de ambas as chaves permite que duas pessoas estabeleçam um canal de comunicação seguro sem a necessidade de terem combinado chaves anteriormente.
      O funcionamento do algoritmo é análogo a uma caixa de correio como a da foto abaixo. Vamos considerar que a comunicação segura é estabelecida entre a pessoa que envia uma carta e o correio. Quando a pessoa vai enviar a carta, basta deixá-la na caixa. Para manter a analogia mais precisa, vamos considerar que existe uma chave disponível junto à caixa de correio e que ela deve ser utilizada para depositar a carta na caixa. Qualquer usuário pode ter acesso a chave para depositar cartas na caixa, por isso tal chave é denominada chave pública.

      Caixa de correio - Fonte: Wikipedia
      Apenas o Correio possui a chave necessária para abrir a caixa, portanto sabemos que somente ele pode receber as cartas depositadas na caixa. Esta chave é denominada chave privada.
      Dessa forma, o usuário pode enviar mensagens que somente o correio pode ler. Isso ocorre porque todas as mensagens deixadas na caixa só podem ser recebidas pelo detentor da chave privada, ou seja, o próprio correio.
      Um dos primeiros algoritmos capazes de proporcionar a funcionalidade descrita é o RSA.
       
      Aritmética modular
      A aritmética modular é feita apenas com números inteiros. Utilizando mais uma analogia, a aritmética modular é próxima ao funcionamento de um relógio. O ponteiro das horas de um relógio tem funcionamento cíclico, nunca é maior que 11 e menor que 0 (considerando que 12h = 0h). Sempre que o relógio ultrapassa 11h, o relógio volta a contar a partir de 0h. O mesmo vale para somar horas: somando 10h com 4h, o resultado será 2h. Nesse caso, diz-se que as operações são feitas "módulo 12", também representadas por "8 + 6 = 2 mod 12". 
      Computar o valor de a módulo b pode ser interpretada também como calcular o resto da divisão de a por b, por exemplo 23 = 2 mod 7, porque 23 = 7\*3 + 2, 16 mod 4 = 0, porque 16 = 4\*4 + 0
      Em Python, o operador "%" é utilizado para computar a operação modular:
      print(23%7) Além da soma, também existem as operações de multiplicação e potenciação modular. Essas operações são computadas assim como na aritmética regular. Em seguida, é calculado o resto da divisão pelo valor do módulo, por exemplo:
      3\*7 mod 5 -> 3\*7 = 21 = 4\*5+1 = 1 mod 5 
      3^5 mod 7 -> 3^5 = 243 = 34\*7 + 5 = 5 mod 7
      print(3*7%5, pow(3,5,7))  # no Python, pow(a,b,c) = (a**b)%c  
      O RSA
      O algoritmo RSA utiliza a potenciação modular, onde os expoentes são as chaves. Conforme a analogia da caixa de correio, existe uma chave pública, representada por e, e uma chave privada (secreta), representada por d. O valor do módulo é representado por N e é calculado como o produto de dois inteiros primos, representados por p e q. A segurança do algoritmo depende, entre outros fatores que não serão apresentados aqui, do tamanho de p e q, sendo recomendado usar primos de no mínimo 1024 bits.
      from random import randint from sympy import isprime def random_prime(lower_bound, upper_bound):     while True:         r = randint(lower_bound, upper_bound)         if isprime(r):             return r  p = random_prime(2**512, 2**513) q = random_prime(2**512, 2**513) N = p*q print(p, q, N) As chaves pública e privada devem ser calculadas de forma que uma mensagem encriptada pela chave pública pode ser desencriptada somente com o conhecimento da chave privada. Em outro artigo será apresentado o porque de calcular as chaves conforme o código abaixo.
      phi = (p-1)*(q-1) e = 17 d = pow(e, -1, phi) print(e, d) Consideramos que a mensagem a ser enviada seja "artigo_RSA_mente_binaria". Ela deve ser convertida para uma representação em números inteiros com a função bytes_to_long da biblioteca Pycryptodome:
      from Crypto.Util.number import long_to_bytes, bytes_to_long msg = b"artigo_RSA_mente_binaria" m = bytes_to_long(msg) print(m) A encriptação da mensagem consiste em elevar o valor inteiro da mensagem à chave pública e:
      ciphertext = pow(m, e, N) print(ciphertext) print(long_to_bytes(ciphertext)) É possível ver que, após a encriptação, é difícil ver qualquer relação entre a mensagem original e a mensagem encriptada.
      Para que o destinatário recupere a mensagem, basta que ele faça o mesmo procedimento da encriptação, mas utilizando o expoente secreto d:
      plaintext = pow(ciphertext, d, N) print(plaintext) print(long_to_bytes(plaintext))  
      Importante
      Esse artigo apresenta apenas uma introdução ao RSA, diversas partes importantes foram omitidas para facilitar a compreensão. Existem várias vulnerabilidades inerentes a uma implementação básica como essa. Uma boa forma de estudar e compreender melhor esse algoritmo e suas vulnerabilidades é analisar e implementar estes ataques. No ASIS CTF Quals 2021 havia um chall que envolvia uma versão modificada do RSA, mas suscetível às mesmas vulnerabilidades. O write-up do ELT pode ser encontrado aqui. Para saber mais, recomendo os challs do Cryptohack e as próximas postagens aqui no site.
      Bom estudo, se tiver dúvidas e/ou sugestões deixe nos comentário abaixo, até a próxima!

      Código
      from random import randint from sympy import isprime from Crypto.Util.number import long_to_bytes, bytes_to_long def random_prime(lower_bound, upper_bound):     while True:         r = randint(lower_bound, upper_bound)         if isprime(r):             return r  p = random_prime(2**512, 2**513) q = random_prime(2**512, 2**513) N = p*q print(p, q, N) phi = (p-1)*(q-1) e = 17 d = pow(e, -1, phi) print(e, d) msg = b"artigo_RSA_mente_binaria" m = bytes_to_long(msg) print(m) ciphertext = pow(m, e, N) print(ciphertext) print(long_to_bytes(ciphertext)) plaintext = pow(ciphertext, d, N) print(plaintext) print(long_to_bytes(plaintext))
    • By Julliana Bauer
      Em nosso último artigo, falamos sobre o treinamento online e gratuito que a Conviso disponibiliza em seu canal de YouTube, o AppSec Starter. E como desenvolvimento seguro é um tema sobre o qual muitos de vocês têm interesse, hoje reunimos algumas dicas de nossos especialistas em AppSec para quem deseja entender ainda mais sobre a importância do desenvolvimento seguro - e aplicá-lo no dia a dia. 
      Mas antes, vamos recapitular um pouco sobre o que é Desenvolvimento Seguro em segurança de aplicações: o termo refere-se a implementar as  iniciativas de segurança em todos os estágios do desenvolvimento - ou seja, desde o início do processo. 
      Afinal, em um contexto onde cada vez mais indivíduos mal-intencionados buscam brechas para obter dados por meio de vulnerabilidades nas aplicações, o cuidado com a segurança deve passar por todas as etapas de criação de um software.
      Você pode ler mais sobre isso por aqui.
      Agora vamos às dicas:  
      1 - Passe a encarar o desenvolvimento seguro como uma cultura
      Desenvolvimento Seguro é uma questão cultural, e exige, portanto, mais do que realizar estudos esporádicos. É necessário “virar a chave” e transformá-lo em um mindset. É uma mudança que envolve 15 práticas, e não apenas os testes, ao contrário do que muitos pensam.
      Mas como colocar isso em prática? Uma pessoa profissional de desenvolvimento, por exemplo, deve ir além da linguagem de programação e buscar aprender sobre como desenvolver códigos seguros desde sua concepção. 
      Mas vai muito além disso: é imprescindível o foco no processo, prática e desenvolvimento pessoal por parte de todos os envolvidos. É um processo de aprendizado contínuo e que exige disciplina -  mas com resultados positivos no final do caminho.
      Tudo isso faz parte de viver e praticar o desenvolvimento seguro. Leia mais sobre este tema neste artigo.
      2 - Familiarize-se com a OWASP
      Você já ouviu falar da OWASP? Esta sigla é a abreviação para “Open Web Application Security Project” e refere-se a uma entidade sem fins lucrativos e com reconhecimento internacional, que atua com foco na colaboração para o fortalecimento da segurança de softwares em todo o mundo. 
      Referência para quem quer estudar mais sobre o segurança de aplicações - ou até mesmo ingressar em uma carreira em na área - a OWASP é recheada de documentações para quem quer se inteirar mais sobre o tema. 
      Além disso, ela promove eventos - tanto globais quanto regionais. Os regionais ficam a cargo de cada “capítulo” da Organização, que é como são chamadas as divisões locais. Nove dos 270 capítulos da OWASP ficam no Brasil, portanto, procure o mais perto de você. Certamente será uma oportunidade de interagir com outros profissionais, aumentando sua rede de contatos e também a troca de conhecimento.
      A OWASP mantém ainda uma lista com as 10 principais categorias de riscos em aplicações Web, juntamente com os métodos mais eficazes para lidar com eles. Aqui você encontra um material sobre a última atualização destes riscos, que aconteceu recentemente, em 2021.
      3 - Participe de comunidades online sobre o tema 
      Busque comunidades online sobre o tema, para estar em contato com quem já vive o Desenvolvimento Seguro no dia a dia. Familiarize-se com as  principais referências sobre o tema e siga-os em suas redes sociais, participe dos webinars gratuitos que oferecem. 
      A Conviso, por exemplo, lança quinzenalmente o Code Challenge em sua conta no Twitter, onde especialistas do time de Pentest as a Service criam desafios para que a comunidade se engaje. Já no Slack, existe também uma comunidade focada em DevSecOps, onde profissionais de todo o mundo têm abertura para conversar sobre o tema. 
      4 - Entenda que os estudos e treinamentos precisam ser contínuos
      Sim, os estudos são essenciais. Afinal, apenas com conhecimento é que a jornada de desenvolvimento seguro ficará com pilares sólidos. Se você já trabalha com desenvolvimento, ou mesmo com gestão nesta área, é essencial entender a importância de promover treinamentos relacionados aos temas de segurança para todo o time envolvido no projeto. 
      E estes treinamentos não devem ser realizados pontualmente, e sim, constantemente, para acompanhar a evolução do mercado. E neste processo, o papel do Security Champion - já escrevemos sobre este tema por aqui - é essencial.
      Inscreva-se na Newsletter da Conviso para receber informações sobre AppSec e Desenvolvimento Seguro.
    • By Bruna Chieco
      Não conseguir descansar a mente ou se desligar do trabalho, se sentir mais acelerado, não conseguir dormir, pensar somente em trabalhar… esses são alguns dos sintomas detectados em alguém que está entrando em um processo de Síndrome de Burnout. Os sintomas básicos são um estresse constante, o pensamento acelerado, um esgotamento mental, e, mesmo quando a pessoa não está fazendo nada, se sente cansada. 
      Segundo reportagem da Agência Brasil, a síndrome foi incluída na Classificação Internacional de Doenças da Organização Mundial da Saúde (OMS) em 2019. A matéria traz ainda dados da OMS, que apontam que, no Brasil, 11,5 milhões de pessoas sofrem com depressão. A Síndrome de Burnout vem sendo cada vez mais comum dentro das empresas, e profissionais têm pedido afastamento de seus empregos por conta de doenças mentais relacionadas ao trabalho. 
      Na área de segurança, a pressão do dia a dia pode agravar essa situação. Muitas vezes os profissionais estão enfrentando um processo de estresse alto que pode levar a consequências físicas mais graves e nem percebem, e é importante detectar o quanto antes se essa rotina está afetando a saúde – e evitar que a situação piore. "A área de segurança tem, geralmente, uma carga muito intensa de trabalho. Não existem 8 horas de trabalhos diários, 40 horas semanais, até porque a maior parte das mudanças são feitas em janelas de atendimento durante o dia e mudanças à noite, quando há disponibilidade para alterações nos sistemas sem impacto ao usuário final. O que torna o trabalho com segurança da informação e privacidade tenso é toda a pressão que a responsabilidade da atividade traz para o dia a dia, principalmente pelo vínculo com a saúde do negócio", explica Eva Pereira, CMO, Head Security Awareness e Responsabilidade Social da IBLISS Digital Security e Team Coach de Alianças, Marketing e Privacidade da WOMCY. 
      Eva tem mais de 20 anos de experiência no mercado, atuando com segurança desde 1997. "Sempre trabalhei em média 17 horas por dia. Em um somatório de muitos anos, isso veio plantando uma sementinha que não foi legal", conta. "Quando a gente é muito jovem e tem muita saúde, acha que virar uma ou duas noites sem dormir não tem problema, mas fazer isso durante anos tem uma consequência", alerta.
      Ela diz que a tensão de manter um ambiente seguro e defender um projeto em meio a tantos outros em que a companhia deve tratar, acumula uma dinâmica em uma pessoa que sofre pressão por entregar resultados e acaba gerando uma falta de equilíbrio entre bem-estar e vida social. "Você vai se consumindo no trabalho. Tudo que é excesso traz consequências. Isso formou uma bola de neve, além do acúmulo de funções ou ter que dar conta de tudo, a falta de ir a um parque, andar descalça, um convívio social, foi se somando", destaca. 

      "Você vai se consumindo no trabalho. Tudo que é excesso traz consequências" - Eva Pereira
      Um dia Eva se deu conta que, além de não conseguir dormir, pois o corpo estava cansado e a mente não silenciava, a questão física ficou mais evidente. "Eu tive episódios de dores de cabeça por mais de 15 dias". Uma massagista da própria empresa em que trabalhava na época a alertou: "Toma cuidado, seu corpo cansou de te avisar que algo não está bem". No mesmo dia, Eva foi parar no hospital. "Eu apaguei, não estava falando coisa com coisa, estava confusa, delirando. Fui parar em um hospital, onde soube que estava tendo um princípio de AVC".
      Eva conta que não conseguia produzir muito mais depois disso. "É como se eu quisesse passar a quinta marcha na estrada, o carro pedia, mas eu não conseguia. Perdi o domínio do meu corpo, ele precisava descansar", diz Eva, que iniciou um tratamento natural, retomando suas funções aos poucos ao longo dos anos. "Precisei trocar de emprego, dar uma reviravolta na minha vida e buscar o natural para equilibrar minha rotina. Foram quase 2 anos para retomar à normalidade da capacidade que eu tinha de agilidade".
      Demanda diária – Uma pesquisa do Chartered Institute of Information Security (CIISec) sobre profissionais de segurança aponta que o estresse no local de trabalho pode ser grande, e o número de horas de trabalho nesta área aumentou durante a pandemia de Covid-19. Em média, os profissionais de segurança trabalham 42,5 horas por semana, mas alguns trabalham até 90 horas semanais, o que é preocupante, considerando que o esgotamento é destacado como um grande problema da profissão pelo relatório.
      "Quem escolheu a área de tecnologia já sabia onde estava se metendo. Durante a faculdade já começamos a ter essa visão, ou logo nos primeiros meses de trabalho sabemos que não tem horário, tem uma carga pesada de trabalho, de entrega, de cobrança, de necessidade de se manter atualizado", conta Jorge (nome fictício, pois o profissional preferiu não ser identificado). 
      Com mais de 25 anos dedicados à tecnologia, e desses, pelos menos 17 na área de segurança da informação, Jorge atua como Diretor de Segurança e lida no dia a dia com orçamentos limitados, o que faz com que as escolhas sejam difíceis. "Você dorme com aquilo na cabeça, porque fica ciente que deixou algo descoberto, e isso tira seu sono", destaca. 
      "Você não vai conseguir resolver tudo, não tem super-homem, não tem mulher maravilha.
      A área de segurança não é para heróis", pontua Jorge
      Jorge diz que ao passo em que um atacante vai buscando as brechas e vulnerabilidades, a diversidade de tecnologias e de componentes deixa a empresa cada vez mais exposta. "A transformação digital por si só já te expõe a riscos maiores. Por outro lado, você, como profissional de segurança, precisa viabilizar o negócio e muitas vezes vai dormir com a ciência de que deixou vulnerabilidades descobertas e que alguém pode se aproveitar delas".
      Apesar da pressão diária, o profissional conta que é preciso saber lidar bem com essas adversidades do dia a dia e saber delegar, sem querer carregar tudo nas costas. "Você não vai conseguir resolver tudo, não tem super-homem, não tem mulher maravilha. A área de segurança não é para heróis. É preciso saber dividir para não se sobrecarregar", indica.
      Para quem trabalha na área de segurança, responder a um incidente é um momento estressante de muita pressão. Mas para Anchises Moraes, que é profissional da área de segurança e colaborador do Mente Binária, é possível encarar com mais leveza e uma dose de satisfação. "Para trabalhar na área é preciso ter a ciência de que esse tipo de situação pode acontecer, mas sem que isso te prejudique. É ok também mudar de trabalho se não estiver aguentando a pressão. É preciso priorizar a saúde. Se você não priorizar sua saúde, ninguém vai fazer isso por você", destaca. 
      Primeiros sintomas – "Eu já tinha passado isso uma vez por um afastamento de trabalho quando eu trabalhava em uma grande rede varejista, achando que era um super-herói. Fiquei 80 dias afastado, mas quando fui parar no ambulatório da empresa, e depois no hospital, eu estava em um estado muito crítico", diz Jorge.
      Esse episódio o ajudou, no ano passado, a detectar alguns comportamentos e sintomas parecidos com os que teve naquela época. "Comecei a perceber, em junho, que as coisas estavam estranhas, mas achei que era por conta da pandemia, já que todo muito estava impactado de alguma forma". Ele diz que esse período de isolamento social agravou um pouco mais a situação, por conta da falta de um contato mais próximo das pessoas. "Apesar de ser um cara de tecnologia, eu gosto mais de gente do que de máquina. E eu comecei a sentir falta de happy hour, almoço, olho no olho, uma conversa de corredor. Achei que estava mal por causa disso, e deixei passar". 
      O primeiro sinal de alerta foi quando Jorge chorou no final de uma reunião de equipe. "Fiquei com vergonha, fechei a câmera, e algumas pessoas perceberam, mandaram mensagem. Mas isso já foi um sinal de atenção. Em agosto, eu percebi outros sintomas, como não querer sair da cama, tomar banho, comer... a cabeça estava longe, eu não lembrava o que tinha sido conversado nas reuniões, minha produtividade caiu demais, e comecei a esquecer coisas importantes. Isso impactou minha rotina", relata Jorge. 
      Ele decidiu marcar uma consulta com um psicólogo. Mas após um dia muito intenso de trabalho, Jorge percebeu que realmente precisava de uma pausa. "Um pouco antes da consulta, estourou uma crise em um dos clientes, um incidente grave de segurança. Trabalhei direto, fazendo poucas pausas. Na segunda-feira de manhã, em uma reunião para falar sobre o problema, eu desabei a chorar e acabei desabafando com meu colega. No mesmo dia, o psicólogo me encaminhou ao psiquiatra".
      Jorge teve que lidar ainda com mais um fator, que é o medo e a vergonha de se expor em relação a essa dificuldade. "Eu demorei mais de um mês para aceitar que estava doente. Mesmo com o diagnóstico, eu só comentei sobre isso com minha esposa e com o RH da empresa. Demorei para falar sobre isso com as pessoas mais próximas, que foram poucas, e só depois de uns 3 ou 4 meses que comecei a falar mais abertamente. Eu tinha vergonha e medo dessa exposição. Depois eu entendi que todo mundo tem suas vulnerabilidade e lidar com isso é um sinal de força, e não de fraqueza". 
      Segundo Fabiane de Faria, psicóloga com especialização em Terapia Cognitivo Comportamental, é comum ter medo de falar sobre o assunto, pois existe um estigma quando se fala em doenças psiquiátricas. "Parece que isso demonstra uma certa fraqueza, erroneamente, ou uma certa inabilidade no seu trabalho, que também não tem nada a ver". 
      Pandemia – "Muitas pessoas que já estavam tendenciosas a ter Burnout acabaram tendo porque a pandemia foi uma aceleração, um caminho para tudo aquilo que nos dificultava", diz Fabiane. A psicóloga destaca que para quem tinha tendência a ter ansiedade ou a deprimir, a pandemia serviu como um gatilho para iniciar uma série de movimentos. 
      O especialista em segurança da informação e Head de Resposta a Incidentes na Tempest, Thiago Araújo, notou que nesse período de home office imposto por conta do isolamento social estava trabalhando muito mais do que em um ambiente normal do dia a dia do escritório. "Em casa ficamos sentados muitas horas trabalhando, então comecei a ter problemas físicos na coluna, na perna, e problemas de ansiedade, além de uma fadiga extrema e dificuldade em me concentrar, insônia... Isso foi piorando ao longo da pandemia, e nossa área vem trabalhando muito por conta de um aumento de incidentes", conta. 

      "Hoje eu tento não pegar muitos trabalhos estressantes" - Thiago Araújo
      Em uma semana estressante de escrever relatórios, um cliente acionou a equipe de Thiago na madrugada, e ele começou a trabalhar mesmo não dormindo bem. "Nesse dia eu entrei em desespero, em pânico, eu fiquei paralisado. Minha esposa viu e me levou pra cama. No dia seguinte eu liguei para a psicanalista e avisei os colegas que eu não conseguiria mais trabalhar no caso. Eles entenderam perfeitamente", diz. 
      Thiago relata que não havia ocorrido nada parecido com ele anteriormente, apesar de ter passado por alguns momentos de ansiedade. "Passei o ano de 2020 todo com esses episódios até esse colapso. A gente acaba não percebendo, acha que no dia seguinte estará tudo bem, mas só piora". 
      Ele conta que teve apoio de sua empresa e não ficou afastado legalmente, mas saiu das tarefas mais estressantes de seu trabalho. "Continuei trabalhando normalmente, gerindo a equipe, mas fora do cenário, sem pegar casos extremos. Hoje eu tento não pegar muitos trabalhos estressantes, vou dividindo para a equipe, e chega um momento em que eles trabalham sozinhos. Depois eu ajudo em um relatório, ou no entendimento de uma evidência, tratamento de um caso".
      Papel da empresa – Trazer uma consciência mais humana ao trabalho é resultado de um processo de recuperação, conta Eva. "Eu estudo comportamento humano hoje, e vejo que quanto mais humanizado é o contato com o profissional, melhor resultado eu tenho dele. E o que as empresas precisam não é só cobrar metas, e sim dar voz de uma forma estruturada para que seus colaboradores se expressem, trazendo sua essência e diversidade de opiniões. Se a empresa faz isso, ela tem muito mais futuro e consegue crescer mais forte, além de colaboradores felizes", diz. 
      Eva ressalta a importância de estar em um ambiente de trabalho onde o colaborador é reconhecido dentro de sua importância. "É importante entender que se chegamos em um estado desse, precisamos de apoio de empresas com propósito, que se preocupam efetivamente com o colaborador, e não com um número apenas. As empresas são feitas por pessoas. É preciso proporcionar uma qualidade de vida para que a situação não chegue num ponto de insegurança mental. E se você chegar nesse ponto, que a empresa possa te apoiar na sua recuperação, pois isso é fundamental". 
      Em seu momento de crise, Jorge se sentiu apoiado por sua empresa. "A empresa continuou me pagando integralmente, colocou outra psicóloga à disposição, com quem eu conversava periodicamente, e ficou focada na minha recuperação. Toda vez que eu ensaiava voltar, eles falavam pra eu voltar bem. Na minha experiência, a empresa foi super diferenciada. E não sei se essa é a realidade da maioria delas", destaca. 
      Tratamentos e recuperação – Tratamento é a primeira coisa, o melhor e inevitável caminho para quem quer melhorar, diz a psicóloga Fabiane. Segundo ela, é importante também entender os limites, pois não é falta de vontade, não é desmotivação, nem desinteresse da pessoa que está passando por essa situação. "Na depressão, realmente tem dias que a gente fica muito para baixo, sem vontade de fazer nada, com o humor deprimido. Conseguir entender as nossas limitações, aceitar esses dias, não deixar que eles nos deixem piores e tentar recomeçar é essencial", diz. 
       
      Procurar não ficar focado somente no trabalho também faz parte de um processo de recuperação ou prevenção ao Burnout, diz a psicóloga. "O home office tem deixado as pessoas 100% focadas no trabalho, o tempo todo trabalhando, ligado no celular, no e-mail. Tentar focar em outras coisas, ter uma rotina de trabalho com horários certos, dividir quais são os horários de comer, estar com a família, ter tempo para você, para a sua atividade física… esse é o principal caminho para manter uma mente sã e tranquila", indica.

      "Temos que tomar cuidado, e se não buscarmos o autocontrole, o corpo vai reagir em algum momento" - Anchises Moraes
      Anchises diz que adotou um estilo de vida mais leve e saudável após passar por alguns episódios de estresse durante a pandemia. "Já tive vários momentos que impactaram minha saúde. Meu corpo reagiu e isso foi um sinal de alerta. Temos que tomar cuidado, e se não buscarmos o autocontrole, o corpo vai reagir em algum momento. Pode ser de forma branda ou mais grave. No meu caso, todas as vezes que tive essa percepção tentei desacelerar, diminuir meu estresse com meu trabalho para voltar a ter um equilíbrio", conta.
      Ele ressalta que, na época de pandemia, ao mesmo tempo que não sofria tanto por estar acostumado com o trabalho remoto e ter consciência que é uma fase passageira, chegou um momento que ficou exausto de tanto ficar em casa. "A maioria das minhas opções tradicionais de lazer foram cerceadas. Fiquei limitado. E por isso decidi, este ano, fazer um curso de francês para aprender a relaxar e me desconectar do trabalho, e adotei dois gatinhos para ter uma companhia", diz Anchises.
      Foi isso que Eva também fez após o episódio grave de Burnout relatado anteriormente. Hoje ela aprendeu a silenciar sua mente e a equilibrar trabalho com bem-estar e vida pessoal. Ela relata que na época de sua crise, a vontade foi de abandonar a carreira e os anos de trabalho com segurança. "Quando eu parei para pensar melhor, eu vi que não foi a tecnologia que me fez passar por isso, e sim a ausência de segurança mental para conseguir lidar com a situação no momento, por excesso de pressão e falta de apoio. Por que eu sempre acordei todos os dias? Para, de alguma forma, trabalhar por uma sociedade mais segura. E se eu não me sinto segura em levar meu propósito para os lugares, eu preciso procurar um lugar onde esse propósito se encaixe", destaca Eva. "Meu propósito de vida hoje é cuidar de mim".
      Jorge também conta que está mais focado em cuidar do corpo e da mente, fazendo exercício físico e aulas de violão junto com seu filho. "Mudei a alimentação, comecei a fazer atividades que me dão prazer. E acredito que o autoconhecimento é importante para qualquer área da vida, não somente para quem está em depressão e Burnout", diz. Da mesma forma, Thiago relata que hoje está bem melhor, fazendo terapia, e indica às pessoas a buscarem ajuda antes do corpo entrar em colapso. "Não tenha vergonha", diz.
    • By Bruna Chieco
      Recentemente nós fizemos uma pesquisa com o público do Mente Binária para conhecer melhor a nossa comunidade. Os resultados mostraram que, entre os 529 respondentes, a maioria (49,1%) é profissional da área de segurança da informação, enquanto 32,9% são estudantes e 10,8% são entusiastas e curiosos sobre a área. O público está bem dividido entre iniciante, júnior, pleno e sênior, e esse é um ponto importante para o projeto, já que o nosso objetivo é levar sempre conteúdo aderente ao que a comunidade precisa, em todos os momentos da carreira. "O objetivo da pesquisa foi entender o que o nosso público sente mais falta. A ideia é que os esforços sejam concentrados em projetos que atendam a maior demanda que a gente identificou nos resultados", diz Fernando Mercês, fundador do Mente Binária. 
      Apesar de 59,4% dos respondentes afirmarem que possuem uma formação em faculdade, grande parte (50,9%) também respondeu ser autodidata. E entre as principais formas de aprendizagem apontadas pelos respondentes da pesquisa estão os cursos e vídeos, preferidos por 85,1% e 83,7%, respectivamente, além de livros (73,9%) e artigos (68,1%). Esse é mais um tópico que demonstra a necessidade de que haja um conteúdo mais específico sobre a área, livremente disponível online para que a comunidade possa sempre se atualizar e se especializar. 
      Tem muita gente que já trabalha com segurança da informação entre os respondentes (31,%), mas também temos uma grande parte do público composta por pessoas que querem começar a atuar na área ou que tem curiosidade/interesse no assunto (25,4%).

      Entre os temas da área que o nosso público respondeu ter mais interesse está engenharia reversa (65,8%); segurança de redes (64,5%); pentest (64,5%); análise de malware (59,5%); e conhecer técnicas de ataques (51,4%). "Me chamou atenção que existe um interesse muito grande em pentest e na área de segurança ofensiva como um todo, e um interesse mais discreto na área de segurança defensiva. Isso é algo que precisa ser explorado", diz Mercês.
      Ele reitera que é preciso desenvolver o interesse das pessoas pela área de segurança defensiva, estimulando o público através de mais conteúdos sobre técnicas de defesa e a carreira nessa área. "Vemos que tem muitas vagas abertas em segurança defensiva, sendo que a maioria das empresas precisam de profissionais de segurança em todas as áreas de trabalho relacionadas à defesa. A galera que trabalha na área ofensiva é importante, pois ela descobre as vulnerabilidades, mas precisamos de pessoas que possam corrigi-las".
      Mercês destacou também o fato de que 40% das pessoas responderam que possuem interesse em desenvolvimento seguro, o que é um percentual bem alto. "Por isso, vamos desenvolver conteúdo nesse sentido. A parceria com a Conviso é uma iniciativa que visa gerar conteúdo técnico nessa área", explica.
      Comunidades e conhecimentos técnicos – Colaborador do Mente Binária e coordenador da pesquisa, Anchises Moraes pontuou que se sentiu impactado e admirado pela quantidade de comunidades que os respondentes participam. "As respostas mostraram uma quantidade muito grande de comunidades que eu nem sabia que existiam. Isso é muito legal, porque cada comunidade representa um pequeno nicho baseado em uma área de conhecimento. E o fato de haver várias comunidades, mais do que imaginamos, é positivo por mostrar que a galera está interagindo entre si, fazendo networking, o que fortalece os profissionais na carreira e ajuda também na busca por empregos", diz.
      Para Anchises, vale destacar também o nível de inglês apontado pelas pessoas da área, que ainda é intermediário e básico para a maioria dos respondentes da pesquisa (40,9% e 33,1%, respectivamente). "Para quem trabalha em tecnologia, o conhecimento de inglês é fundamental para o dia a dia e a carreira", pontua, reiterando que o conhecimento mais avançado no idioma abre portas para a leitura de material novo, atualizado, e acesso a palestras de alta qualidade. "Não temos, na comunidade de segurança da informação, uma produção em português que se compare com o que é produzido em inglês. Se há uma limitação de linguagem, acaba-se perdendo a oportunidade de aprender, de se educar profissionalmente e tecnicamente", explica Anchises. Para Fernando Mercês, esse é um desafio que a comunidade possui e que o Mente Binária vem buscando endereçar. 

      Do ponto de vista profissional, muitas empresas exigem um inglês bom, e para chegar em determinadas empresas ou posição, o profissional deve ser fluente no idioma. "A deficiência no inglês pode ser uma barreira profissional em termos de crescimento de carreira, para ter um cargo de liderança, etc. A maioria da população não fala inglês, então não é vexatório, mas do ponto de vista profissional, para tecnologia e segurança, o domínio do idioma é requisito básico, e o diferencial surge quando a pessoa conhece um outro idioma a mais, como o espanhol, por exemplo", reforça Anchises. 
      Ele diz ainda que o principal objetivo da pesquisa foi conhecer o público para entender se o conteúdo oferecido pelo Mente Binária está adequado à expectativa e identificar zonas de melhoria em termos de abordagens. "Queremos entender como o Mente Binária pode adequar o conteúdo para atender às demandas desse público. Por conta dessa deficiência em inglês, por exemplo, se confirmou a necessidade de oferecer alguma atividade relacionada ao uso do idioma", diz.
      A pesquisa também demonstrou uma grande admiração pelo projeto do Mente Binária. No campo aberto para sugestões, praticamente metade dos comentários foram elogios ao projeto, além das diversas sugestões de conteúdo e projetos que recebemos. Isso nos faz ter certeza de que estamos no caminho certo, e alinhados com a nossa comunidade! 💚

    • By Andre Smaira
      Você está realmente seguro enquanto navega na Internet? E enquanto troca mensagens com os seus amigos? Essas são perguntas cujas respostas infelizmente não são preocupação para a maioria dos usuários da rede mundial de computadores. Vamos descobrir as respostas a elas? E como mudar os seus hábitos para navegar de forma mais segura?
      Nesse artigo vamos estudar um pouco sobre autenticação. Começaremos com uma breve introdução, seguindo com os tipos e níveis de autenticação. Ao final veremos a importância da autenticação de dois fatores (2FA), muito comentada ultimamente como método para se evitarem golpes digitais (muito recorrentes nos últimos anos), e extremamente relevante para qualquer usuário da Internet. Vale a pena dar uma lida para garantir que está seguro! Vamos lá! 
      Definição
      A palavra autenticação tem origem na Grécia e significa algo como "autor real", isto é, a garantia de que quem tenta acessar um determinado sistema é realmente quem o sistema espera que seja. Em outras palavras, é a garantia de que uma entidade é quem diz ser. 

      Fonte: https://www.serpro.gov.br
      Aplicações
      Autenticação é importante em diversas áreas, não somente em segurança da informação como muitos tendem a pensar inicialmente. Em artes, como saber se um quadro é de fato de um determinado pintor? Em antiguidades, como saber se um determinado artefato foi de fato produzido por uma determinada civilização ou numa determinada época? No nosso cotidiano, como saber se um determinado contrato foi assinado pelas partes do mesmo? E finalmente, em segurança da informação, como saber se um usuário é de fato quem diz ser? Ou seja, como garantimos, em qualquer área, que não seremos vítimas de fraude?
      Métodos
      Para quaisquer dessas áreas existem diversos métodos de autenticação. Eles estão divididos em três tipos:
      O primeiro tipo se baseia em confiança numa pessoa específica, geralmente uma pessoa importante em relação ao assunto da autenticação em questão, um especialista na área. A fragilidade desse tipo é a centralização da confiança numa pessoa, que pode errar ou ser corrompida.
      Fonte: https://www.theartnewspaper.com 
      O segundo tipo se baseia em comparação de características da entidade analisada com outra de que se conhece a origem e serve para determinar se ambas tem a mesma precedência. A fragilidade desse processo é que é possível criar uma cópia perfeita, apesar de ser necessário conhecimento especializado para tal. 
      Fonte: https://www.nytimes.com 
      O terceiro tipo se baseia em documentos externos que podem comprovar a precedência da entidade. Esse é o tipo comumente usado em segurança da informação, onde as provas externas são senhas, tokens, etc., mas mesmo assim são apenas indícios de autenticidade, a fragilidade desse tipo é a falsificação desses documentos ou, como no caso de credenciais, o roubo dos mesmos.
      Fonte: http://www.usauthentication.com 
      Fatores
      Com o objetivo de dificultar o comprometimento da autenticidade de serviços digitais, existem três fatores básicos de autenticação que, combinados, reduzem as chances de comprometimento de credenciais. Cada um deles se baseia em o que o usuário deve fornecer para garantir que ele é mesmo quem diz ser:

      Fonte: https://admin.salesforce.com 
      Fator de conhecimento ("o que você sabe"): O usuário deve fornecer alguma informação que teoricamente somente ele sabe, como senhas, PINs, respostas a perguntas de segurança, etc. Senhas, por exemplo, são códigos criados pelo usuário que devem ser utilizadas para autenticações em sistemas. Nesse caso, a responsabilidade sobre a "força da senha", relacionada a sua resistência a um ataque de força bruta (descrito mais adiante), é do usuário, visto que ele é o responsável por sua criação. Atualmente, os serviços tentam exigir e restringir determinados padrões de senha de forma a melhorar a segurança. A empresa também tem responsabilidade sobre a segurança da senha em relação ao seu armazenamento (feito em formato de hashes), visto que a verificação deve ser feita a cada autenticação. Fator de inferência ("o que você é ou faz"): O usuário deve mostrar algo relativo a seu ser ou algo que teoricamente somente ele consegue fazer, como impressão digital, padrão de retina, DNA, rosto, voz, assinatura, etc. Nesse caso, a segurança depende do próprio usuário, visto que a prova de autenticação faz parte do corpo ou depende da habilidade do mesmo. Fator de propriedade ("o que você tem"): O usuário deve utilizar algo que teoricamente somente ele possui, como cartões de identificação, tokens (de hardware ou software), chips implantados, par de chaves público-privada, etc. Tokens de software, por exemplo, são dados que sozinhos não fazem sentido, mas que, quando recebidos pelo sistema de validação, o mesmo consegue verificar a validade e as permissões de acesso do mesmo. Eles são criados pelo serviço e o usuário o recebe por um meio e o fornece por outro. Nesse caso, o responsável pela segurança do token é o usuário, que não pode o fornecer para terceiros. Assim, o ataque de força bruta geralmente não é efetivo, pois um token bem implementado tem tempo de vida, de forma que o atacante não teria tempo hábil para esse ataque, além de que, sempre que possível, códigos relacionados a fator de propriedade são extremamente seguros (grandes e aleatórios). Autenticação em um fator
      Essa forma de autenticação usa apenas um dos fatores acima para autenticar uma transação. Ela é extremamente contra indicada em processos relativos a serviços de alta importância e que, portanto, exigem alto nível de segurança, como serviços bancários ou que possam armazenar ou transmitir dados pessoais relevantes, como documentos, telefone, endereços, parentescos próximos, senhas, etc. 
      Alguns aplicativos de mensagem, como WhatsApp, por padrão se utilizam de apenas um fator de autenticação (fator de propriedade), o que é a principal causa das fraudes frequentemente relatadas pela imprensa ou conhecidos próximos. Continue a ler para aprender como evitar tais fraudes.
      Autenticação em múltiplos fatores
      Essa forma de autenticação, em que 2FA (ou autenticação em dois fatores) é um caso especial, usa ao menos dois fatores dos anteriores de forma que os dois níveis de precisam ser comprometidos por um invasor para que o mesmo consiga acesso ao serviço, o que é muito mais difícil de ocorrer em comparação à utilização de apenas um fator.

      Fonte: https://manuaisti.anac.gov.br 
      A maioria dos sistemas digitais online que fornecem autenticação em dois fatores se utilizam do fator de conhecimento (usuário e senha) e fator de propriedade (token), não necessariamente nessa ordem.
      Ataques Relacionados e suas consequências
      Essa seção vai o ajudar a responder às perguntas iniciais: "Você está seguro enquanto navega na Internet? E enquanto troca mensagens?". Vamos ver a seguir alguns ataques relativamente simples que podem ser prevenidos com práticas fáceis, mas a que nem todos os usuários se atentam.
      Ataques cibernéticos relacionados a autenticação são muito comuns, pois a "parte fraca", ou seja, a parte do sistema explorada pelo atacante, é o usuário comum, aquele que tem pouco ou nenhum conhecimento sobre segurança digital e, portanto, é a mais fácil de ser explorada.
      Ataques de Engenharia Social

      Fonte: https://www.urbannetwork.co.uk/social-engineering/
      Esse é um conjunto de ataques em que a princípio não é necessário nenhum conhecimento técnico de computação ou segurança da informação, nem ao menos serve somente para ataques digitais e justamente por isso é a técnica mais usada. O atacante se vale de manipulação psicológica para fazer com que a pessoa forneça informações que não deveria. 
      Um exemplo muito simples de engenharia social que funcionava muito bem anos atrás (em alguns sites ainda funciona) é a obtenção daquelas respostas secretas, necessárias para recuperar senhas perdidas. Em uma breve conversa com a vítima, um atacante é capaz de obter as respostas a essas perguntas e, consequentemente, de conseguir acesso à conta da vítima.
      Para não se tornar vítima desse ataque, evite esse método de acesso ou tenha certeza que não vai fornecer as respostas a ninguém. Apesar de esse método ser muito pouco usado atualmente, é sempre bom conhecer formas de evitar ataques. Uma forma é responder com palavras ou expressões que não correspondam à realidade, mas que tenha certeza que vá lembrar se precisar. Uma segunda possibilidade é escrever a resposta com uma combinação especial de maiúsculas, minúsculas, números e eventuais símbolos que o atacante não tenha menor chance de testar, mesmo obtendo a resposta correta de alguma forma, sempre destacando que você deve lembrar da mesma.
      Atualmente, dois dos ataques mais comuns estão relacionados ao aplicativo de mensagens WhatsApp, devido à sua popularidade e, portanto, ao ganho financeiro que o atacante terá ao explorar tal aplicativo. Ambos utilizam engenharia social.

      Fonte: https://www.bbc.com 
      No primeiro e mais simples de ser realizado, porém com menor efetividade, a vítima recebe uma mensagem de um número de celular desconhecido, mas com a foto de algum amigo ou parente próximo dizendo que precisou trocar de celular por algum motivo e que precisa de dinheiro urgente, geralmente por não ter acesso aos bancos do aparelho perdido. Esse é o momento que define o final do ataque: se a vítima acreditar e transferir o dinheiro, o ataque obteve sucesso e o dinheiro não pode mais ser recuperado, caso contrário o atacante passa para a próxima vítima.
      Para não se tornar uma vítima, a princípio devemos prevenir, configurando a segurança das redes sociais para privado e evitando fornecer telefones, endereços e graus de parentesco nas mesmas, pois essa é a principal fonte onde os atacantes vão buscar as informações necessárias. Outra forma de prevenir é avisar os seus parentes e amigos próximos que nunca irá transferir dinheiro quando solicitado por aplicativos de mensagem.
      Se o atacante conseguir os seus dados, quando receber mensagem do tipo da descrita no parágrafo anterior, desconfie: a princípio lembre-se se já não avisou para essa pessoa que jamais transferiria dinheiro com pedido por mensagens, veja se a foto do WhatsApp é de fato a do seu contato, converse com a pessoa que mandou a mensagem perguntando sobre fatos que somente o seu contato real poderia saber, mas use isso somente para ter certeza que não é seu amigo, e não ao contrário, pois ela pode também ter sido vítima de engenharia social. Tente falar com a pessoa por outros meios, começando por telefonar ou mandar mensagem para o telefone teoricamente antigo. 
      Se não conseguir falar por nenhum desses meios ou outros quaisquer e ainda pensar que pode ser verdade o pedido, ainda há algumas formas de evitar o sucesso do possível golpe: pegue a conta (ou PIX) que o atacante enviar e comece uma transferência (de preferência de valores baixos, por exemplo, R$ 0,01). Em determinado momento aparecerá os dados parciais ou totais da conta destino. Pense se esses dados fazem sentido – você conhece o dono da conta? A agência é de uma cidade conhecida em que o seu contato poderia realmente estar ou ter um conhecido? Além disso, busque pelos dados na Internet para verificar se não aparecem em fóruns, redes sociais ou outros sites em denúncias de fraudes. 
      Muito provavelmente, depois de todas essas etapas, você já terá certeza que se trata de um golpe, se for o caso. Assim sendo, se ainda não tiver pego os dados bancários do atacante, o faça. Com os dados bancários e o número de telefone do atacante em mãos, denuncie para a polícia, para o banco proprietário da conta e para a operadora de celular dona da linha. Dessa forma você ajudará a evitar que esse atacante tenha sucesso no ataque a outras vítimas. O banco e a empresa de telefonia não podem fazer nada a princípio, mas se houver muitas denúncias sobre os mesmos dados, eles abrirão uma investigação interna para saber se de fato o telefone ou a conta bancária estão sendo usados indevidamente.
      Um caso especial de engenharia social muito usado é o ataque de phishing, cuja tradução literal é "ataque de pesca", pois basicamente o usuário é "fisgado" por uma armadilha enviada através da Internet, fornecendo informações pessoais ou instalando softwares maliciosos.

      Fonte: https://www.paubox.com/ 
      O segundo método de ataque por WhatsApp é, na verdade, geralmente um ataque de phishing e é mais efetivo. Nesse caso, você pode ser vítima em duas possíveis etapas. A primeira diz respeito a ter a conta do WhatsApp sequestrada pelo atacante. Se você for vítima dessa primeira etapa do ataque, vai perceber quando tentar acessar o seu aplicativo e receber a mensagem de que ele foi acessado de outro aparelho celular ou quando receber um aviso de que outro celular acessou a sua conta. Nesse caso avise imediatamente todos os seus contatos de que está sem acesso ao aplicativo e que não devem considerar qualquer mensagem enviada por você. A seguir, tente acessar novamente seu WhatsApp, fornecendo o código de seis dígitos (token, fator de propriedade) que receberá do WhatsApp por SMS. Assim que acessar, o atacante perderá o acesso. 
      Esse ataque é realizado através da obtenção do token presente no SMS citado, que se parece com esse:

      Perceba que, ao final da mensagem, há um texto pedindo que esse código não seja compartilhado com ninguém, mas, por mais incrível que possa parecer, as vítimas desse golpe fazem justamente isso: fornecem o código ao atacante. 
      Vamos aos detalhes: o atacante tenta acessar o WhatsApp com o seu número de telefone, o que faz com que você receba essa mensagem. Nesse momento, muito provavelmente o atacante já está conversando com você e se identificou como funcionário de um serviço qualquer, seja uma pesquisa de mercado, um banco em que você tem conta, uma loja em que você comprou recentemente ou mesmo o próprio WhatsApp. No meio da conversa ele irá dizer que o enviará um código por SMS e que precisa que você confirme esse código por algum motivo. Não forneça o código para ninguém, mesmo que o atacante se identifique como funcionário do WhatsApp.
      E mais: sempre prefira entrar em contato com empresas pelo aplicativo da mesma baixado da loja oficial do seu smartphone, pois é a forma mais segura de não ser uma fraude. É bom destacar aqui que o WhatsApp nunca pede esse código por nenhum meio, ele deve ser escrito somente no aplicativo quando o mesmo pedir para liberar o seu acesso.
      Existe ainda uma segunda forma de evitar ser vítima do golpe mesmo que acidentalmente forneça o código ao atacante: autenticação em múltiplos fatores (particularmente em dois fatores). O WhatsApp tem um recurso que poucos conhecem em que o usuário cria uma senha (fator de conhecimento) que também jamais será solicitada a não ser pelo próprio aplicativo às vezes para ter certeza de que você é você mesmo, mas o mais importante e que evita esse ataque é que todas as vezes em que tentar acessar o aplicativo por um novo telefone, ele irá pedi-la, de forma que para que o ataque tenha sucesso, a vítima tem que fornecer tanto o token enviado por SMS quanto a senha configurada pelo próprio usuário, o que reduz muito as chances do sucesso por parte do atacante. 
      É altamente recomendado que todos os usuários configurem esse segundo fator de autenticação, mesmo porque se você não o fizer e o atacante for rápido o suficiente, ele pode configurar uma senha e, nesse caso, você terá maior dificuldade para recuperar o acesso, dando tempo para os seus amigos desavisados serem vítimas do atacante se passando por você. Para ativar o recurso, siga os passos abaixo, cujas imagens foram obtidas no site Techtudo:
      Entre no WhatsApp Toque nos três pontos no canto superior direito. A seguir toque em "Configurações" e "Conta".
       
      Toque em "Confirmação em duas etapas" e "Ativar".
       
      Insira a senha desejada e toque em "Avançar".
       
      Insira o e-mail para recuperação de senha caso a perca e toque em "Avançar".
      Fonte: https://www.techtudo.com.br 
      Mesmo se defendendo como explicado, você pode ainda ser vítima da segunda parte desse ataque, quando o atacante, em posse de uma conta de algum dos seus amigos, lhe manda mensagem pedindo dinheiro. Por esse motivo, é importante você avisar aos seus contatos assim que perceber que foi vítima de sequestro de conta. Faça a sua parte para evitar que outros sofram com a segunda parte do ataque, mas também fique atento caso algum conhecido seu o sofra (recomende a eles a ativação de autenticação em dois fatores para que isso não ocorra). Caso receba a mensagem de um contato pedindo dinheiro, siga passos semelhantes aos do ataque descrito anteriormente para verificar se de fato se trata da pessoa que diz ser e denuncie para as autoridades e empresas envolvidas caso seja uma tentativa de golpe, como detalhado anteriormente.
      Existem ainda ataques de phishing genéricos pelos mais diversos meios de comunicação:
      Telefone: Evite fornecer seu telefone para empresas desconhecidas e sempre que receber uma chamada de um número desconhecido suspeite. Não forneça dados, mesmo que a pessoa se identifique como funcionário de uma empresa confiável (qualquer um pode fazer isso).
      Fonte: https://pt.vecteezy.com 
      E-mail: Sempre que receber um e-mail que solicite uma resposta ou que acesse determinado link, desconfie, mesmo que aparentemente seja proveniente de empresa confiável e/ou conhecida. Verifique o cabeçalho do e-mail para ter certeza de que o endereço de origem é conhecido e confiável, e em caso de dúvida, entre em contato com o suposto remetente por outros meios previamente conhecidos, ignorando totalmente o e-mail. Além disso, denuncie o e-mail, clicando em classificar como spam e, a seguir, em denunciar fraude.
      Fonte: https://www.uol.com.br
      SMS: Sempre que receber mensagens por SMS com links evite clicar. Entre em contato com o suposto remetente por outros meios previamente conhecidos, ignorando totalmente o SMS. Essas mensagens geralmente falam sobre valores cobrados indevidamente ou dívidas. Veja o exemplo:
      Fonte: https://www.agazeta.com.br
      Ataque Man-In-The-Middle (MITM)
      Nesse tipo de ataque, o atacante intercepta uma comunicação de forma que ambos os interlocutores não percebam a sua presença e, eventualmente, troquem dados sensíveis. Um exemplo muito comum é a criação de uma página web muito parecida com um determinado serviço, como páginas web de bancos, em que a vítima insere os dados de acesso. A seguir, a página fake de fato envia a vítima para o site real de forma que, ao acessar o serviço, não percebe que algo errado ocorreu. Porém, nesse momento o atacante já terá as credenciais de acesso da vítima.

      Fonte: https://medium.com 
      Esse ataque é muito usado em conjunto com o ataque de engenharia social para que o atacante consiga fazer a vítima entrar em seu site fake pensando que está entrando no site real. A via de entrada para esses sites fake geralmente são e-mails ou SMS enviados por atacantes usando o ataque de phishing explicado na seção anterior.
      Para se evitar esse ataque, fique sempre atento ao site que está acessando, verificando se é de fato o site real do serviço desejado. Além disso, uma boa prática é, sempre que possível, acessar serviços através de aplicativos de celular baixado da loja oficial do sistema operacional do seu smartphone (Google Play, Apple App Store, Windows Phone Store, etc.).
      Ataque de Força Bruta
      Ataques de força bruta são aqueles em que o atacante testa diversas senhas até encontrar a correta. Por esse motivo, é importante o uso de senhas sempre distintas entre si, sendo cada uma delas aleatórias e contendo letras (maiúsculas e minúsculas), números e símbolos. Veja na imagem abaixo a relação entre tipos de caracteres, número de caracteres usados e o tempo médio necessário para o atacante conseguir descobrir a senha:

      Fonte: Hive Systems/Divulgação 
      Para que não esqueça nenhuma das suas senhas mesmo elas sendo grandes, aleatórias e distintas entre si, uma recomendação é o uso de gerenciadores de senha, como o Google Passwords, presente no navegador Chrome e em todos os smartphones com sistema Android.
      Para a maioria dos sites, esse ataque não funciona diretamente, pois há verificações que impedem muitas tentativas consecutivas. Porém, isso não impede que o ataque possa ocorrer, pois é muito comum falhas em relação a armazenamento de bancos de dados (recentemente a imprensa divulgou vários ataques a eles, com uma massiva quantidade de dados) que disponibilizam na Internet dados cadastrais. 
      Ataques a bancos de dados são tão comuns que não é recomendado o armazenamento de senhas de forma explícita. O que fica armazenado nos bancos de dados são hashes das senhas, isto é, funções conhecidas porém irreversíveis calculadas a partir das senhas, de forma que a partir da senha digitada, o site pode calcular a mesma função para determinar se foi digitada corretamente. Porém, um atacante com acesso ao banco de dados não terá as senhas de forma explícita, mas em posse das hashes, ele fica com tempo hábil e quantidade de tentativas ilimitadas para tentar possíveis valores da sua senha. Por isso a necessidade de se criarem senhas "fortes" e da aleatoriedade, pois sabendo dos dados presentes nessas tabelas e sabendo que as pessoas costumam escolher senhas fáceis de lembrar e, portanto, não aleatórias, os atacantes usam dicionários de palavras para fazerem tentativas mais inteligentes, demorando menos tempo para chegar às senhas corretas. 
      Para se ter uma ideia da diferença que isso faz, conforme o site wikwik, existem 6669 palavras de 5 letras na língua portuguesa, porém existem 11881376 combinações de 5 letras minúsculas (quase 2000 vezes mais). Se levarmos em consideração também letras maiúsculas, números e símbolos, ainda desconsiderando letras acentuadas, temos um total de 7339040224 combinações de 5 letras (1 milhão de vezes mais que o número de palavras). Essa quantidade mostra a importância de usarmos senhas aleatórias e com a maior quantidade possível de tipos de caracteres.
      Referências
      Authentication - Wikipedia Phishing - Wikipedia Social engineering - Wikipedia Troy Hunt Verificação em duas etapas no WhatsApp - Techtudo O que é um ataque Man-in-the-Middle - Kaspersky
×
×
  • Create New...