O tópico de segurança do aprendizado de máquina tem sido bastante exagerado ultimamente e eu queria abordar o lado prático. E então o motivo interessante é o
PHDays , onde uma variedade de especialistas do mundo da segurança da informação se reúne e há uma oportunidade de chamar a atenção para esse tópico.
Em geral, fizemos um CTF baseado em tarefas, com tarefas que afetam parte dos riscos à segurança do uso de técnicas de aprendizado de máquina.

O que é CTF ???Capture The Flag (CTF) é uma competição de segurança de computadores muito popular (em popularidade como uma competição de kaggle para datacentistas). Existem dois formatos: tarefa (jeorpady) e serviço (defesa-ataque). Nós fizemos tarefa.
As competições de tarefas clássicas se assemelham ao formato de "seu jogo". Quando há um conjunto de tarefas de diferentes categorias que têm custos diferentes.
As categorias tradicionais no CTF são: vulnerabilidades web - web, engenharia reversa - reversa, criptografia - criptografia, estegano - esteganografia, exploração pwn - binária.
As equipes (de 1 a n pessoas) resolvem tarefas e quem resolve tarefas para um número maior de pontos é um ótimo companheiro.
Nossa competição durou um pouco mais de um dia. Entendeu-se que é individual - equipes de uma pessoa. Eu queria que as pessoas participassem da conferência para se conhecerem pessoalmente. Portanto, as tarefas devem ser resolvidas em algumas horas, não requerem muitos recursos de computação; no entanto, tarefas difíceis também devem ser - nem todas devem vencer: D
Como resultado, tivemos seis tarefas (a sétima foi apenas divertida), parece que para uma pessoa por dia é suficiente. Infelizmente, as tarefas em si não estão mais disponíveis. Mas talvez depois de ler a análise, você queira participar da próxima vez?

Gostaria de expressar minha profunda gratidão aos caras sem os quais esse CTF não teria ocorrido:
@groke e
@mostobriv . As melhores idéias, soluções técnicas e uma festa de implantação na noite anterior ao início - o que poderia ser mais bonito quando se está em uma empresa fantástica ?! :)
Stegano: Aww - 100
tiny.cc/6fj06yConjunto de dados de Dan de 3 391 fotos de gatos e cães.

