sábado, 30 de março de 2024

O Processamento de Linguagem Natural (NLP) pela IA

 Algumas das primeiras técnicas usadas para analisar texto com computadores envolvem a análise estatística de um corpo de texto (um corpus) para inferir algum tipo de significado semântico. De maneira simples, se você conseguir identificar as palavras mais utilizadas em um determinado documento, geralmente poderá obter uma boa compreensão do seu conteúdo.

Geração de tokens
A primeira etapa na análise de um corpus é dividi-lo em tokens. Para simplificar, você pode pensar em cada palavra distinta no texto de treinamento como um token, embora na realidade, tokens possam ser gerados para palavras parciais ou combinações de palavras e pontuação.

Por exemplo, considere esta frase de um famoso discurso presidencial dos EUA: "we choose to go to the moon" (“Nós escolhemos ir para a lua”). A frase pode ser dividida nos seguintes tokens, com identificadores numéricos:

  1. we
  2. choose
  3. até
  4. GO
  5. o
  6. lua

Observe que "to" (número de token 3) é usado duas vezes no corpus. A frase "we choose to go to the moon" pode ser representada pelos tokens [1,2,3,4,3,5,6].

 Observação
Usamos um exemplo simples no qual os tokens são identificados para cada palavra distinta no texto. No entanto, considere os seguintes conceitos que podem se aplicar à geração de tokens, dependendo do tipo específico de problema de NLP que você está tentando resolver:

  • Normalização de texto: Antes de gerar tokens, você pode optar por normalizar o texto, removendo a pontuação e convertendo todas as palavras para letras minúsculas. Para as análises que dependem apenas da frequência de palavras, essa abordagem melhora o desempenho geral. No entanto, pode ocorrer alguma perda do significado semântico. Por exemplo, considere a frase "A Sra. Rosa plantou uma rosa.". Você pode querer que sua análise diferencie entre a pessoa Sra. Rosa e a rosa que ela plantou. Você também pode querer considerar "rosa". como um token separado de "rosa", porque a inclusão de um ponto fornece a informação de que a palavra está no final de uma frase
  • Remoção de palavra irrelevante (stop word). Palavras vazias são palavras que devem ser excluídas da análise. Por exemplo, o, a ou uns facilitam a leitura do texto para as pessoas, mas acrescentam pouco significado semântico. Ao excluir essas palavras, uma solução de análise de texto pode ser mais capaz de identificar as palavras importantes.
  • n-gramas são frases constituídas de vários termos, como "eu tenho" ou "ele andou". Uma frase de uma única palavra é um unigrama, uma frase de duas palavras é um bigrama, uma frase de três palavras é um trigrama e assim por diante. Ao considerar as palavras como grupos, um modelo de machine learning pode entender melhor um texto.
  • A lematização é uma técnica na qual algoritmos são aplicados para consolidar palavras antes de contá-las, de forma que palavras com a mesma raiz, como “poder”, “poderoso” e “empoderado”, sejam interpretadas como sendo o mesmo token.

Análise de frequência
Depois de gerar os tokens das palavras, você pode executar algumas análises para contar o número de ocorrências de cada token. As palavras mais usadas (além de palavras de parada como "a", "o" e assim por diante) muitas vezes podem fornecer uma pista sobre o assunto principal de um corpus de texto. Por exemplo, as palavras mais comuns em todo o texto do discurso "go to the moon", que consideramos anteriormente, incluem "new", "go", "space" e "moon". Se decidíssemos gerar tokens do texto como bigramas (pares de palavras), o bigrama mais comum na fala seria "a lua". A partir dessas informações, podemos facilmente presumir que o texto trata principalmente de viagens espaciais e de ir para a lua.

 Dica
Uma análise de frequência simples, em que você apenas conta quantas vezes cada token aparece, pode ser eficaz para analisar um único documento. No entanto, quando você precisa distinguir vários documentos dentro do mesmo conjunto, é necessário encontrar uma maneira de identificar quais tokens são mais relevantes em cada um deles. A técnica de Frequência de Termos – Frequência Inversa de Documentos (TF-IDF) é comumente usada para calcular uma pontuação que leva em consideração o número de vezes que uma palavra ou termo aparece em um documento em comparação com sua frequência geral em toda a coleção de documentos. Usando essa técnica, assume-se um alto grau de relevância para palavras que aparecem com frequência em um documento específico, mas relativamente pouco frequente em uma ampla variedade de outros documentos.

Machine learning para classificação de texto
Outra técnica útil de análise de texto é usar um algoritmo de classificação, como regressão logística, para treinar um modelo de machine learning que classifica o texto com base em um conjunto conhecido de categorizações. Uma aplicação comum dessa técnica é treinar um modelo que classifica o texto como positivo ou negativo para executar a análise de sentimento ou a mineração de opiniões.

Por exemplo, considere as seguintes avaliações de um restaurante, que já estão rotuladas como 0 (negativas) ou 1 (positivas):

  • A comida e o serviço estavam ótimos: 1
  • Uma experiência realmente terrível: 0
  • Hmm! comida saborosa e uma vibração boa: 1
  • O serviço é lento e a comida medíocre: 0

Com revisões rotuladas suficientes, você pode treinar um modelo de classificação usando o texto tokenizado como características e o sentimento (0 ou 1) como um rótulo. O modelo irá encapsular uma relação entre tokens e sentimento. Por exemplo, revisões com tokens para palavras como "ótimo", "saborosa" ou "boa" são mais propensas a retornar um sentimento de 1 (positivo), enquanto revisões com palavras como "terrível", "lento" e "medíocre" são mais propensas a retornar 0 (negativo).

Modelos de linguagem semântica
À medida que a alta tecnologia em NLP avançou, a capacidade de treinar modelos que encapsulam a relação semântica entre os tokens levou ao surgimento de modelos de linguagem poderosos. No cerne desses modelos está a codificação dos tokens de linguagem como vetores (matrizes de valores múltiplos) conhecidos como inserções.

Pode ser útil pensar nos elementos de um vetor de inserção de token como coordenadas no espaço multidimensional, de modo que cada token ocupe um "local" específico. Quanto mais próximos os tokens estiverem entre si ao longo de uma dimensão específica, mais semanticamente eles estão relacionados. Em outras palavras, as palavras relacionadas ficam agrupadas mais próximas. Como um exemplo simples, suponha que as inserções para nossos tokens consistem em vetores com três elementos, por exemplo:

  • 4 ("cachorro"): [10.3.2]
  • 5 ("bark"): [10,2,2]
  • 8 ("gato"): [10,3,1]
  • 9 ("miau"): [10,2,1]
  • 10 ("skate"): [3,3,1]

Podemos plotar o local dos tokens com base nesses vetores no espaço tridimensional, desta forma:

 A diagram of tokens plotted on a three-dimensional space.

 Os locais dos tokens no espaço de inserções incluem algumas informações sobre o quão próximos os tokens estão relacionados uns aos outros. Por exemplo, o token para "cachorro" fica próximo de "gato" e também de "latido". Os tokens para "gato" e "latido" ficam próximos de "miau". O token para "skate" fica mais longe dos outros tokens.

Os modelos de linguagem que usamos no setor são baseados nesses princípios, mas sua complexidade é maior. Por exemplo, os vetores usados geralmente têm um número de dimensões muito maior. Também existem várias maneiras de calcular as incorporações apropriadas para um determinado conjunto de tokens. Métodos diferentes resultam em previsões diferentes dos modelos de processamento de linguagem natural.

O diagrama a seguir mostra uma visão geral das soluções modernas de processamento de linguagem natural. Um grande corpus de texto bruto é tokenizado e usado para treinar modelos de linguagem, que podem suportar muitos tipos diferentes de tarefas de processamento de linguagem natural.

A diagram of the process to tokenize text and train a language model that supports natural language processing tasks.

 Entre as tarefas comuns de NLP compatíveis com modelos de linguagem incluem-se:

  • Análise de texto, como extrair termos chave ou identificar entidades nomeadas no texto.
  • Análise de sentimento e mineração de opiniões para categorizar o texto como positivo ou negativo.
  • Tradução automática, na qual o texto é convertido automaticamente de um idioma para outro.
  • Sumarização, na qual os principais pontos de um grande corpo de texto são resumidos.
  • Soluções de IA de conversação, como bots ou assistentes digitais, nas quais o modelo de linguagem pode interpretar a entrada de linguagem natural e retornar uma resposta apropriada.

Estamos acostumados a poder nos comunicar a qualquer momento do dia ou da noite, em qualquer lugar do mundo, colocando as organizações sob pressão para reagir com rapidez em relação às demandas dos clientes. Queremos respostas pessoais para nossas consultas, sem precisar ler a documentação detalhada para encontrar respostas. Isso geralmente significa que a equipe de suporte fica sobrecarregada com solicitações de ajuda por meio de vários canais e que as pessoas são deixadas esperando uma resposta.

