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
- EX004 — Predicado. Escreva um predicado afirmando que o Wrench só pode criar ordens de serviço para ativos do depósito do técnico solicitante. Rubrica: 3 = predicado quantificado correto; 2 = erro menor; 1 = informal; 0 = nenhuma.
- EX005 — Caminhos. Liste os caminhos de não confiável para privilegiado no grafo de Sam e um controle para cada um. Rubrica: 3 = os dois caminhos, controles sensatos; 2 = um; 1 = vago; 0 = nenhuma.
- EX006 — Contagem. Conte as variantes se um atacante muda quaisquer 2 de 50 atributos para um de 3 valores. Rubrica: 3 = C(50,2)×3² = 1,225×9 = 11,025; 2 = deslize aritmético; 1 = só o método; 0 = nenhuma.
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) →