Desenvolvimento

12 jul, 2010

Hackeando com Harry Potter

Publicidade

Neste artigo veremos como é importante fazer uma série de
considerações ao desenvolver um sistema de software, por mais simples
que seja, usando como exemplo a obra “Harry Potter e o Cálice de Fogo”.

As inscrições para o torneio

Na trama, a Escola de Magia e Bruxaria de Hogwarts anuncia que naquele ano não acontecerá seu chatíssimo torneio de quadribol, mas irá hospedar o
megaevento de intercâmbio com duas escolas bruxas de outros países: a
competição conhecida como Torneio Tribuxo. Para a
competição, cada escola contaria com um estudante, o “campeão” daquela
escola. Os estudantes que quisessem participar deveriam se inscrever pondo
seus nomes e o de sua escola em um artefato mágico chamado “Cálice de
Fogo”, um cálice gigante e que emite chamas pela
boca, que irá magicamente selecionar o melhor de cada escola para
participar.

Esse torneio havia sido cancelado há mais de um século devido à alta
taxa de mortalidade de seus participantes, causada pelo nível de risco
absurdo dos desafios. Para que a legislação permitisse o retorno do
torneio, uma série de providências foram tomadas, entre elas proibir
a inscrição de alunos menores de 17 anos.

Para impedir que alunos abaixo da idade permitida se inscrevam, o
diretor de Hogwarts, Albus Dumbledore, configurou um firewall:
uma barreira mágica que os impedia de chegar perto o suficiente do cálice
de fogo para adicionar sua inscrição. O bloqueio se mostrou bom o
suficiente até para bloquear tentativas como a dos gêmeos Weasley, que
tomam uma poção de envelhecimento temporário.

Ao final do período de inscrições, o cálice fez sua avaliação e liberou o
nome de três alunos, um para cada escola. Porém, para surpresa de todos,
um dos nomes era Harry Potter, que era menor de 17 anos e ainda assim havia conseguido fazer sua inscrição.

O corpo docente de Hogwarts conseguiu entender como um estudante de quarto ano havia tido a capacidade de
furar o firewall do cálice para se inscrever. Por fim, chegaram à
conclusão que alguém o havia inscrito, à revelia. No final, ficamos
sabendo quem foi, e por que havia feito isso. Neste artigo, iremos explicar o ‘como’.

Como foi possível, usando um método muito simples, fazer Potter ser
escolhido como um dos campeões participantes do Torneio Tribuxo? A
resposta pode ser resumida assim:

explorando falhas de concepção do
sistema e de má compreensão dos requisitos por parte de seus
elaboradores.

O esquema de dados do Cálice

Para explicar o que aconteceu, eu convido você a assumir uma
premissa básica, conhecida como Terceira Lei de Clarke:

Qualquer  tecnologia suficientemente avançada será indistinguível de mágica.

Todos
os feitiços, objetos mágicos e criaturas do mundo de Potter, embora
possam parecer violar várias leis da física, ainda estão sujeitos às
leis da lógica e podem, em última instância, ser analisados logicamente.
Nós do mundo “trouxa” não conhecemos em detalhes a interface mágica
para configurar o firewall de idade ou o Cálice de  Fogo, mas
neste artigo ofereceremos uma intuição de como o processo transcorreu.

Criaremos um banco de dados em branco, CALICE_FOGO, e nele uma tabela
INSCRITOS com os campos NOME_ALUNO e NOME_ESCOLA. Escolhi o tipo de
dados varchar(250) puramente por hábito, e essa escolha não tem nenhum
impacto no resultado.

Para que o cálice selecione um campeão para cada escola, primeiro ele irá executar uma avaliação de cada estudante inscrito, suas
habilidades em cada disciplina, por exemplo, e atribuir uma nota
numérica para cada um. Portanto, vamos adicionar um campo NOTA.

O campo
NOTA permitirá o valor nulo porque logo após a inscrição o aluno ainda
não terá sido avaliado pelo cálice.

Logo após o fim das inscrições, a tabela terá os nomes dos
alunos, das escolas e o campo nota em branco, isto é, aluno não avaliado.

A seleção do competidores