A IA de conversação descreve soluções que permitem uma caixa de diálogo entre um agente de IA e um humano. Genericamente, os agentes de IA de conversa são conhecidos como bots. As pessoas podem se envolver com bots por meio de canais como interfaces de chat na Web, email, plataformas de rede social e muito mais.

A resposta a perguntas dá suporte a cargas de trabalho de IA de linguagem natural que exigem um elemento de conversa automatizada. Normalmente, a resposta a perguntas é usada para criar aplicativos de bot que respondem a consultas de clientes. Os recursos de resposta a perguntas podem responder imediatamente, responder a preocupações com precisão e interagir com os usuários de maneira natural com várias transformações. Os bots podem ser implementados em uma variedade de plataformas, como um site ou uma plataforma de rede social.

Os aplicativos de resposta a perguntas fornecem uma maneira amigável de as pessoas obterem respostas para suas dúvidas e permitem que as pessoas lidem com consultas em um momento conveniente para elas, em vez de durante o horário comercial.

No exemplo a seguir, um chat bot usa linguagem natural e fornece opções para um cliente lidar melhor com a consulta. O usuário obtém uma resposta para sua pergunta rapidamente e só é passado para uma pessoa se a consulta for mais complicada.

Screenshot of A chat interface showing user input and responses from a bot.

Em 1950, o matemático britânico Alan Turing desenvolveu o Jogo da Imitação, que se tornou conhecido como Teste de Turing, além de levantar a hipótese de que, caso um diálogo seja natural o suficiente, poderá ser impossível saber se você está conversando com um ser humano ou com um computador. Como a IA (inteligência artificial) está se tornando cada vez mais sofisticada, esse tipo de interação conversacional com aplicativos e assistentes digitais será cada vez mais comum. Além disso, em cenários específicos, poderemos ter interações semelhantes à humana com agentes de IA. Os cenários comuns desse tipo de solução incluem aplicativos de atendimento ao cliente, sistemas de reserva, automação residencial, entre outros.

Para perceber a intenção do jogo da imitação, os computadores deverão aceitar o idioma como entrada (no formato de texto ou áudio), além de conseguir interpretar o significado semântico das entradas. Em outras palavras, entender o que está sendo dito.

Para trabalhar com a compreensão da linguagem coloquial, é preciso levar em conta três conceitos principais: enunciados, entidades e intenções.

Declarações
Enunciado é um exemplo de algo que um usuário poderá dizer e que seu aplicativo deverá interpretar. Ao usar um sistema de automação residencial, um usuário poderá usar os seguintes enunciados:

"Ligar o ventilador."
"Ligar as luzes."

Entidades
Uma entidade é um item ao qual um enunciado se refere. Como ventilador e luz nos seguintes enunciados:

"Ligar o ventilador."
"Acender a luz."

É possível considerar as entidades ventilador e luz como instâncias específicas de uma entidade geral do dispositivo.

Intenções
Uma intenção representa a finalidade ou meta expressada no enunciado de um usuário. Por exemplo, para ambos os enunciados considerados anteriormente, a intenção é ligar um dispositivo; portanto, no seu aplicativo de compreensão de linguagem conversacional, você pode definir uma intenção TurnOn relacionada a esses enunciados.

Um aplicativo de compreensão da linguagem coloquial define um modelo que consiste em intenções e entidades. Os enunciados são usados para treinar o modelo com o objetivo de identificar a intenção e as entidades mais prováveis, às quais ele deverá ser aplicado com base em uma determinada entrada. 

Depois de definir as entidades e intenções com exemplos de enunciados no seu aplicativo de compreensão de linguagem conversacional, você pode treinar um modelo de linguagem para prever intenções e entidades a partir da entrada do usuário, mesmo que não corresponda exatamente aos exemplos de enunciados. Depois será possível usar o modelo de um aplicativo cliente para recuperar previsões e responder de modo adequado.

 Você pode utilizar a compreensão da linguagem coloquial para criar um modelo que preveja intenções e entidades a partir de enunciados de linguagem natural. Um aplicativo cliente poderá usar esse modelo treinado para responder à uma entrada do usuário em uma linguagem natural.

Você pode saber mais sobre a compreensão da linguagem coloquial na documentação do Linguagem de IA do Azure.

 

 

Fundamentos da Pesquisa Visual Computacional

A Pesquisa Visual Computacional é uma das principais áreas da IA (inteligência artificial) e se concentra na criação de soluções que permitem que os aplicativos de IA "vejam" o mundo e o compreendam.

É claro que os computadores não têm olhos biológicos que funcionam como os nossos, mas têm funcionalidade para processar imagens, seja de um feed de câmera ao vivo ou de fotografias ou vídeos digitais. Essa capacidade de processar imagens é a chave para criar um software que pode emular a percepção visual humana.

Processamento de imagens e imagem
Antes de explorarmos o processamento de imagens e outras funcionalidades de pesquisa visual computacional, é útil considerar o que uma imagem realmente é no contexto de dados de um programa de computador.

Imagens como matrizes de pixel
Para um computador, uma imagem é uma matriz de valores numéricos de pixel. Por exemplo, considere a seguinte matriz:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 255 255 255 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

A matriz consiste em sete linhas e sete colunas, representando os valores de pixel para uma imagem de 7 x 7 pixels (que é conhecida como resolução da imagem). Cada pixel tem um valor entre 0 (preto) e 255 (branco); com valores entre esses limites que representam tons de cinza. A imagem representada por essa matriz é semelhante à seguinte imagem (ampliada):

Diagram of a grayscale image.

Aprendizado de máquina para pesquisa visual computacional
A capacidade de usar filtros para aplicar efeitos a imagens é útil em tarefas de processamento de imagem, algo que você pode executar com o software de edição de imagem. No entanto, o objetivo da pesquisa visual computacional é, muitas vezes, extrair significado ou, pelo menos, insights acionáveis de imagens, o que requer a criação de modelos de machine learning treinados para reconhecer recursos com base em grandes volumes de imagens existentes. 

Redes neurais convolucionais (CNNs)
Uma das arquiteturas de modelos de machine learning mais comuns para a pesquisa visual computacional é uma rede neural convolucional (CNN). As CNNs usam filtros para extrair mapas de recursos numéricos de imagens e, em seguida, alimentam os valores desses recursos em um modelo de aprendizado profundo para gerar uma previsão de rótulo. Por exemplo, em um cenário de classificação de imagem, o rótulo representa o assunto principal da imagem (em outras palavras, do que se trata essa imagem?). Você pode treinar um modelo de CNN com imagens de diferentes tipos de frutas (como maçã, banana e laranja) para que o rótulo previsto seja o tipo de fruta em uma determinada imagem.

No processo de treinamento de uma CNN, os kernels de filtro são inicialmente definidos usando valores de peso gerados aleatoriamente. À medida que o processo de treinamento avança, as previsões de modelos são avaliadas em relação aos valores dos rótulos conhecidos, e os pesos do filtro são ajustados para melhorar a precisão. Eventualmente, o modelo treinado para classificação de imagens de frutas usa os pesos dos filtros que melhor extraem recursos, ajudando na identificação de diferentes tipos de frutas.

O diagrama a seguir ilustra como funciona uma CNN para um modelo de classificação de imagem:

Diagram of a convolutional neural network.

  1. Imagens com rótulos conhecidos (por exemplo, 0: maçã, 1: banana ou 2: laranja) são alimentadas na rede para treinar o modelo.
  2. Uma ou mais camadas de filtros são usadas para extrair recursos de cada imagem conforme ela é alimentada pela rede. Os kernels de filtro começam com pesos atribuídos aleatoriamente e geram matrizes de valores numéricos chamados mapas de recursos.
  3. Os mapas de recursos são mesclados em uma única matriz dimensional de valores de recurso.
  4. Os valores de recurso são alimentados em uma rede neural totalmente conectada.
  5. A camada de saída da rede neural usa uma função softmax ou similar para produzir um resultado que contenha um valor de probabilidade para cada possível classe, por exemplo [0,2, 0,5, 0,3].

Durante o treinamento, as probabilidades de saída são comparadas com o rótulo de classe real. Por exemplo, uma imagem de uma banana (classe 1) deve ter o valor [0,0, 1,0, 0,0]. A diferença entre as pontuações de classe previstas e reais é usada para calcular a perda no modelo. Em seguida, os pesos na rede neural totalmente conectada e os kernels de filtro nas camadas de extração de recursos são modificados para reduzir essa perda.

