Pergunta

I permitiram a advertência -Wstack-protector ao compilar o projeto que estou trabalhando (um multi-plataforma C ++ motor de jogo comercial, compilar no Mac OS X 10.6 com o GCC 4.2). Esta bandeira adverte sobre as funções que não serão protegidas contra a pilha quebrando embora -fstack-protector está habilitado. GCC emite alguns avisos durante a criação do projeto:

não proteger função: nenhum buffer pelo menos 8 bytes de comprimento
não proteger as variáveis ??locais: tampão de comprimento variável

Para o primeiro aviso, descobri que é possível ajustar o tamanho mínimo de um buffer deve ter quando usado em uma função, para esta função a ser protegido contra a pilha sensacional: --param ssp-buffer-size=X pode ser usado, onde X é 8 por padrão e pode ser tão baixa quanto 1.

Para a segunda advertência, não posso reprimir suas ocorrências a menos que eu parar de usar -Wstack-protector.

  1. Quando deve -fstack-protector ser usado? (Como, por exemplo, o tempo todo durante dev, ou apenas quando o controle de insetos para baixo?)
  2. Quando deve -fstack-protector-all ser usado?
  3. O que é -Wstack-protector me dizendo? É o que sugere que eu diminuir o tamanho mínimo de buffer?
  4. Se assim for, existem desvantagens para colocar o tamanho para 1?
  5. Parece que -Wstack-protector não é o tipo de bandeira que você quer habilitado em todos os momentos, se você quiser uma compilação sem aviso. É este direito?
Foi útil?

Solução

Stack-proteção é uma estratégia de endurecimento, não uma estratégia de depuração. Se o seu jogo é-rede conscientes ou não tem dados provenientes de uma fonte descontrolada, ligá-lo. Se ele não tem dados provenientes de algum lugar não controlada, não ligá-lo.

Aqui está como ele joga fora: Se você tem um bug e fazer uma mudança tampão baseado em algo que um atacante pode controlar, que atacante pode substituir o endereço do remetente ou porções similares de pilha para causar a execução de seu código em vez de seu código. proteção Stack irá abortar o seu programa se detectar que isso aconteça. Os usuários não serão felizes, mas eles não vão ser cortado também. Este não é o tipo de Hacker, que é de cerca de fazer batota no jogo, é o tipo de Hacker, que é sobre alguém usando uma vulnerabilidade em seu código para criar um exploit que potencialmente infecta seu usuário.

Para soluções de depuração-orientado, olhar para as coisas como mudflap.

Como para as suas perguntas específicas:

  1. Use pilha protetor se obter dados a partir de fontes não controladas. A resposta a esta provavelmente é sim. Para usá-lo. Mesmo se você não tem dados de fontes não controladas, você provavelmente acabará ou já fazer e não percebem isso.
  2. proteções de pilha para todos os buffers podem ser usados ??se você quer proteção extra em troca de algum impacto na performance. De gcc4.4.2 manual:

    -fstack-protector

    código extra Emit para verificar se há estouros de buffer, como ataques Stack Smashing. Isto é feito através da adição de uma variável guarda para funções com objetos vulneráveis. Isto inclui funções que chamam alloca, e funções com buffers maiores do que 8 bytes. Os guardas são inicializados quando uma função é inserido e, em seguida, verificado quando a função sai. Se um cheque guarda falhar, uma mensagem de erro é impresso e sai do programa.

    -fstack-protector-all

    Como -fstack-protector, exceto que todas as funções estão protegidos.

  3. Os avisos lhe dizer o que isola a protecção da pilha não pode proteger.

  4. Não é necessariamente sugerindo que você diminuir o tamanho do buffer mínimo, e em um tamanho de 0/1, é o mesmo que-stack-protetor de todos. Ele só está apontando-lo para você de modo que você pode, se você decidir redesenhar o código para que tampão está protegido.
  5. Não, essas advertências não representam problemas, eles apenas apontam informações para você. Não usá-los regularmente.

Outras dicas

Você na verdade não deve se preocupam com o aviso para compilações normal. É realmente mais de uma mensagem informativa. Espero que seja óbvio que você tem um problema de segurança inerentes com buffers de tamanho variável na pilha; obter o errado cálculo do tamanho e você está abrindo um grande buraco.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top