Quando e como usar o recurso de proteção de pilha do GCC?
-
06-07-2019 - |
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
.
- Quando deve
-fstack-protector
ser usado? (Como, por exemplo, o tempo todo durante dev, ou apenas quando o controle de insetos para baixo?) - Quando deve
-fstack-protector-all
ser usado? - O que é
-Wstack-protector
me dizendo? É o que sugere que eu diminuir o tamanho mínimo de buffer? - Se assim for, existem desvantagens para colocar o tamanho para 1?
- 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?
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:
- 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.
-
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.
-
Os avisos lhe dizer o que isola a protecção da pilha não pode proteger.
- 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.
- 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.