O processo de treinamento é repetido em várias épocas até que um conjunto ideal de pesos seja aprendido. Em seguida, os pesos são salvos e o modelo pode ser usado para prever rótulos de novas imagens para as quais o rótulo é desconhecido.

Observação
Geralmente, as arquiteturas da CNN incluem várias camadas de filtro convolucional e camadas adicionais para reduzir o tamanho dos mapas de recursos, restringir os valores extraídos e manipular os valores dos recursos. Neste exemplo simplificado, essas camadas foram omitidas para se concentrar no conceito principal, que é a utilização dos filtros para extrair recursos numéricos de imagens e, posteriormente, usá-los em uma rede neural para prever rótulos de imagem.

Transformadores e modelos multimodais
As CNNs têm sido o cerne das soluções em pesquisa visual computacional há muitos anos. Embora sejam comumente empregadas para resolver problemas de classificação de imagem, como descrito anteriormente, as CNNs também servem de base para modelos de pesquisa visual computacional mais complexos. Por exemplo, os modelos de detecção de objetos combinam camadas de extração de recursos de CNN com a identificação de regiões de interesse em imagens para localizar várias classes de objeto na mesma imagem.


Conceitos básicos do reconhecimento facial
A análise e detecção facial é uma área da inteligência artificial (IA) que usa algoritmos para localizar e analisar rostos humanos em imagens ou conteúdo de vídeo.

Usos de detecção e análise facial
Há muitos aplicativos para detecção, análise e reconhecimento facial. Por exemplo,

  • O reconhecimento do rosto para fins de segurança pode ser usado na criação de aplicativos de segurança e cada vez mais é usado em sistemas operacionais de smartphones para desbloquear esses dispositivos.
  • Mídia social – o reconhecimento do rosto pode ser usado para marcar automaticamente os amigos conhecidos em fotos.
  • Monitoramento inteligente – por exemplo, um automóvel pode incluir um sistema que monitora o rosto do motorista para determinar se ele está olhando para a estrada, olhando para um dispositivo móvel ou mostrando sinais de cansaço.
  • Publicidade – a análise de rostos em uma imagem pode ajudar a direcionar anúncios para um público-alvo demográfico apropriado.
  • Pessoas desaparecidas – usando sistemas de câmeras públicas, o reconhecimento do rosto pode ser usado para identificar se uma pessoa desaparecida está no quadro da imagem.
  • Validação de identidade – útil em portas de quiosques de entrada em que uma pessoa tem uma permissão de entrada especial.

Entenda a Análise de Detecção Facial
A Detecção Facial envolve a identificação de regiões de uma imagem que contenham um rosto humano, geralmente retornando coordenadas da caixa delimitadora que formam um retângulo ao redor do rosto, como a seguir:

Uma imagem com dois rostos em destaque com retângulos

Com a Análise da Detecção Facial, os recursos faciais podem ser utilizados para treinar modelos de machine learning para retornar outras informações, como características faciais como nariz, olhos, sobrancelhas, lábios e outros.

pontos de referência faciais mostrando dados referentes a características do rosto

Reconhecimento de rosto
Uma outra aplicação de análise facial é treinar um modelo de machine learning para identificar indivíduos conhecidos com base nos traços do rosto deles. Isso é conhecido como Reconhecimento da Detecção Facial e usa várias imagens de um indivíduo para treinar o modelo. Isso treina o modelo para que ele possa detectar esses indivíduos em novas imagens nas quais não foi treinado.

Como o serviço de Detecção Facial indica o local dos rostos nas imagens?
Um conjunto de coordenadas para cada rosto, definindo uma caixa delimitadora retangular em volta do rosto

Um aspecto que pode prejudicar a detecção facial são os "Ângulos extremos": Os melhores resultados são obtidos quando os rostos estão em posição totalmente frontal ou o mais próximo possível dessa posição

Suponha que você tenha arquivos de imagem de placas de trânsito, anúncios ou palavras escritas a giz em um quadro negro. Os computadores podem ler o texto nas imagens usando o reconhecimento óptico de caracteres (OCR), a funcionalidade da inteligência artificial (IA) para processar palavras em imagens transformando-as em texto legível por máquina.

Usos do OCR
Automatizar o processamento de texto pode aumentar a velocidade e a eficiência do trabalho ao remover a necessidade de uma inserção de dados manual. A capacidade de reconhecer texto impresso e manuscrito em imagens é benéfica em situações como tomada de notas, digitalização de prontuários médicos ou documentos históricos, verificação de cheques para depósitos bancários e muito mais.

A capacidade dos sistemas de computação de processar textos escritos e impressos é uma área da IA em que a pesquisa visual computacional se cruza com o processamento de linguagem natural. As funcionalidades do Visão são necessárias para "leitura" do texto e, em seguida, as funcionalidades de processamento de linguagem natural dão sentido a ele.

O OCR é a base do processamento de textos em imagens e usa modelos de machine learning treinados para reconhecer formas individuais como letras, numerais, sinais de pontuação ou outros elementos de texto. Grande parte do trabalho inicial na implementação desse tipo de funcionalidade foi realizada pelos serviços de correios para dar ajudar na classificação automática de correspondências com base em CEPs. Desde então, a tecnologia de última geração para a leitura de texto avançou e já temos modelos que detectam textos impressos ou manuscritos em uma imagem e leem-nos linha por linha e palavra por palavra.

Tipos de Aprendizado de Máquina

Diagram showing supervised machine learning (regression and classification) and unsupervised machine learning (clustering). 

1. Machine Learning supervisionado
O aprendizado de máquina Supervisionado é um termo geral para algoritmos de aprendizado de máquina em que os dados de treinamento incluem valores de recursos e valores conhecidos de rótulo. O aprendizado de máquina supervisionado é utilizado para treinar modelos determinando um relacionamento entre os recursos e os rótulos em observações passadas, de modo que rótulos desconhecidos possam ser previstos para recursos em casos futuros.

1.1. Regressão
Regressão é uma forma de aprendizado de máquina supervisionado em que o rótulo previsto pelo modelo é um valor numérico. Por exemplo:

  • O número de sorvetes vendidos em um determinado dia, com base na temperatura, na chuva e na velocidade do vento.
  • O preço de venda de um imóvel com base no seu tamanho em pés quadrados, no número de quartos que contém e nas métricas socioeconômicas da sua localização.
  • A eficiência de combustível (em milhas por galão) de um carro com base no tamanho do motor, peso, largura, altura e comprimento.

1.2. Classificação
Classificação é uma forma de aprendizado de máquina supervisionado em que o rótulo representa uma categorização, ou classe. Existem dois cenários comuns de classificação.

1.2.1. Classificação binária
Na classificação binária, o rótulo determina se o item observado é (ou não é) uma instância de uma classe específica. Em outras palavras, os modelos de classificação binária preveem um de dois resultados mutuamente exclusivos. Por exemplo:

  • Se um paciente está em risco de diabetes com base em métricas clínicas como peso, idade, nível de glicose no sangue e assim por diante.
  • Se um cliente do banco ficará inadimplente em um empréstimo com base na renda, no histórico de crédito, na idade e em outros fatores.
  • Se um cliente da lista de emails responderá positivamente a uma oferta de marketing com base nos atributos demográficos e nas compras anteriores.
  • Em todos esses exemplos, o modelo prevê uma previsão binária verdadeira/falsa ou positiva/negativa para uma única classe possível.


1.2.2. Classificação multiclasse
A classificação multiclasse amplia a classificação binária para prever um rótulo que representa uma das várias classes possíveis. Por exemplo,

  • A espécie de um pinguim (Adélia, Gentoo ou Chinstrap) com base em suas medidas físicas.
  • O gênero de um filme (comédia, terror, romance, aventura ou ficção científica) com base na equipe de elenco, no diretor e no orçamento.

Na maioria dos cenários que envolvem um conjunto conhecido de várias classes, a classificação multiclasse é utilizada para prever rótulos mutuamente exclusivos. Por exemplo, um pinguim não pode ser um Gentoo e um Adélia. Entretanto, há também alguns algoritmos que você pode utilizar para treinar os modelos de classificação com vários rótulos, nos quais pode existir mais de um rótulo válido para uma única observação. Por exemplo, um filme poderia ser potencialmente categorizado como ficção científica e comédia.

2. Aprendizado de máquina não supervisionado
O aprendizado de máquina não supervisionado envolve o treinamento de modelos usando dados que consistem apenas em valores de recursos sem rótulos conhecidos. Os algoritmos de aprendizado de máquina não supervisionados determinam relacionamentos entre os recursos das observações nos dados de treinamento.

2.1. Clustering
A forma mais comum de aprendizado de máquina não supervisionado é o clustering. Um algoritmo de clustering identifica semelhanças entre observações com base nos seus recursos e as agrupa em clusters discretos. Por exemplo:

  • Agrupe flores semelhantes com base no tamanho, no número de folhas e no número de pétalas.
  • Identificar os grupos de clientes semelhantes com base nos atributos demográficos e no comportamento de compra.

