Mesmo os aspectos mais modesto de um programa podem apresentar ameaças de segurança. Insumo básico usuário pode curto-circuito código interno de um programa de várias maneiras. A entrada pode utilizar os mecanismos de impressão funções para aceder ao fluxo do programa de controlo substituindo os limites da função . Ou, pode invadir os limites do buffer definido para ele pelo programador para afetar os dados fora do seu espaço designado pelo programador . De qualquer forma, a entrada do usuário afeta a forma como o programa é executado, potencialmente para fins maliciosos. Formato Cordas
cordas de formatação em C e C + + são parte das funções de entrada e saída . A string de formato contém dados para dados de saída para a tela . Seqüências de formato tem dois componentes principais . O primeiro é a string básicas de impressão, contendo personagens e pontuação. O segundo componente inclui caractere especial marcado com sinais percentuais que servem como espaços reservados para dados variáveis. Esses símbolos existem na string, e são substituídos durante a saída de valores mantidos em variáveis. O exemplo a seguir ilustra uma declaração básica printf com uma seqüência de formato :
de char x = "c "; int y = 10;
printf (" Personagens de impressão % c e decimais % d" ; , x, y);
formato Ataques de corda
a insegurança de seqüências de formato reside na forma como os símbolos incorporados nas cordas de referência de outras partes do programa. Por exemplo , um atacante inserir dados em uma variável usada em uma seqüência de formato pode injetar símbolos que lhe permitem aceder a outros quadros de execução do programa. Ao fazer isso, o atacante pode modificar os valores das variáveis fora do escopo da função de impressão. Além disso , o atacante poderá, eventualmente, acessar os valores na memória que representam a localização de funções. O invasor pode então alterar esse valor para apontar para uma função diferente, mudando , assim, o fluxo de execução e, essencialmente, o seqüestro do programa.
Entrada buffers
entrada buffers são espaços de armazenamento de dados criados pelo programador para armazenar dados inseridos pelo usuário . Na maioria das vezes , buffers de entrada lidar com a entrada do usuário de log em nomes e senhas. Especificamente para a linguagem de programação C, que não inclui a manipulação de strings nativa, buffers de entrada existir como arrays de caracteres com um tamanho definido. Neste caso , cabe ao programador alocar dados para a entrada do usuário .
Buffer Overflow
Um atacante pode aproveitar as limitações desses buffers por inundando-o com dados. No exemplo mais simples , um array de caracteres a intenção de manter um registro de nome pode ter 20 espaço alocado , mas um atacante dá mais de vinte caracteres para processar. Neste caso , os caracteres adicionais substituem os locais de memória imediatamente a seguir à matriz . Estas posições de memória , possivelmente armazenar dados relevantes para a execução do programa , como variáveis condicionais para declarações de controle de fluxo ou referências a funções na pilha. Como o formato de seqüência de ataque, o que permite , essencialmente, o invasor sequestrar o programa.