◇ OpenCyber Academy
Técnico · Capítulo 7 · Português

Capítulo 7 — Segurança de IA e aprendizado de máquina: dados e telemetria

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 7 — Segurança de IA e aprendizado de máquina: dados e telemetria

Mapa da aula

Aula 07 publicada. Mapa, exemplo, EX025.

flowchart TD
  N0["7.1 Dados que um serviço de IA usa"]
  N1["7.2 Controlando as mudanças"]
  N2["7.3 Telemetria"]
  N3["7.4 Dados pessoais na telemetria"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4
  N4 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX025"]

Desenho lógico

flowchart LR
  N0["7.1 Dados que um serviço de IA usa"]
  N1["7.2 Controlando as mudanças"]
  N2["7.3 Telemetria"]
  N3["7.4 Dados pessoais na telemetria"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX025"]
[7.1 Dados que um serviço de IA usa]
    |
    v
[7.2 Controlando as mudanças]
    |
    v
[7.3 Telemetria]
    |
    v
[7.4 Dados pessoais na telemetria]
    |
    v
[Síntese]
    |
    v
[Exemplo resolvido] --> [Exercício EX025]

Objetivos de aprendizagem

Você vai (1) gerenciar os dados que um serviço de IA usa — conjuntos de treinamento, índices, registros; (2) controlar quem pode alterá-los; (3) coletar a telemetria necessária para a segurança; (4) proteger os dados pessoais presentes na telemetria.

7.1 Dados que um serviço de IA usa

O SpamShield aprende com mensagens rotuladas; o HelpBot recupera conteúdo de um índice de artigos de ajuda; ambos produzem registros. Cada conjunto de dados tem um responsável, uma classe de sensibilidade e uma lista de pessoas que podem alterá-lo. Mudanças nos dados de treinamento e nos índices mudam o comportamento do sistema tão certamente quanto mudanças no código. Na Kestrel, os responsáveis são concretos. O índice de artigos de ajuda pertence à equipe de conteúdo, e só os responsáveis pelo conteúdo podem publicar; o incidente da restauração de fábrica começou quando a conta de um prestador de serviço publicou sem revisão. Os rótulos de treinamento do SpamShield pertencem à equipe de dados e incluem o feedback dos clientes, e foi assim que 900 denúncias em massa de "não é spam" chegaram a uma rodada de treinamento. A telemetria do LineWatch pertence às operações de rede. O inventário de Ana listou cada conjunto com seu responsável, sua sensibilidade e as contas capazes de alterá-lo.

7.2 Controlando as mudanças

Restrinja quem pode acrescentar ou editar documentos indexados e rótulos de treinamento. Registre cada mudança com quem, quando e o quê. Revise as novas fontes antes de indexá-las. Os ataques de envenenamento — corromper rótulos ou plantar gatilhos de backdoor (Gu et al., arXiv:1708.06733) — dependem de um controle de mudanças frouxo.

"""Lab P: label-flip poisoning and a backdoor trigger on a toy nearest-centroid
classifier (synthetic data, stdlib only). Teaching model only."""
import random
rng = random.Random(11)
def point(label, trigger=False):
    cx = 1.0 if label else -1.0
    x = [rng.gauss(cx, 0.8), rng.gauss(cx, 0.8), 0.0]
    if trigger: x[2] = 5.0          # third feature is the 'trigger'
    return x, label
clean = [point(i % 2) for i in range(400)]
test = [point(i % 2) for i in range(400)]
def fit(data):
    c = {}
    for lab in (0, 1):
        pts = [x for x, y in data if y == lab]
        c[lab] = [sum(p[i] for p in pts)/len(pts) for i in range(3)]
    return c
def pred(c, x):
    d = {k: sum((x[i]-v[i])**2 for i in range(3)) for k, v in c.items()}
    return min(d, key=d.get)
def accuracy(c, data): return sum(pred(c, x) == y for x, y in data)/len(data)
print("label-flip poisoning (flip a fraction of class-1 labels to 0):")
for frac in (0.0, 0.1, 0.2, 0.3, 0.4):
    data = [(x, y) for x, y in clean]; ones = [i for i, (x, y) in enumerate(data) if y == 1]
    for i in ones[:int(frac*len(ones))]: data[i] = (data[i][0], 0)
    print(f"  flipped={frac:.1f} clean_test_accuracy={accuracy(fit(data), test):.3f}")
print("backdoor: add n triggered class-1 points labelled 0")
trig_test = [point(1, trigger=True) for _ in range(200)]
for n in (0, 10, 40, 80):
    data = clean + [(point(1, trigger=True)[0], 0) for _ in range(n)]
    c = fit(data)
    asr = sum(pred(c, x) == 0 for x, _ in trig_test)/len(trig_test)
    print(f"  poison_points={n:3d} clean_accuracy={accuracy(c, test):.3f} attack_success={asr:.3f}")

Saída esperada:

label-flip poisoning (flip a fraction of class-1 labels to 0):
  flipped=0.0 clean_test_accuracy=0.965
  flipped=0.1 clean_test_accuracy=0.965
  flipped=0.2 clean_test_accuracy=0.953
  flipped=0.3 clean_test_accuracy=0.950
  flipped=0.4 clean_test_accuracy=0.945
backdoor: add n triggered class-1 points labelled 0
  poison_points=  0 clean_accuracy=0.965 attack_success=0.075
  poison_points= 10 clean_accuracy=0.963 attack_success=0.145
  poison_points= 40 clean_accuracy=0.963 attack_success=0.685
  poison_points= 80 clean_accuracy=0.968 attack_success=0.980

Depois do incidente do SpamShield, a regra da Kestrel para os dados de treinamento passou a ser: o feedback de uma conta vale no máximo um peso fixo, o feedback em massa acima de um limiar fica retido para revisão, e cada rodada de treinamento registra quais lotes de feedback usou. No índice de artigos, cada publicação registra a conta do autor e o revisor. Esses registros permitiram que Ana encontrasse rapidamente as 900 denúncias e o artigo do prestador de serviço; sem eles, as duas investigações teriam partido apenas dos sintomas.

7.3 Telemetria

Colete: contagens de requisições e de tokens por conta; IDs dos documentos recuperados para cada resposta; chamadas de ferramentas com parâmetros e resultados; decisões de política; versões do modelo e do prompt; erros. Para classificadores: distribuições de pontuação e feedback de rótulos. Use um ID de requisição compartilhado, para que uma conversa possa ser acompanhada de ponta a ponta. Cada campo respondeu a uma pergunta num incidente da Kestrel. Os IDs dos documentos recuperados para cada resposta apontaram o artigo da restauração de fábrica em menos de uma hora. As chamadas de ferramentas com parâmetros revelaram as três contas com mais de 50 reinicializações. Os tokens por conta mostraram o fim de semana das 40.000 mensagens. As versões do modelo e do prompt descartaram uma mudança de modelo no caso da restauração de fábrica. No SpamShield, o feedback de rótulos por conta mostrou as 900 denúncias. O ID de requisição compartilhado é o que permite a um técnico juntar esses registros para uma única conversa.

7.4 Dados pessoais na telemetria

Os registros costumam conter nomes, endereços e números de conta. Mascare ou pseudonimize sempre que possível, restrinja o acesso e defina prazos de retenção. Uma telemetria que vaza dados de clientes cria o problema que deveria detectar. Para o HelpBot, a proposta de Ana manteve os IDs de conta, mas substituiu nomes, endereços e números de telefone no texto das conversas por marcadores antes de os registros saírem do orquestrador, limitou o acesso às conversas brutas ao líder de plantão e definiu 30 dias de retenção para o texto das conversas e um prazo mais longo para os registros de chamadas de ferramentas. Um cliente que digita o endereço de casa para relatar uma falha não deveria encontrá-lo num painel que dezenas de funcionários podem ler. O contador de reinicializações e as buscas por canários funcionaram ambos sobre os registros mascarados.

7.5 Exemplo resolvido (caso sintético da Kestrel)

A acurácia do SpamShield está estável, mas os clientes reclamam de um tipo de mensagem de golpe que está passando. Ana confere o feedback de rótulos: uma conta havia enviado 900 denúncias de "não é spam" para mensagens que continham um determinado link curto. O laboratório mostra como um backdoor pode deixar inalterada a acurácia nos dados limpos enquanto faz as entradas com gatilho passarem. A equipe limita o peso do feedback por conta, revisa o feedback em massa antes do treinamento e acrescenta um conjunto de teste com padrões de golpe conhecidos. O laboratório explica por que a acurácia escondeu o problema. Com 80 pontos envenenados com gatilho, a acurácia nos dados limpos ficou em 0,968 enquanto o gatilho funcionou em 98% das vezes; com 10 pontos, a taxa subiu só para 14,5%, contra uma referência de 7,5%, e com 40 pontos saltou para 68,5%. Um volume de 900 denúncias de uma única conta está muito acima dessa faixa. A acurácia geral, portanto, não é uma verificação de segurança: só um conjunto de teste contendo o próprio padrão do golpe teria mostrado a falha.

7.6 Erros e limites

Três erros são comuns: índices que qualquer pessoa pode editar; telemetria sem IDs de requisição; e dados pessoais não mascarados nos registros. Cada um deles atingiu a Kestrel. Um índice que qualquer pessoa podia editar permitiu que um prestador de serviço publicasse o artigo da restauração de fábrica e que outra edição mandasse o HelpBot reiniciar roteadores cinco vezes. Sem IDs de requisição, ligar uma resposta ruim ao artigo que ela recuperou significaria cruzar à mão as marcas de horário de três registros. Dados pessoais não mascarados nos registros transformam cada sessão de diagnóstico numa exposição de privacidade; as cópias mascaradas bastaram para todas as verificações descritas neste capítulo.

Exercícios

Síntese

Os dados e a telemetria moldam e revelam o comportamento da IA: controle quem altera os dados, colete telemetria rastreável e proteja os dados pessoais que ela contém.

Continue estudando — capítulo 07 de 18

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