Em alguns aspectos, o clustering é semelhante à classificação multiclasse, pois categoriza as observações em grupos discretos. A diferença é que, ao usar a classificação, você já conhece as classes às quais pertencem as observações nos dados de treinamento; portanto, o algoritmo funciona determinando o relacionamento entre os recursos e o rótulo de classificação conhecido. No clustering, não existe um rótulo de cluster previamente conhecido e o algoritmo agrupa as observações de dados com base puramente na similaridade dos recursos.

Em alguns casos, o clustering é utilizado para determinar o conjunto de classes existentes antes de treinar um modelo de classificação. Por exemplo, você deve usar o clustering para segmentar seus clientes em grupos e, em seguida, analisar esses grupos para identificar e categorizar diferentes classes de clientes (alto valor - baixo volume, pequenos compradores frequentes e assim por diante). Em seguida, você pode usar suas categorizações para rotular as observações nos resultados do clustering e usar os dados rotulados para treinar um modelo de classificação que preveja a qual categoria de cliente um novo cliente pode pertencer.

Aprendizado
O aprendizado profundo é uma forma avançada de aprendizado de máquina que tenta emular a maneira como o cérebro humano aprende. A chave para o aprendizado profundo é a criação de uma rede neural artificial que simula a atividade eletroquímica em neurônios biológicos utilizando funções matemáticas, como mostrado aqui.

As redes neurais artificiais são compostas de várias camadas de neurônios - essencialmente definindo uma função profundamente aninhada. Essa arquitetura é o motivo pelo qual a técnica é chamada de aprendizado profundo e os modelos produzidos por ela são frequentemente chamados de redes neurais profundas (DNNs). Você pode utilizar redes neurais profundas para muitos tipos de problemas de aprendizado de máquina, incluindo regressão e classificação, bem como modelos mais especializados para processamento de linguagem natural e pesquisa visual computacional.

Assim como outras técnicas de aprendizado de máquina discutidas neste módulo, o aprendizado profundo envolve o ajuste dos dados de treinamento a uma função que pode prever um rótulo (y) com base no valor de um ou mais recursos (x). A função (f(x)) é a camada externa de uma função aninhada na qual cada camada da rede neural encapsula funções que operam em x e os valores de peso (w) associados a elas. O algoritmo utilizado para treinar o modelo envolve a alimentação iterativa dos valores dos recursos (x) nos dados de treinamento por meio das camadas para calcular as saídas para ŷ, validando o modelo para avaliar a distância entre os valores calculados ŷ e os valores conhecidos y (que quantifica o nível de erro, ou perda, no modelo) e, em seguida, modificando os pesos (w) para reduzir a perda. O modelo treinado inclui os valores finais de peso que resultam nas previsões mais precisas.

Como uma rede neural aprende?
Os pesos em uma rede neural são fundamentais para a forma como ela calcula os valores previstos para os rótulos. Durante o processo de treinamento, o modelo aprende os pesos que resultarão nas previsões mais precisas. Vamos explorar o processo de treinamento com um pouco mais de detalhes para entender como se dá esse aprendizado.

Diagrama de uma rede neural sendo treinada, avaliada e otimizada.

  1. Os conjuntos de dados de treinamento e validação são definidos e os recursos de treinamento alimentados na camada de entrada.
  2. Os neurônios em cada camada da rede aplicam seus pesos (que são inicialmente atribuídos de forma aleatória) e alimentam os dados por meio da rede.
  3. A camada de saída produz um vetor que contém os valores calculados para ŷ. Por exemplo, uma saída para uma previsão de classe de pinguim pode ser [0,3. 0,1. 0,6].
  4. Uma função de perda é utilizada para comparar os valores previstos ŷ com os valores conhecidos y e agregar a diferença (que é conhecida como perda). Por exemplo, se a classe conhecida para o caso que retornou a saída na etapa anterior for Chinstrap, então o valor y deverá ser [0.0, 0.0, 1.0]. A diferença absoluta entre isso e o vetor ŷ é [0,3, 0,1, 0,4]. Na realidade, a função de perda calcula a variação agregada de vários casos e a resume em um único valor de perda.
  5. Como a rede inteira é essencialmente uma grande função aninhada, uma função de otimização pode utilizar o cálculo diferencial para avaliar a influência de cada peso na rede sobre a perda e determinar como eles podem ser ajustados (para cima ou para baixo) para reduzir a quantidade de perda de modo geral. A técnica de otimização específica pode variar, mas geralmente envolve uma abordagem de descida de gradiente em que cada peso é aumentado ou diminuído para minimizar a perda.
  6. As alterações nos pesos são retropropagadas para as camadas da rede, substituindo os valores utilizados anteriormente.
  7. O processo é repetido em várias iterações (conhecidas como épocas) até que a perda seja minimizada e o modelo preveja com precisão aceitável.

Observação
Embora seja mais fácil pensar em cada caso dos dados de treinamento sendo passado pela rede um de cada vez, na realidade os dados são colocados em lote em matrizes e processados utilizando cálculos algébricos lineares. Por esse motivo, o treinamento da rede neural é melhor executado nos computadores com unidades de processamento gráfico (GPUs) otimizadas para a manipulação de vetores e matrizes.


Serviços de IA do Azure:

https://learn.microsoft.com/pt-br/azure/ai-services/what-are-ai-services#use-azure-ai-services-in-different-development-environments?azure-portal=true

https://contentsafety.cognitive.azure.com

https://microsoftlearning.github.io/mslearn-ai-fundamentals/Instructions/Labs/02-content-safety.html


Algumas questões:

Quais são os três tipos de aprendizado de máquina?
- Aprendizado com supervisão
- Aprendizado sem supervisão
- Aprendizado com reforço
Os três usam algoritmos para aprender sobre dados, e conforme os algoritmos são expostos a mais dados, eles continuam aprendendo e melhorando os resultados.

O que é inteligência artificial?
- Técnicas que ajudam máquinas e computadores a imitarem o comportamento humano

Qual é o exemplo de emulação do cérebro inteiro, em que uma máquina pode pensar e tomar decisões sobre vários assuntos?
- IA Geral
Hoje, essa ramificação da IA é um objetivo, e não uma tecnologia prática. Ela exigirá décadas de pesquisas adicionais e a aquisição de computadores mais poderosos.

Quais são as instruções matemáticas que dizem à máquina como proceder para encontrar a solução de um problema?
- Algoritmos
É a base para a IA e diz ao computador exatamente quais são as etapas para se concluir uma tarefa ou resolver um problema.

Qual é o modelo de aprendizado de máquina que simula a interconectividade com o cérebro humano?
- Rede Neural
Esse tipo de modelo pode aprender coisas, reconhecer padrões e tomar decisões, sem precisar ser programado explicitamente.

Qual aplicação da IA dá aos computadores a capacidade de entender a linguagem humana conforme ela é falada?
- Processamento de linguagem natural
Uma máquina pode responder aos humanos com nuance e entendimento. Um exemplo comum é um chatbot de atendimento ao cliente.

Qual é o principal critério para que um computador ou IA passe no teste de Turing?
- Substituir um dos jogadores sem alterar substancialmente os resultados
Um computador pode ser considerado inteligente se sua conversa não for facilmente distinguida da fala de um humano.

Qual destes é a base de todos os sistemas de IA e permite que algoritmos revelem padrões e tendências?
- Dados
São o combustível da IA e podem ser estruturados ou não estruturados.

Qual ramificação da IA foca em modelos estatísticos para resolver problemas com redes neurais artificiais inspiradas no cérebro humano?
- Deep Learning
É uma tecnologia fundamental por trás dos carros que dirigem sozinhos, permitindo que o computador reconheça um sinal de pare ou diferencie um pedestre de um poste de iluminação.

Qual tecnologia permitirá que as empresas expandam a IA, operem novos algoritmos de treinamento e compartilhem dados através da Internet?
- Nuvem
Essa tecnologia de “internet” fornece aos algoritmos de IA acesso a grandes quantidades de dados.




quarta-feira, 27 de março de 2024

Métodos e códigos HTTP

HTTP oferece suporte a vários métodos para acessar um recurso. No protocolo HTTP, vários métodos de solicitação permitem que o navegador envie informações, formulários ou arquivos ao servidor. Esses métodos são usados, entre outras coisas, para informar ao servidor como processar a solicitação que enviamos e como responder.

