◇ OpenCyber Academy
Engenharia · Capítulo 2 · Português

Capítulo 2 — Matemática discreta

Ensino gratuito e aberto para quem deseja proteger pessoas e tecnologias. Não é preciso criar uma conta para estudar ou consultar as respostas.

Capítulo 2 — Matemática discreta

Mapa da aula

Aula 02 publicada. Mapa, exemplo, EX004.

flowchart TD
  N0["2.1 Conjuntos, funções e lógica"]
  N1["2.2 Relações e grafos"]
  N2["2.3 Contagem"]
  N3["2.4 Indução e invariantes"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4
  N4 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX004"]

Desenho lógico

flowchart LR
  N0["2.1 Conjuntos, funções e lógica"]
  N1["2.2 Relações e grafos"]
  N2["2.3 Contagem"]
  N3["2.4 Indução e invariantes"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX004"]
[2.1 Conjuntos, funções e lógica]
    |
    v
[2.2 Relações e grafos]
    |
    v
[2.3 Contagem]
    |
    v
[2.4 Indução e invariantes]
    |
    v
[Síntese]
    |
    v
[Exemplo resolvido] --> [Exercício EX004]

Objetivos de aprendizagem

Você vai (1) usar conjuntos, relações, funções e lógica para descrever com precisão o comportamento de sistemas; (2) expressar políticas de acesso e de uso de ferramentas como predicados; (3) contar possibilidades para estimar espaços de busca; e (4) raciocinar sobre grafos de fluxo de dados e de controle em sistemas de IA.

2.1 Conjuntos, funções e lógica

Um modelo é uma função f: X → Y de um conjunto de entradas para um conjunto de saídas. Uma política é um predicado P(usuário, ação, recurso) que é verdadeiro quando a ação é permitida. Conectivos lógicos (∧, ∨, ¬, →) e quantificadores (∀, ∃) nos permitem escrever propriedades de segurança com exatidão: "∀ chamada de ferramenta c emitida pelo Wrench, Authorised(requesting_user(c), c)". Escrever propriedades dessa forma revela ambiguidades — quem é o "usuário solicitante" quando a chamada foi disparada por um texto num boletim de fornecedor? Sam resolve isso definindo o usuário solicitante como a pessoa cuja sessão iniciou a conversa.

2.2 Relações e grafos

Um grafo direcionado de componentes (câmera → pré-processamento → modelo → fila de alertas → técnico) mostra por onde os dados fluem e onde a confiança muda. Caminhos de uma fonte não confiável até um destino privilegiado são as rotas que um atacante pode usar; em aplicações de modelos de linguagem, o caminho "boletim do fornecedor → prompt do Wrench → ferramenta de ordens de serviço" é exatamente um caminho de injeção indireta de prompt (Greshake et al., arXiv:2302.12173). A alcançabilidade em grafos é calculada por busca em largura ou em profundidade. Desenhar o grafo primeiro torna a busca mecânica: marque cada nó cujo conteúdo um agente externo pode influenciar, marque cada nó que pode mudar algo no mundo e liste os caminhos entre eles. Cada caminho encontrado assim precisa de um controle em algum ponto do percurso, e o grafo mostra onde.

2.3 Contagem

A combinatória estima espaços de busca. Se um atacante pode mudar quaisquer 3 de 100 atributos para um de 4 valores, há C(100,3) × 4³ = 161,700 × 64 ≈ 10.3 milhões de variantes — viável de percorrer por computador. A contagem mostra por que "ninguém vai encontrar a entrada ruim" não é uma defesa. Dez milhões de variantes podem ser avaliadas em minutos num computador comum se cada consulta ao modelo for rápida, então o atacante não precisa de engenhosidade, só de paciência e de acesso ao modelo ou a uma cópia próxima dele. A mesma contagem diz aos defensores onde limitar consultas: se cada variante tivesse de passar por uma interface com limite de mil requisições por dia, a busca exaustiva levaria décadas, e o atacante precisaria buscar de forma muito mais engenhosa.

2.4 Indução e invariantes

Um invariante é uma propriedade que vale antes e depois de cada passo. "A ferramenta de ordens de serviço só pode ser chamada com o token de sessão de um técnico" é um invariante; provar que ele vale em todos os caminhos do código (por indução sobre os passos) é mais forte do que testar alguns casos. A indução tem duas partes. O caso base confere que nenhuma chamada de ferramenta é possível antes de existir uma sessão. O passo mostra que, se toda chamada anterior levava um token válido, o caminho do código que emite a próxima chamada também anexa um e, caso contrário, recusa. Um teste com algumas chamadas não consegue mostrar que nenhum caminho pula a verificação; um argumento sobre todos os caminhos consegue, desde que os caminhos do código estejam listados por completo.

2.5 Exemplo resolvido (caso sintético da NRS)

Sam desenha o grafo de fluxo de dados do Wrench com nós para o chat do usuário, manuais, notas dos técnicos, boletins de fornecedores (externos), o modelo e duas ferramentas (search, create_work_order). Existem dois caminhos de não confiável para privilegiado: boletim → modelo → create_work_order e notas dos técnicos (editáveis por terceirizados) → modelo → create_work_order. Sam escreve a propriedade "∀ chamada de create_work_order, um técnico humano a confirmou" e marca os dois caminhos para receber controles. O segundo caminho é fácil de deixar passar porque as notas dos técnicos parecem internas, mas terceirizados podem editá-las, então elas pertencem às entradas não confiáveis. A propriedade de confirmação coloca um único controle no destino, que cobre os dois caminhos de uma vez, em vez de tentar filtrar cada fonte não confiável separadamente.

2.6 Erros e limites

Três erros são comuns: políticas informais com exceções ocultas; esquecer caminhos indiretos através de repositórios de dados; e subestimar espaços de busca que computadores enumeram com facilidade. Exceções ocultas aparecem quando uma política escrita como 'técnicos podem criar ordens de serviço' acaba significando 'exceto terceirizados nos turnos de fim de semana', algo que ninguém escreveu. Caminhos indiretos são esquecidos quando um grafo mostra apenas conexões ativas e omite repositórios, como notas salvas hoje e lidas pelo modelo amanhã. Espaços de busca são subestimados por quem imagina um humano testando entradas à mão, e não um programa testando milhões.

Exercícios

Síntese

A matemática discreta dá uma linguagem precisa para políticas, fluxos de dados e espaços de busca — a base para enunciar e verificar propriedades de segurança de IA em vez de torcer por elas.

Continue estudando — capítulo 02 de 50

← Capítulo 01 (rascunho) · Índice de capítulos do curso · Capítulo 03 (rascunho) →