A missão foi marcada como "Stegano". Trabalhos acolchoados envolvem ocultar algumas informações. Parecia fácil adivinhar que cães e gatos são algo binário. Após um pouco de reflexão, podemos assumir que essa sequência de cães e gatos pode ser algum tipo de mensagem binária. Suponha que os selos sejam 1 e os cães - 0. Se de repente não der certo, você pode simplesmente trocá-los. Em seguida, encontramos um modelo treinado que classifica cães e gatos. Existem muitos exemplos de lições sobre a classificação de cães e gatos, bem como modelos treinados depois deles - você pode encontrar modelos treinados no github. Adotamos um modelo treinado; em casos extremos, treinamos a nós mesmos. Prevemos cada imagem como 0 ou 1. E essa sequência de "bytes" é traduzida em uma sequência.
Você pode ver a solução do autor aqui | import time |
| import sys |
| import os |
| |
| import numpy as np |
| |
| from keras.models import load_model |
| from keras.preprocessing import image |
| |
| data_path = "../data/" |
| picture_path = data_path + "{}.jpg" |
| |
| CLASSES = [1, 0] |
| |
| def run(model_path): |
| pictures_names = os.listdir(data_path) |
| pic_num = len(pictures_names) |
| |
| model = load_model(model_path) |
| |
| res = [] |
| for pic in range(pic_num): |
| img = image.load_img(picture_path.format(pic), target_size=(224,224)) |
| x = image.img_to_array(img) |
| x = np.expand_dims(x, axis=0) |
| preds = model.predict(x) |
| |
| y_classes = preds.argmax(axis=-1) |
| res.append(CLASSES[y_classes[0]]) |
| |
| res = ''.join(map(str, res)) |
| |
| n = int("0b" + res, 2) |
| text = n.to_bytes((n.bit_length() + 7) // 8, 'big').decode() |
| |
| print(text) |
| |
| |
| if __name__ == '__main__': |
| if len(sys.argv) < 2: |
| print("path to the model expected") |
| exit(1) |
| |
| run(sys.argv[1]) |
Obtemos o texto que contém a bandeira `AICTF {533m5_y0u_und3r574nd_4n1m4l5}`.
No entanto, por algum motivo, vários participantes, em momentos diferentes, tentaram passar uma bandeira estranha com a palavra “adotado”. Não sabemos de onde eles tiraram, se de repente os participantes explicarem, será legal: D
Anotações

O serviço era uma espécie de "blog", onde cada usuário podia deixar entradas públicas e privadas. Como a funcionalidade era pequena - não foi difícil adivinhar que você precisa obter um registro particular.
Na verdade, havia apenas um campo de entrada - o ID do registro.
O que fazer
A primeira coisa que vem à mente de um guarda de segurança é tentar injeções de sql. No entanto, diz-se que o serviço é protegido por IA. E não pude enviar uma injeção simples de sql. O serviço respondeu a esse ataque com "Tentativa de invasão!" Muitos tentaram passar como uma bandeira, mas realmente pensaram que tudo é tão simples?
Sob o capô do teste, havia uma rede LSTM que analisava o id para injeção de sql. No entanto, a entrada para o LSTM deve ter um comprimento fixo. Para simplificar, limitamos a 20 caracteres. Ou seja, a lógica era a seguinte: aceitamos a solicitação, se tiver mais de 20 caracteres - cortamos e verificamos o restante, se menor, e adicionamos 0.
Na verdade, portanto, a injeção simples de sql não funcionou imediatamente.
No entanto, houve uma chance de encontrar um vetor que a rede não veria e aceitaria para uma boa solicitação.
Novo leitor QR do Edge

Era necessário reconhecer o código QR:

Arquivos para tarefa estão disponíveis
aquiVários arquivos criptografados foram fornecidos. Entre eles, estava um arquivo pyc, revertendo-o, era óbvio que havia uma função pelo código da qual era possível entender que todos os arquivos necessários eram criptografados em AES na chave, que era recebida do bytecode dessa função e de outro dentro dela.
Havia duas soluções possíveis: analisar o arquivo pyc e obter a implementação das funções ou criar seu próprio módulo proxy hashlib, que produziria seu argumento e o executaria, você poderia obter uma chave, descriptografar os arquivos e executar o QR-Reader, que reconheceu a imagem proposta como uma bandeira.
Uma decisão detalhada do participante que ficou em 3º lugar pode ser encontrada aqui:
Desafio de previsão

O serviço era uma espécie de competição como no kaggle. Foi possível registrar, baixar dados e enviar modelos, eles foram testados em dados privados e o resultado foi registrado em um scorboard.
E o objetivo parece óbvio - obter 1,0 de precisão.
Foi difícil? Impossível: D
Os dados foram gerados aleatoriamente e, é claro, estava implícito que essa precisão precisava ser obtida de alguma outra maneira. O serviço aceitou modelos no formato .pickle. E parece que todo mundo já sabe, mas acontece que nem todos podem obter o
RCE através de picles, mas o que poderia ser pior?
Decisão de Nikita (konodyuk)
Na verdade, isso tinha que ser feito! Tendo obtido acesso remoto ao servidor, foi possível fazer o download dos dados nos quais a solução foi testada, treinar novamente o modelo e obter precisão de 1,0 e, com ele, o sinalizador.
Fotograma

Como o nome sugere, o serviço faz algo com imagens.
Uma interface de aplicativo impressionante sugeria o upload de uma foto.

Em resposta, uma imagem com um estilo alterado e o logotipo da competição foi enviada a você.

Onde está a bandeira aqui?
Parece bastante comum encontrar vulnerabilidades comuns no CTF - desta vez foi o
Image Tragick . No entanto, poucos adivinharam ou nem todos que tentaram foram explorados.
Antivírus da nova era
Essa tarefa acabou sendo uma cereja no bolo e um problema não resolvido. Embora, depois de conversar com os participantes, eles se mostrassem muito próximos da resposta.

Os arquivos da tarefa podem ser visualizados
aquiO sistema recebe o bytecode python e é executado em casa. Mas, é claro, ela não fará apenas isso, porque existe uma "IA". Ele verifica a versão do python e não permite o "errado". Se o código passou no teste, foi lançado no servidor - o que significa que você pode obter muitas informações.
O bytecode que o intérprete fornece pode ser diluído em bits, e a rede neural verificada perderia (também era LSTM), ou você poderia adicionar um monte de lixo no final.
Além disso, quando você sabe como executar o código Python, foi possível detectar o binário `flag_reader` no servidor, que foi iniciado a partir da raiz. O binar tinha uma vulnerabilidade de cadeia de formato através da qual o sinalizador podia ser lido.
A solução da Nikita (konodyuk) também pode ser encontrada aqui.Sumário
No final da competição, 130 inscritos, 14 passaram pelo menos uma bandeira e 5 de 6 tarefas foram resolvidas - o que significa que conseguimos equilibrar as tarefas complexas e fáceis.
Considerando que não divulgamos muito as informações, como fizemos pela primeira vez e não estaríamos prontos para uma carga pesada, ainda consideramos a competição super bem-sucedida.
Prêmios ganhos:- 1º lugar - silencioso
- 2º lugar - kurmur
- 3º lugar - konodyuk
Os vencedores foram premiados no final do segundo dia do PHDays com honras e prêmios legais: AWS DeepLens, Coral Dev Board e uma mochila com o logotipo da conferência.
Os caras que normalmente jogam no CTF clássico e agora gostam de aprendizado de máquina classificaram o nosso concurso, por isso esperamos que da próxima vez se juntem os datacentistas interessados em segurança.