Vimos diferentes métodos HTTP usados nas solicitações HTTP testadas nas seções anteriores. Com cURL, se usarmos -v para visualizar a solicitação completa, a primeira linha contém o método HTTP (por exemplo, GET / HTTP/1.1), enquanto com os devtools do navegador (F12), o método HTTP é mostrado na coluna Método. Além disso, os cabeçalhos de resposta também contêm o código de resposta HTTP, que indica o status do processamento de nossa solicitação HTTP.

Métodos de solicitação
A seguir estão alguns dos métodos comumente usados:

GET: Solicita um recurso específico. Dados adicionais podem ser passados ao servidor por meio de strings de consulta na URL (por exemplo, ?param=value).

POST: Envia dados para o servidor. Ele pode lidar com vários tipos de entrada, como texto, PDFs e outras formas de dados binários. Esses dados são anexados ao corpo da solicitação, presente após os cabeçalhos. O método POST é comumente usado ao enviar informações (por exemplo, formulários/logins) ou fazer upload de dados para um site, como imagens ou documentos.

HEAD: Solicita os cabeçalhos que seriam retornados se uma solicitação GET fosse feita ao servidor. Ele não retorna o corpo da solicitação e geralmente é feito para verificar o comprimento da resposta antes de baixar os recursos.

PUT: Cria novos recursos no servidor. Permitir esse método sem controles adequados pode levar ao upload de recursos maliciosos.

DELETE: Exclui um recurso existente no servidor web. Se não for devidamente protegido, pode levar à negação de serviço (DoS), excluindo arquivos críticos no servidor web.

OPTIONS: Retorna informações sobre o servidor, como os métodos por ele aceitos.

PATCH: Aplica modificações parciais ao recurso no local especificado. 

A lista destaca apenas alguns dos métodos HTTP mais comumente usados. A disponibilidade de um método específico depende do servidor e também da configuração do aplicativo. Para obter uma lista completa de métodos HTTP, você pode visitar este link.

Nota: A maioria dos aplicativos web modernos depende principalmente dos métodos GET e POST. No entanto, qualquer aplicativo web que utiliza APIs REST também depende de PUT e DELETE, que são usados para atualizar e excluir dados no endpoint da API, respectivamente. Consulte o módulo Introdução às Aplicações Web para obter mais detalhes.

Códigos de resposta
Os códigos de status HTTP são usados para informar ao cliente o status de sua solicitação. Um servidor HTTP pode retornar cinco tipos de códigos de resposta:

1xx Fornece informações e não afeta o processamento da solicitação.
2xx Retornado quando uma solicitação é bem-sucedida.
3xx Retornado quando o servidor redireciona o cliente.
4xx Significa solicitações indevidas do cliente. Por exemplo, solicitar um recurso que não existe ou solicitar um formato incorreto.
5xx Retornado quando há algum problema com o próprio servidor HTTP. 

A seguir estão alguns dos exemplos comumente vistos de cada um dos tipos de método HTTP acima:

200 OK Retornado em uma solicitação bem-sucedida e o corpo da resposta geralmente contém o recurso solicitado.
302 Found (Encontrado) Redireciona o cliente para outra URL. Por exemplo, redirecionando o usuário para seu painel após um login bem-sucedido.
400 Bad Request Retornado ao encontrar solicitações malformadas, como solicitações com terminadores de linha ausentes.
403 Forbidden (Proibido) Significa que o cliente não tem acesso apropriado ao recurso. Também pode ser retornado quando o servidor detecta uma entrada maliciosa do usuário.
404 Not Found (Não Encontrado) Retornado quando o cliente solicita um recurso que não existe no servidor.
500 Internal Server Error (Erro interno do servidor) Retornado quando o servidor não consegue processar a solicitação.

Para obter uma lista completa dos códigos de resposta HTTP padrão, você pode visitar este link. Além dos códigos HTTP padrão, vários servidores e provedores, como Cloudflare ou AWS, implementam seus próprios códigos.

GET (PEGAR)
Sempre que visitamos qualquer URL(Uniform Resource Locator), nossos navegadores usam como padrão uma solicitação GET para obter os recursos remotos hospedados naquela URL. Assim que o navegador recebe a página inicial que está solicitando; ele pode enviar outras solicitações usando vários métodos HTTP. Isso pode ser observado através da aba Rede no devtools do navegador, conforme visto na seção anterior.

Exercício: Escolha qualquer site de sua preferência e monitore a guia Rede nas ferramentas de desenvolvimento do navegador conforme você o visita para entender o desempenho da página. Essa técnica pode ser usada para entender completamente como uma aplicação web interage com seu back-end, o que pode ser um exercício essencial para qualquer avaliação de aplicação web ou exercício de recompensa de bugs.


Autenticação básica HTTP
Quando visitamos o exercício encontrado no final desta seção, ele nos solicita a inserção de um nome de usuário e uma senha. Ao contrário dos formulários de login usuais, que utilizam parâmetros HTTP para validar as credenciais do usuário (por exemplo, solicitação POST), este tipo de autenticação utiliza uma autenticação HTTP básica, que é tratada diretamente pelo servidor web para proteger uma página/diretório específico, sem interagir diretamente com o aplicativo da web.

Para acessar a página, temos que inserir um par válido de credenciais, que neste caso são admin:admin:

http://<SERVER_IP>:<PORT>/

 

Assim que inserirmos as credenciais, teremos acesso à página: 

http://<SERVER_IP>:<PORT>/

 Vamos tentar acessar a página com cURL e adicionaremos -i para visualizar os cabeçalhos de resposta:

 

venelouis@vene$ curl -i http://<SERVER_IP>:<PORT>/
HTTP/1.1 401 Authorization Required
Date: Mon, 21 Feb 2022 13:11:46 GMT
Server: Apache/2.4.41 (Ubuntu)
Cache-Control: no-cache, must-revalidate, max-age=0
WWW-Authenticate: Basic realm="Access denied"
Content-Length: 13
Content-Type: text/html; charset=UTF-8

Access denied

Como podemos ver, obtemos Acesso negado no corpo da resposta e também obtemos Basic realm="Access negado" no cabeçalho WWW-Authenticate, o que confirma que esta página realmente usa autenticação HTTP básica, conforme discutido na seção Headers (Cabeçalhos). Para fornecer as credenciais por meio de cURL, podemos usar o sinalizador -u, como segue:

venelouis@vene$ curl -u admin:admin http://<SERVER_IP>:<PORT>/

<!DOCTYPE html>
<html lang="en">

<head>
...SNIP...

Desta vez, obtemos a página na resposta. Existe outro método pelo qual podemos fornecer as credenciais básicas de autenticação HTTP, que é diretamente por meio da URL como (nome de usuário: senha@URL), conforme discutimos na primeira seção. Se tentarmos o mesmo com cURL ou nosso navegador, também teremos acesso à página:

venelouis@vene$ curl http://admin:admin@<SERVER_IP>:<PORT>/

<!DOCTYPE html>
<html lang="en">

<head>
...SNIP...

Também podemos tentar visitar o mesmo URL em um navegador e também devemos ser autenticados.

Exercício: Tente visualizar os cabeçalhos de resposta adicionando -i à solicitação acima e veja como uma resposta autenticada difere de uma não autenticada.

Cabeçalho de autorização HTTP
Se adicionarmos a flag -v a qualquer um dos nossos comandos cURL anteriores:

venelouis@venelouis$ curl -v http://admin:admin@<SERVER_IP>:<PORT>/