Em algum momento após o encerramento das inscrições, o cálice irá
atribuir notas:

A partir desse cenário, o Cálice de Fogo pode selecionar facilmente
os campeões executando o seguinte comando SQL:

Mesmo em algo tão simples,
houve falhas de concepção graves que, entre outros problemas, puseram
em risco a vida de um aluno que nem mesmo havia se inscrito.

Criticando a solução implementada

Uma das primeiras questões que podemos apontar no esquema descrito acima é “e se houver nomes de alunos repetidos?”. Talvez no
despovoado mundo das famílias bruxas realmente não haja. Mas em alguns
anos, talvez poucos, a população bruxa pode crescer. Eu sugeriria que a
inscrição fosse por número de matrícula.

Mas uma questão mais prioritária que podemos apontar é: mesmo não se
inscrevendo pessoalmente, Harry foi inscrito por alguém (como vimos mais
para o final, por um lacaio de Voldemort). Todo o esquema de proteção
projetado por Dumbledore foi por água abaixo por apenas considerar a
idade de quem se aproxima do cálice, não a idade de quem está sendo
inscrito.

No entanto, ainda recomendo manter o firewall de idade do cálice,
pois isso preveniria alunos mais novos de ficarem “fuçando” o sistema de
inscrição até descobrirem uma brecha.

Furando o bloqueio

Para dar seguimento ao seu plano maléfico, tudo que o vilão precisou
fazer, como ele próprio sugeriu numa reunião dos professores e direção,
foi inscrever o nome de Harry Potter com o nome de uma quarta escola:

Após rodar o procedimento de avaliação, o cálice obteve:

Observem a imagem com atenção. Não houve necessidade de romper
barreira mágica, nada de feitiço poderoso, nada de dementador. Ele nem
mesmo teve que usar magia.

Quais foram as falhas cometidas

Uma quarta escola era simplesmente algo que o sistema não esperava. O
risco de algo assim acontecer poderia ter diminuído muito se o banco de
dados do cálice fosse normalizado uma tabela “escolas” com chave
estrangeira e restrição de integridade e houvesse sido implementada a
rejeição de escola não cadastrada.

Foi desperdiçado o talento de um Dumbledore criando-se um firewall de
idade espetacular completamente inútil porque não se observou a sutil
diferença entre “a idade de quem se aproxima fisicamente do cálice” e “a
idade de quem está com o nome no papelzinho”. A vida de um estudante
menor de idade foi posta em risco sem necessidade porque não se
considerou algo simples como “e se alguém inventar um nome de uma outra
escola?” ou a questão mais abrangente “o Cálice deve atender a concursos
de quais escolas?”.

Outra questão básica que foi totalmente ignorada foi a de auditoria:
não há como verificar um registro de log do Cálice que exibisse, por
exemplo, a hora da inscrição e quem a efetuou. Essa informação seria
simples de registrar e seria útil em caso de vários incidentes. No caso
específico da inscrição indevida de Potter, um vilão disfarçado de
professor teria sido desmascarado antes de ir mais longe em suas
manipulações.

Mesmo com todos os professores vendo o erro óbvio e absurdo cometido
pelo Cálice, nenhum deles recebeu permissão do Ministério da Magia de
desconsiderar o quarto aluno, ou recomeçar o processo de inscrição,
desta vez com mais vigilância. Esta, na minha opinião, foi a falha mais
grave de todas: dar força de lei a um artefato mágico possivelmente
falho, conceder a ele mais autoridade de que a seus usuários.

O verdadeiro problema

O maior problema que ocorreu naquele ano com a inscrição para o
Torneiro Tribuxo não foi nenhuma das questões aqui apresentadas, mas
algo mais fundamental: o excesso de suposições.

O sistema dependia da
suposição de que ninguém inscreveria alunos de uma quarta escola, da
suposição de que as pessoas inscreveriam somente a si mesmas, e de
várias outras.

Nós, desenvolvedores “trouxas”, também muitas vezes
fazemos uma série de suposições comuns porém falsas, por força do
hábito, pressa, falta de motivação ou mesmo por pura preguiça. Isso só
nos leva a desenvolver software de má qualidade, e à vitória de
Voldemort.