Pular para o conteúdo principal

Questão de Segurança da Informação — Ataques a Aplicações Web (XSS, CSRF, SQL Injection etc.) — FGV 2024

Segurança da InformaçãoAtaques a Aplicações Web (XSS, CSRF, SQL Injection etc.)
Código
fg165612
Banca
FGV
Órgão
INPE
Ano
2024
Cargo
Tecno Jr ( )
O fragmento de código a seguir recebe o nome de um arquivo como parâmetro da linha de comando e mostra o seu conteúdo ao usuário. O script é configurado com setuid root, pois visa servir como uma ferramenta educacional para permitir que administradores de sistemas em treinamento examinem arquivos privilegiados do sistema, sem conceder-lhes a capacidade de alterá-los ou causar danos ao sistema. int main(char* argc, char** argv) {    char cmd[CMD_MAX] = "/usr/bin/cat ";    strcat(cmd, argv[1]);    system(cmd); } Dado que o programa opera com privilégios de administrador, a função system() é igualmente executada com tais privilégios. Quando um usuário fornece um nome de arquivo padrão, a chamada funciona como esperado. Contudo, se um invasor inserir uma string como ";rm -rf /", a chamada system() falhará ao tentar executar o comando "cat" por falta de argumentos, resultando na tentativa subsequente de
  1. Aexcluir recursivamente todo o conteúdo da partição raiz, configurando um ataque do tipo Denial of Service.
  2. Bexcluir recursivamente todo o conteúdo da partição raiz, configurando um ataque do tipo Command Injection.
  3. Ccopiar recursivamente todo o conteúdo da partição raiz, configurando um ataque do tipo Direct Dynamic Code Evaluation.
  4. Dcopiar recursivamente todo o conteúdo da partição raiz, configurando um ataque do tipo Code Injection.
  5. Eexcluir recursivamente todo o conteúdo da partição raiz, onfigurando um ataque do tipo Man-in-the-middle.
Revelar gabarito e comentário

GabaritoB — excluir recursivamente todo o conteúdo da partição raiz, configurando um ataque do tipo Command Injection.

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”.

Command Injection: injeção de comandos do sistema

Gabarito: letra B. O código concatena o argumento do usuário diretamente em um comando shell (system()), permitindo que uma entrada como ";rm -rf /" seja interpretada como um comando separado — isso é Command Injection (injeção de comandos), e o efeito é a exclusão recursiva do conteúdo da partição raiz. A vulnerabilidade está na falta de validação/sanitização da entrada antes de passá-la ao interpretador de comandos.

O Command Injection (ou injeção de comandos) é uma classe de ataque em que o invasor consegue inserir comandos arbitrários do sistema operacional em um comando que a aplicação executa. Isso ocorre quando dados fornecidos pelo usuário são concatenados a comandos shell sem a devida sanitização. No código do enunciado, a string cmd é montada com strcat(cmd, argv[1]) e depois executada por system(cmd). Se o usuário digitar ";rm -rf /", o comando final vira /usr/bin/cat ;rm -rf / — o ponto e vírgula (;) é um separador de comandos no shell, então o sistema executa primeiro o cat (que falha por falta de argumento) e depois o rm -rf /, que remove recursivamente e sem confirmação todo o conteúdo da raiz. Como o programa roda com setuid root, o rm também roda com privilégios de administrador, tornando o dano catastrófico.

A distinção central aqui é entre Command Injection e Code Injection. Command Injection insere comandos do sistema operacional (executados pelo shell), enquanto Code Injection insere código na própria linguagem da aplicação (ex.: PHP, JavaScript, SQL). O exemplo clássico de Code Injection é o SQL Injection, que manipula consultas ao banco. No caso do enunciado, o alvo é o shell do sistema, então é Command Injection. Também é importante diferenciar de Direct Dynamic Code Evaluation, que é um termo usado para avaliação dinâmica de código (como eval() em PHP), e de Man-in-the-middle, que é um ataque de interceptação de comunicação — nenhum deles se aplica aqui.

A pegadinha da banca está em confundir o efeito (exclusão de arquivos) com o tipo de ataque. A exclusão recursiva (rm -rf /) é o resultado do Command Injection, mas o tipo de ataque é definido pela técnica de injeção, não pelo efeito. Alternativas que dizem "Denial of Service" ou "Man-in-the-middle" descrevem outros fenômenos. A letra B é a única que acerta tanto o efeito quanto a classificação.

NÃO CAIA NESSA!

A banca troca o efeito pelo tipo de ataque. O rm -rf / é a consequência, mas o ataque em si é Command Injection — a injeção de comandos do sistema via entrada não sanitizada. Não confunda com Code Injection (que insere código na linguagem da aplicação) nem com DoS (que visa indisponibilidade, não destruição de dados).

Alternativa A — ❌ Incorreta

O efeito está correto (excluir recursivamente a raiz), mas a classificação está errada. Denial of Service (DoS) visa tornar um serviço indisponível, geralmente por sobrecarga ou exploração de falhas que derrubam o sistema. Aqui, o objetivo é destruir dados, não apenas negar serviço — e a técnica é injeção de comandos, não DoS.

Alternativa B — ✅ Correta ⟵ GABARITO

A entrada ";rm -rf /" é concatenada ao comando cat, e o ; permite executar rm -rf / como um comando separado no shell. Isso é Command Injection: o invasor injeta comandos do sistema operacional através de uma entrada não validada. O efeito é a exclusão recursiva de todo o conteúdo da partição raiz, com privilégios de root.

Alternativa C — ❌ Incorreta

O efeito está errado (não é cópia, é exclusão) e a classificação também. Direct Dynamic Code Evaluation refere-se à avaliação dinâmica de código na linguagem da aplicação (como eval()), não à execução de comandos do sistema. Aqui, o código é executado pelo shell, não avaliado como código da aplicação.

Alternativa D — ❌ Incorreta

O efeito está errado (não é cópia, é exclusão). Code Injection é um termo genérico para injeção de código, mas o tipo específico aqui é Command Injection — injeção de comandos do sistema operacional, não de código da aplicação. A distinção é importante: Command Injection executa comandos no shell; Code Injection executa código na linguagem da aplicação.

Alternativa E — ❌ Incorreta

O efeito está correto (excluir recursivamente), mas a classificação está totalmente equivocada. Man-in-the-middle (MitM) é um ataque em que o invasor se posiciona entre duas partes que se comunicam, interceptando e possivelmente alterando o tráfego. Não tem relação com injeção de comandos em uma aplicação local.

Gabarito: letra B — Command Injection, com exclusão recursiva da partição raiz.

Link permanente: /questoes/fg165612