*   Trying <SERVER_IP>:<PORT>...
* Connected to <SERVER_IP> (<SERVER_IP>) port PORT (#0)
* Server auth using Basic with user 'admin'
> GET / HTTP/1.1
> Host: <SERVER_IP>
> Authorization: Basic YWRtaW46YWRtaW4=
> User-Agent: curl/7.77.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Mon, 21 Feb 2022 13:19:57 GMT
< Server: Apache/2.4.41 (Ubuntu)
< Cache-Control: no-store, no-cache, must-revalidate
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 1453
< Content-Type: text/html; charset=UTF-8
< 

<!DOCTYPE html>
<html lang="en">

<head>
...SNIP...

Como estamos usando autenticação HTTP básica, vemos que nossa solicitação HTTP define o cabeçalho de autorização como Basic YWRtaW46YWRtaW4=, que é o valor codificado em base64 de admin:admin. Se estivéssemos usando um método moderno de autenticação (por exemplo, JWT), a Autorização seria do tipo Bearer e conteria um token criptografado mais longo.

Vamos tentar definir manualmente a Autorização, sem fornecer as credenciais, para ver se ela nos permite acesso à página. Podemos definir o cabeçalho com a flag -H e usaremos o mesmo valor da solicitação HTTP acima. Podemos adicionar a flag -H várias vezes para especificar vários cabeçalhos:

venelouis@vene$ curl -H 'Authorization: Basic YWRtaW46YWRtaW4=' 
http://
<SERVER_IP>:<PORT>/ <!DOCTYPE html <html lang="en"> <head> ...SNIP...

Como vemos, isso também nos deu acesso à página. Estes são alguns métodos que podemos usar para autenticar a página. A maioria dos aplicativos da web modernos usa formulários de login criados com linguagem de script de back-end (por exemplo, PHP), que utiliza solicitações HTTP POST para autenticar os usuários e, em seguida, retornar um cookie para manter sua autenticação.

Parâmetros GET
Uma vez autenticados, temos acesso a uma função City Search, na qual podemos inserir um termo de pesquisa e obter uma lista de cidades correspondentes:

À medida que a página retorna nossos resultados, ela pode entrar em contato com um recurso remoto para obter as informações e, em seguida, exibi-las na página. Para verificar isso, podemos abrir o devtools do navegador e ir até a aba Rede, ou usar o atalho [CTRL+SHIFT+E] para chegar à mesma aba. Antes de inserirmos nosso termo de pesquisa e visualizarmos as solicitações, talvez seja necessário clicar no ícone da lixeira no canto superior esquerdo, para garantir que limpamos todas as solicitações anteriores e monitoramos apenas as solicitações mais recentes:

 network_clear_requests

Depois disso, podemos inserir qualquer termo de pesquisa e pressionar Enter, e notaremos imediatamente uma nova solicitação sendo enviada ao backend:

 network_clear_requests

Quando clicamos na solicitação, ela é enviada para search.php com o parâmetro GET search=le usado na URL. Isso nos ajuda a entender que a função de pesquisa solicita outra página para os resultados.

Agora, podemos enviar a mesma solicitação diretamente para search.php para obter os resultados completos da pesquisa, embora provavelmente os retorne em um formato específico (por exemplo, JSON) sem ter o layout HTML mostrado na imagem acima.

Para enviar uma solicitação GET com cURL, podemos usar exatamente o mesmo URL visto nas capturas de tela acima, pois as solicitações GET colocam seus parâmetros no URL. No entanto, os devtools do navegador fornecem um método mais conveniente de obter o comando cURL. Podemos clicar com o botão direito na solicitação e selecionar Copiar>Copiar como cURL. Então, podemos colar o comando copiado em nosso terminal e executá-lo, e devemos obter exatamente a mesma resposta:

venelouis@vene$ curl 'http://<SERVER_IP>:<PORT>/search.php?search=le' -H  
'Authorization: Basic YWRtaW46YWRtaW4='
Leeds (UK) Leicester (UK)

Nota: O comando copiado conterá todos os cabeçalhos usados na solicitação HTTP. No entanto, podemos remover a maioria deles e manter apenas os cabeçalhos de autenticação necessários, como o cabeçalho Authorization.

Também podemos repetir a solicitação exata diretamente nas ferramentas de desenvolvimento do navegador, selecionando Copiar>Copiar como busca. Isso copiará a mesma solicitação HTTP usando a biblioteca JavaScript Fetch. Então, podemos ir para a aba do console JavaScript clicando em [CTRL+SHIFT+K], colar nosso comando Fetch e pressionar enter para enviar a solicitação:

network_clear_requests

 https://www.youtube.com/watch?v=ytn5kTFSj8I 

 


terça-feira, 26 de março de 2024

Como comparar hashes no linux?

No terminal do Linux, você pode comparar hashes usando o comando diff em conjunto com o comando sha256sum ou md5sum, dependendo do tipo de hash que você está usando. Aqui está um exemplo de como você pode fazer isso:

# Gerar o hash do primeiro arquivo
hash1=$(sha256sum arquivo1.txt)

# Gerar o hash do segundo arquivo
hash2=$(sha256sum arquivo2.txt)

# Comparar os hashes
if [ "$hash1" == "$hash2" ]
then
    echo "Os arquivos são iguais."
else
    echo "Os arquivos são diferentes."
fi 

Neste caso, fi é essencialmente o fechamento do bloco if. É equivalente ao } em muitas outras linguagens de programação. Sem o fi, o shell não saberia onde o bloco if termina, e você receberia um erro de sintaxe. Portanto, sempre que você abrir um bloco if em um script de shell, você deve fechá-lo com fi.

Neste exemplo, substitua arquivo1.txt e arquivo2.txt pelos nomes dos arquivos que você deseja comparar. Este script gera o hash SHA-256 para cada arquivo e, em seguida, compara os hashes. Se os hashes forem iguais, ele imprimirá “Os arquivos são iguais”. Caso contrário, ele imprimirá “Os arquivos são diferentes”.

Lembre-se de que este é apenas um exemplo e você pode precisar ajustá-lo para se adequar às suas necessidades específicas. Por exemplo, se você estiver usando hashes MD5 em vez de SHA-256, você substituiria sha256sum por md5sum no script acima. Além disso, este script pressupõe que você está executando-o em um shell que suporta a sintaxe mostrada (como o Bash, que é o shell padrão na maioria das distribuições Linux). Se você estiver usando um shell diferente, pode precisar ajustar a sintaxe.

Outras opções:

  • É possível utilizar ferramentas gráficas para comparar hashes, como o GtkHash.
  • Você pode usar scripts para automatizar a comparação de hashes em vários arquivos.

Exemplo prático:

Suponha que você baixou um arquivo ISO de um sistema operacional e deseja verificar se ele está corrompido. Você pode baixar o hash MD5 original do site do sistema operacional e compará-lo com o hash do arquivo que você baixou.

# Baixe o hash MD5 original
wget https://www.ubuntu.com/server/releases/focal/MD5SUMS

# Calcule o hash MD5 do arquivo baixado
md5sum ubuntu-20.04.5-live-server-amd64.iso

# Compare os hashes
diff MD5SUMS ubuntu-20.04.5-live-server-amd64.iso

Se os hashes forem iguais, o arquivo ISO não está corrompido. Se os hashes forem diferentes, o arquivo ISO está corrompido e você deve baixá-lo novamente.

 

sábado, 23 de março de 2024

Modelagem de ameaças e resposta a incidentes (Threat Modelling & Incident Response)

A modelagem de ameaças é o processo de revisão, melhoria e teste dos protocolos de segurança em vigor na infraestrutura e nos serviços de tecnologia da informação de uma organização.

Um estágio crítico do processo de modelagem de ameaças é identificar as prováveis ameaças que um aplicativo ou sistema pode enfrentar, as vulnerabilidades às quais um sistema ou aplicativo pode ser vulnerável.



O processo de modelagem de ameaças é muito semelhante a uma avaliação de riscos feita em locais de trabalho para funcionários e clientes. Todos os princípios retornam para:

  • Preparation (Preparação)
  • Identification (Identificação)
  • Mitigations (Mitigações)
  • Review (Análise)

É, no entanto, um processo complexo que necessita de revisão e discussão constantes com uma equipe dedicada. Um modelo de ameaça eficaz inclui:

  • Threat Intelligence (Inteligência de ameaças)
  • Asset Identification (Identificação de ativos)
  • Mitigation Capabilities (Capacidades de mitigação)
  • Risk Assessment (Avaliação de risco)

Para ajudar com isso, existem frameworks como STRIDE (Spoofing identity, Tampering with data, Repudiation threats, Information disclosure, Denial of Service and Elevation of privileges / Falsificação de identidade, Adulteração de dados, Ameaças de repúdio, Divulgação de informações, Negação de serviço e Elevação de privilégios) e PASTA (Process for Attack Simulation and Threat Analysis / Processo para Simulação de Ataque e Análise de Ameaças) infosec nunca teve um sabor tão bom! Vamos detalhar o STRIDE abaixo. STRIDE, de autoria de dois pesquisadores de segurança da Microsoft em 1999, ainda é muito relevante hoje. O STRIDE inclui seis princípios principais, detalhados na tabela abaixo:

  • Spoofing (Falsificação): Este princípio exige que você autentique solicitações e usuários que acessam um sistema. A falsificação envolve uma parte mal-intencionada que se identifica falsamente como outra. Chaves de acesso (como chaves de API) ou assinaturas via criptografia ajudam a remediar essa ameaça.
  • Tampering (Adulteração):  Ao fornecer medidas anti-adulteração a um sistema ou aplicativo, você ajuda a fornecer integridade aos dados. Os dados acessados devem ser mantidos íntegros e precisos. Por exemplo, as lojas utilizam selos em produtos alimentares.
  • Repudiation (Repúdio): Este princípio dita o uso de serviços como registro de atividades para um sistema ou aplicativo rastrear.
  • Information Disclosure (Divulgação de informação): Os aplicativos ou serviços que lidam com informações de vários usuários precisam ser configurados adequadamente para mostrar apenas informações relevantes ao proprietário.
  • Denial of Service (Negação de Serviço): Aplicativos e serviços consomem recursos do sistema; essas duas coisas devem ter medidas em vigor para que o abuso do aplicativo/serviço não resulte na queda de todo o sistema.
  • Elevation of Privilege (Elevação de Privilégio): Este é o pior cenário para um aplicativo ou serviço. Isso significa que um usuário conseguiu escalar sua autorização para um nível superior, ou seja, um administrador. Este cenário muitas vezes leva a uma maior exploração ou divulgação de informações.

