Pular para o conteúdo principal

Questão de Segurança da Informação — Práticas de Segurança e Ameaças em Programação — FUNDATEC 2026

Segurança da InformaçãoPráticas de Segurança e Ameaças em Programação
Código
qa429494
Banca
FUNDATEC
Órgão
IFC
Ano
2026
Cargo
PEBTT ( )

Analise o seguinte programa escrito em linguagem C conforme o padrão ANSI C:

 

#include <stdio.h>
#include <string.h>

 

int main() {
 char senha[8];

 printf("Digite a senha: ");
 gets(senha);

 if(strcmp(senha, "admin") == 0){
 printf("Acesso permitido\n");
 } else {
 printf("Acesso negado\n");
 }
 return 0;
}

 

Considerando as práticas de codificação segura estabelecidas pelo padráo CERT C Coding Standard e pela OWASP, qual alternativa descreve corretamente o principal problema de segurança presente no código?

  1. AO uso da função strcmp pode causar erro de compilação.
  2. BO uso da função gets pode provocar estouro de buffer (buffer overflow).
  3. CO tamanho do vetor senha impede a comparação correta da string.
  4. DA função printf não deve ser utilizada para exibir mensagens ao usuário.
  5. EO comando if deveria utilizar o operador == para comparar strings.
Revelar gabarito e comentário

GabaritoB — O uso da função gets pode provocar estouro de buffer (buffer overflow).

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Estouro de Buffer em C: a função gets

Gabarito: letra B. O principal problema de segurança do código é o uso da função gets, que não verifica o tamanho do buffer de destino e pode provocar estouro de buffer (buffer overflow) — vulnerabilidade clássica explorada para execução de código arbitrário. O CERT C Coding Standard e a OWASP recomendam expressamente evitar gets, substituindo-a por funções seguras como fgets.

O estouro de buffer ocorre quando um programa escreve dados além dos limites de uma área de memória reservada (buffer). No código, char senha[8] reserva 8 bytes; a função gets(senha) lê do teclado até encontrar uma quebra de linha, sem nenhuma verificação de tamanho. Se o usuário digitar mais de 7 caracteres (lembrando que o \0 final também precisa de espaço), os bytes excedentes serão gravados em posições de memória adjacentes, corrompendo outras variáveis, o endereço de retorno da função ou até mesmo o fluxo de execução do programa.

Essa é uma das vulnerabilidades mais antigas e perigosas da linguagem C, pois permite que um atacante, ao fornecer uma entrada especialmente elaborada, sobrescreva o endereço de retorno e redirecione a execução para um código malicioso (shellcode). O CERT C Coding Standard, na regra STR31-C, proíbe explicitamente o uso de gets, e a OWASP, em suas diretrizes de codificação segura, também a lista como função insegura. A alternativa segura é usar fgets(senha, sizeof(senha), stdin), que limita a quantidade de caracteres lidos ao tamanho do buffer.

O código também apresenta outros problemas de segurança, como a comparação de senha em texto claro (sem hash) e a ausência de validação de entrada, mas a questão pergunta especificamente pelo principal problema, que é o estouro de buffer causado por gets.

Guarde a distinção: gets é insegura por não limitar a entrada; fgets é segura porque recebe o tamanho máximo como parâmetro. É exatamente essa diferença que as alternativas tentam confundir.

  1. 1gets lê sem limite
  2. 2Entrada maior que buffer
  3. 3Bytes excedentes corrompem memória
  4. 4Sobrescreve endereço de retorno
  5. 5Execução de código arbitrário
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

O uso de strcmp não causa erro de compilação. strcmp é uma função padrão da biblioteca string.h, declarada corretamente e utilizada de forma válida para comparar duas strings. O erro de compilação não é o problema em questão.

Alternativa B — ✅ Correta ⟵ GABARITO

A função gets é notoriamente insegura: ela lê uma linha da entrada padrão e a armazena no buffer fornecido, sem verificar se o buffer tem espaço suficiente. Isso permite que uma entrada maior que o buffer (8 bytes) cause estouro de buffer, sobrescrevendo memória adjacente. O CERT C e a OWASP recomendam fortemente evitar gets, usando fgets ou outras funções com limite de tamanho.

Alternativa C — ❌ Incorreta

O tamanho do vetor senha[8] não impede a comparação correta da string. A comparação com strcmp funciona normalmente para strings de até 7 caracteres (mais o \0). O problema não é a comparação, mas a leitura sem limite.

Alternativa D — ❌ Incorreta

A função printf é perfeitamente adequada para exibir mensagens ao usuário. Não há restrição de segurança que proíba seu uso para esse fim. O problema está na entrada de dados, não na saída.

Alternativa E — ❌ Incorreta

Em C, strings são vetores de caracteres e não podem ser comparadas com o operador == (que compararia os endereços dos vetores, não o conteúdo). A forma correta é usar strcmp, como está no código. A alternativa inverte o conceito: == seria o erro, não a solução.

NÃO CAIA NESSA!

A banca explora a confusão entre gets e fgets. Muitos candidatos lembram que gets é insegura, mas podem ser atraídos pela alternativa E, que sugere usar == para comparar strings — um erro clássico de quem está começando em C. Lembre-se: == compara endereços, não conteúdo; para strings, use strcmp.

NÃO CAIA NESSA!

Na prova, ao ver gets em código C, a resposta quase sempre será "estouro de buffer". Memorize a regra: nunca use gets; use fgets com o tamanho do buffer. Essa é uma das pegadinhas mais recorrentes em questões de segurança da informação.

Gabarito: letra B

Link permanente: /questoes/qa429494