Uma violação de segurança é conhecida como incidente. E apesar de todos os modelos de ameaças rigorosos e designs de sistemas seguros, incidentes acontecem. As ações tomadas para resolver e remediar a ameaça são conhecidas como Resposta a Incidentes (IR) e constituem um plano de carreira completo em segurança cibernética.

Os incidentes são classificados usando uma classificação de urgência e impacto. A urgência será determinada pelo tipo de ataque enfrentado, onde o impacto será determinado pelo sistema afetado e qual o impacto que isso terá nas operações comerciais.

Um incidente é respondido por uma Equipe de Resposta a Incidentes de Segurança Informática (CSIRT: Computer Security Incident Response Team), que é um grupo pré-organizado de funcionários com conhecimento técnico sobre os sistemas e/ou incidente atual. Para resolver um incidente com sucesso, essas etapas são frequentemente chamadas de seis fases de Resposta a Incidentes que ocorrem, listadas na tabela abaixo:

  • Preparation: Temos recursos e planos para lidar com o incidente de segurança?
  • Identification: A ameaça e o ator da ameaça foram corretamente identificados oara que possamos responder?
  • Containment (Contenção): A ameaça/ incidente de segurança pode ser contido(a) para prevenir outros sistemas ou usuários de serem impactados?
  • Eradication (Erradicação): Remova a ameaça ativa.
  • Recovery (Recuperação): Peforme uma revisão completa dos sistemas impactados para retornar às operações normais.
  • Lessons Learned (Lições Aprendidas): O que pode ser aprendido do incidente? Ou seja se foi devido a um e-mail de phishing, os funcionários deveriam serem melhores treinados para detectarem e-mails de phishing.

 

 

 

 

 

quinta-feira, 21 de março de 2024

quarta-feira, 20 de março de 2024

Headers (Cabeçalhos) HTTP

Vimos exemplos de solicitações HTTP e cabeçalhos de resposta na seção anterior. Esses cabeçalhos HTTP passam informações entre o cliente e o servidor. Alguns cabeçalhos são usados apenas com solicitações ou respostas, enquanto outros cabeçalhos gerais são comuns a ambos.

Os cabeçalhos podem ter um ou vários valores, anexados após o nome do cabeçalho e separados por dois pontos. Podemos dividir os cabeçalhos nas seguintes categorias:

  1. General Headers (Cabeçalhos Gerais)
  2. Entity Headers (Cabeçalhos de Entidade)
  3. Request Headers (Cabeçalhos de Solicitação)
  4. Response Headers (Cabeçalhos de Resposta)
  5. Security Headers (Cabeçalhos de Segurança)

Vamos discutir cada uma dessas categorias.

General Headers
Cabeçalhos gerais são usados em solicitações e respostas HTTP. Eles são contextuais e são usados para descrever a mensagem ao invés do seu conteúdo.

  • Header: Date
  • Exemplo: Date: Wed, 16 Feb 2022 10:38:44 GMT
  • Descrição: Contém a data e a hora em que a mensagem foi originada. É preferível converter a hora para o fuso horário UTC padrão.
  • Header: Connection
  • Exemplo: Connection: close
  • Descrição: Dita se a conexão de rede atual deve permanecer ativa após a conclusão da solicitação. Dois valores comumente usados para este cabeçalho são close e keep-alive. O valor close do cliente ou do servidor significa que eles gostariam de encerrar a conexão, enquanto o cabeçalho keep-alive indica que a conexão deve permanecer aberta para receber mais dados e entradas. 

Entity Headers
Semelhante aos cabeçalhos gerais, os cabeçalhos de entidade podem ser comuns à solicitação e à resposta. Esses cabeçalhos são usados para descrever o conteúdo (entidade) transferido por uma mensagem. Eles geralmente são encontrados em respostas e solicitações POST ou PUT.

  • Header: Content-Type
  • Example: Content-Type: text/html
  • Descrição: Usado para descrever o tipo de recurso que está sendo transferido. O valor é adicionado automaticamente pelos navegadores do lado do cliente e retornado na resposta do servidor. O campo charset indica o padrão de codificação, como UTF-8.
  • Header: Media-Type
  • Example: Media-Type: application/pdf
  • Descrição: O media-type é semelhante ao Content-Type e descreve os dados que estão sendo transferidos. Este cabeçalho pode desempenhar um papel crucial em fazer com que o servidor interprete nossa entrada. O campo charset também pode ser usado com este cabeçalho.
  • Header: Boundary (Limite)
  • Exemplo: boundary="b4e4fbd93540"
  • Descrição: Atua como um marcador para separar o conteúdo, quando há mais de um na mesma mensagem. Por exemplo, nos dados de um formulário, esse limite é usado como --b4e4fbd93540 para separar diferentes partes do formulário.
  • Header: Content-Length (comprimento do conteúdo)
  • Exemplo: Content-Length: 385
  • Descrição: Contém o tamanho da entidade que está sendo passada. Este cabeçalho é necessário porque o servidor o utiliza para ler dados do corpo da mensagem e é gerado automaticamente pelo navegador e por ferramentas como cURL.
  • Header: Content-Encoding
  • Example: Content-Encoding: gzip
  • Descrição: Os dados podem passar por múltiplas transformações antes de serem transmitidos. Por exemplo, grandes quantidades de dados podem ser compactadas para reduzir o tamanho da mensagem. O tipo de codificação usada deve ser especificado usando o cabeçalho Content-Encoding.

Request Headers
O cliente envia cabeçalhos de solicitação em uma transação HTTP. Esses cabeçalhos são usados em uma solicitação HTTP e não estão relacionados ao conteúdo da mensagem. Os cabeçalhos a seguir são comumente vistos em solicitações HTTP.

  • Header: Host
  • Example: Host: www.inlanefreight.com
  • Descrição: Usado para especificar o host que está sendo consultado para o recurso. Pode ser um nome de domínio ou um endereço IP. Os servidores HTTP podem ser configurados para hospedar diferentes sites, que são revelados com base no nome do host. Isso torna o cabeçalho do host um alvo de enumeração importante, pois pode indicar a existência de outros hosts no servidor de destino.
  • Header: User-Agent
  • Example: User-Agent: curl/7.77.0
  • Descrição: O cabeçalho User-Agent é usado para descrever o cliente que solicita recursos. Este cabeçalho pode revelar muito sobre o cliente, como o navegador, sua versão e o sistema operacional.
  • Header: Referer
  • Example: Referer: http://www.inlanefreight.com/   
  • Descrição: Indica de onde vem a solicitação atual. Por exemplo, clicar em um link nos resultados de pesquisa do Google tornaria https://google.com o referenciador. Confiar neste cabeçalho pode ser perigoso, pois pode ser facilmente manipulado, levando a consequências indesejadas.
  • Header: Accept
  • Example: Accept: */*
  • Descrição: O cabeçalho Aceitar descreve quais tipos de mídia o cliente pode entender. Ele pode conter vários tipos de mídia separados por vírgulas. O valor */* significa que todos os tipos de mídia são aceitos.
  • Header: Cookie
  • Example: Cookie: PHPSESSID=b4e4fbd93540
  • Descrição: Contém pares cookie-valor no formato nome=valor. Um cookie é um dado armazenado no lado do cliente e no servidor, que atua como um identificador. Estes são passados ao servidor por solicitação, mantendo assim o acesso do cliente. Os cookies também podem servir para outros fins, como salvar preferências do usuário ou rastrear sessões. Pode haver vários cookies em um único cabeçalho separados por ponto e vírgula.
  • Header: Authorization
  • Example: Authorization: BASIC cGFzc3dvcmQK
  • Descrição: Outro método para o servidor identificar clientes. Após a autenticação bem-sucedida, o servidor retorna um token exclusivo para o cliente. Ao contrário dos cookies, os tokens são armazenados apenas no lado do cliente e recuperados pelo servidor por solicitação. Existem vários tipos de autenticação com base no servidor web e no tipo de aplicativo usado.

Uma lista completa de cabeçalhos de solicitação e seu uso pode ser encontrada aqui.

Response Headers
Os cabeçalhos de resposta podem ser usados em uma resposta HTTP e não estão relacionados ao conteúdo. Certos cabeçalhos de resposta, como Idade, Local e Servidor, são usados para fornecer mais contexto sobre a resposta. Os cabeçalhos a seguir são comumente vistos em respostas HTTP.

  • Header: Server
  • Example: Server: Apache/2.2.14 (Win32)   
  • Descrição: Contém informações sobre o servidor HTTP que processou a solicitação. Ele pode ser usado para obter informações sobre o servidor, como sua versão, e enumerá-las posteriormente.
  • Header: Set-Cookie
  • Example: Set-Cookie: PHPSESSID=b4e4fbd93540   
  • Descrição: Contém os cookies necessários para identificação do cliente. Os navegadores analisam os cookies e os armazenam para solicitações futuras. Este cabeçalho segue o mesmo formato do cabeçalho de solicitação de cookie.
  • Header: WWW-Authenticate
  • Example: WWW-Authenticate: BASIC realm="localhost"   
  • Descrição: Notifica o cliente sobre o tipo de autenticação necessária para acessar o recurso solicitado.

Security Headers
Finalmente, temos os cabeçalhos de segurança. Com o aumento da variedade de navegadores e ataques baseados na web, foi necessário definir determinados cabeçalhos que aumentassem a segurança. Os cabeçalhos de segurança HTTP são uma classe de cabeçalhos de resposta usados para especificar certas regras e políticas a serem seguidas pelo navegador ao acessar o site.

Header: Content-Security-Policy

Example: Content-Security-Policy: script-src 'self'

Descrição: Dita a política do site em relação a recursos injetados externamente. Pode ser código JavaScript, bem como recursos de script. Este cabeçalho instrui o navegador a aceitar recursos apenas de determinados domínios confiáveis, evitando assim ataques como Cross-site scripting (XSS).

Header: Strict-Transport-Security

Example: Strict-Transport-Security: max-age=31536000

Descrição: Impede que o navegador acesse o site através do protocolo HTTP de texto simples e força toda a comunicação a ser transportada através do protocolo HTTPS seguro. Isso evita que invasores detectem o tráfego da Web e acessem informações protegidas, como senhas ou outros dados confidenciais.

Header: Referrer-Policy

Example: Referrer-Policy: origin

Descrição: Dita se o navegador deve incluir o valor especificado através do cabeçalho Referer ou não. Pode ajudar a evitar a divulgação de URLs e informações confidenciais durante a navegação no site.

Nota: Esta seção menciona apenas um pequeno subconjunto de cabeçalhos HTTP comumente vistos. Existem muitos outros cabeçalhos contextuais que podem ser usados em comunicações HTTP. Também é possível que os aplicativos definam cabeçalhos personalizados com base em seus requisitos. Uma lista completa de cabeçalhos HTTP padrão pode ser encontrada aqui.

cURL
Na seção anterior, vimos como usar a flag -v com cURL nos mostra todos os detalhes da solicitação e resposta HTTP. Se estivéssemos interessados apenas em ver os cabeçalhos de resposta, poderíamos usar a flag -I para enviar uma solicitação HEAD e exibir apenas os cabeçalhos de resposta. Além disso, podemos usar a flag -i para exibir os cabeçalhos e o corpo da resposta (por exemplo, código HTML). A diferença entre os dois é que -I envia uma solicitação HEAD (como veremos na próxima seção), enquanto -i envia qualquer solicitação que especificarmos e também imprime os cabeçalhos.

O comando a seguir mostra um exemplo de saída do uso do sinalizador -I: 

Terminal:

venelouis@vene$ curl -I https://www.inlanefreight.com

Host: www.inlanefreight.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/605.1.15 (KHTML, like Gecko)
Cookie: cookie1=298zf09hf012fh2; cookie2=u32t4o3tb3gg4
Accept: text/plain
Referer: https://www.inlanefreight.com/
Authorization: BASIC cGFzc3dvcmQK

Date: Sun, 06 Aug 2020 08:49:37 GMT
Connection: keep-alive
Content-Length: 26012
Content-Type: text/html; charset=ISO-8859-4
Content-Encoding: gzip
Server: Apache/2.2.14 (Win32)
Set-Cookie: name1=value1,name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT
WWW-Authenticate: BASIC realm="localhost"
Content-Security-Policy: script-src 'self'
Strict-Transport-Security: max-age=31536000
Referrer-Policy: origin

Exercício: Tente passar por todos os cabeçalhos acima e veja se você consegue se lembrar do uso de cada um deles.

Além de visualizar cabeçalhos, cURL também nos permite definir cabeçalhos de solicitação com o sinalizador -H, como veremos em uma seção posterior. Alguns cabeçalhos, como os cabeçalhos User-Agent ou Cookie, têm seus próprios sinalizadores. Por exemplo, podemos usar -A para definir nosso User-Agent, como segue:

Terminal:

venelouis@hvene$ curl https://www.inlanefreight.com -A 'Mozilla/5.0'

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
...SNIP...

Exercício: Tente usar os sinalizadores -I ou -v com o exemplo acima, para garantir que alteramos nosso User-Agent com o sinalizador -A.

Browser DevTools (Ferramentas de desenvolvimento do navegador)
Finalmente, vamos ver como podemos visualizar os cabeçalhos HTTP usando as ferramentas de desenvolvimento do navegador. Assim como fizemos na seção anterior, podemos ir até a aba Rede para visualizar as diferentes solicitações feitas pela página. Podemos clicar em qualquer uma das solicitações para ver seus detalhes:

devtools_network_requests_details

 

Na primeira guia Cabeçalhos, vemos os cabeçalhos de solicitação HTTP e de resposta HTTP. As devtools organizam automaticamente os cabeçalhos em seções, mas podemos clicar no botão Raw para visualizar seus detalhes em formato bruto. Além disso, podemos verificar a aba Cookies para ver quaisquer cookies usados pela solicitação, conforme discutido em uma próxima seção.

cURL

CommandDescription
 curl -hcURL help menu
 curl inlanefreight.comBasic GET request
 curl -s -O inlanefreight.com/index.htmlDownload file
 curl -k https://inlanefreight.comSkip HTTPS (SSL) certificate validation
 curl inlanefreight.com -vPrint full HTTP request/response details
 curl -I https://www.inlanefreight.comSend HEAD request (only prints response headers)
 curl -i https://www.inlanefreight.comPrint response headers and response body
 curl https://www.inlanefreight.com -A 'Mozilla/5.0'Set User-Agent header
 curl -u admin:admin http://<SERVER_IP>:<PORT>/Set HTTP basic authorization credentials
 curl http://admin:admin@<SERVER_IP>:<PORT>/Pass HTTP basic authorization credentials in the URL
 curl -H 'Authorization: Basic YWRtaW46YWRtaW4=' http://<SERVER_IP>:<PORT>/Set request header
 curl 'http://<SERVER_IP>:<PORT>/search.php?search=le'Pass GET parameters
 curl -X POST -d 'username=admin&password=admin' http://<SERVER_IP>:<PORT>/Send POST request with POST data
 curl -b 'PHPSESSID=c1nsa6op7vtk7kdis7bcnbadf1' http://<SERVER_IP>:<PORT>/Set request cookies
 curl -X POST -d '{"search":"london"}' -H 'Content-Type: application/json' http://<SERVER_IP>:<PORT>/search.phpSend POST request with JSON data

APIs

CommandDescription
 curl http://<SERVER_IP>:<PORT>/api.php/city/londonRead entry
 curl -s http://<SERVER_IP>:<PORT>/api.php/city/ | jqRead all entries
 curl -X POST http://<SERVER_IP>:<PORT>/api.php/city/ -d '{"city_name":"HTB_City", "country_name":"HTB"}' -H 'Content-Type: application/json'Create (add) entry
 curl -X PUT http://<SERVER_IP>:<PORT>/api.php/city/london -d '{"city_name":"New_HTB_City", "country_name":"HTB"}' -H 'Content-Type: application/json'Update (modify) entry
 curl -X DELETE http://<SERVER_IP>:<PORT>/api.php/city/New_HTB_CityDelete entry

Browser DevTools

ShortcutDescription
 [CTRL+SHIFT+I] or [F12]Show devtools
 [CTRL+SHIFT+E]Show Network tab
 [CTRL+SHIFT+K]Show Console tab

academy.hackthebox.com/module/35/section/223 (em: 20 mar 2024)

Responda a pergunta abaixo:

Alvo: (x)

O servidor acima carrega a flag após o carregamento da página. Use a guia Rede nas ferramentas de desenvolvimento do navegador para ver quais solicitações são feitas pela página e encontrar a solicitação no sinalizador.

Procure uma solicitação para um arquivo chamado 'flag_...'. Caso não encontre, atualize a página e monitore novas solicitações.

HTB{p493_r3qu3$t$_m0n!t0r}


Postagens mais visitadas