Coletar registros do HackerOne

Compatível com:

Este documento explica como configurar o HackerOne para enviar registros ao Google Security Operations usando webhooks.

O HackerOne é uma plataforma de coordenação de vulnerabilidades e recompensas por bugs que conecta organizações a pesquisadores de segurança para identificar e corrigir vulnerabilidades de segurança. A plataforma oferece programas de recompensas por bugs, programas de divulgação de vulnerabilidades, testes de penetração e testes contínuos de segurança durante todo o ciclo de vida de desenvolvimento de software.

Antes de começar

Verifique se você atende os seguintes pré-requisitos:

  • Uma instância do Google SecOps
  • Programa HackerOne com nível Professional ou Enterprise (webhooks estão disponíveis apenas para esses níveis)
  • Acesso administrativo às configurações do programa HackerOne

Criar um feed de webhook no Google SecOps

Criar o feed

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Na próxima página, clique em Configurar um único feed.
  4. No campo Nome do feed, insira um nome para o feed (por exemplo, HackerOne Vulnerability Reports).
  5. Selecione Webhook como o Tipo de origem.
  6. Selecione HackerOne como o Tipo de registro.
  7. Clique em Próxima.
  8. Especifique valores para os seguintes parâmetros de entrada:
    • Delimitador de divisão (opcional): deixe em branco. Cada solicitação de webhook contém um único evento JSON.
    • Namespace do recurso: o namespace do recurso.
    • Rótulos de ingestão: o rótulo a ser aplicado aos eventos deste feed.
  9. Clique em Próxima.
  10. Revise a nova configuração do feed na tela Finalizar e clique em Enviar.

Gerar e salvar a chave secreta

Depois de criar o feed, gere uma chave secreta para autenticação:

  1. Na página de detalhes do feed, clique em Gerar chave secreta.
  2. Uma caixa de diálogo mostra a chave secreta.
  3. Copie e salve a chave secreta com segurança.

Receber o URL do endpoint do feed

  1. Acesse a guia Detalhes do feed.
  2. Na seção Informações do endpoint, copie o URL do endpoint do feed.
  3. O formato do URL é:

    https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    

    ou

    https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    
  4. Salve esse URL para as próximas etapas.

  5. Clique em Concluído.

Criar chave de API do Google Cloud

O Chronicle exige uma chave de API para autenticação. Crie uma chave de API restrita no console do Google Cloud.

Criar a chave de API

  1. Acesse a página "Credenciais" do Console do Google Cloud.
  2. Selecione seu projeto (o projeto associado à sua instância do Chronicle).
  3. Clique em Criar credenciais > Chave de API.
  4. Uma chave de API é criada e exibida em uma caixa de diálogo.
  5. Clique em Editar chave de API para restringir a chave.

Restringir a chave de API

  1. Na página de configurações da chave de API:
    • Nome: insira um nome descritivo, por exemplo, Chronicle HackerOne Webhook API Key.
  2. Em Restrições de API:
    1. Selecione Restringir chave.
    2. Na lista Selecionar APIs, pesquise e selecione API Google SecOps (ou API Chronicle).
  3. Clique em Salvar.
  4. Copie o valor da chave de API do campo Chave de API na parte de cima da página.
  5. Salve a chave de API com segurança.

Configurar o webhook do HackerOne

Criar o URL do webhook

  • Combine o URL do endpoint do Chronicle e a chave de API:

    <ENDPOINT_URL>?key=<API_KEY>
    
    • Exemplo:

      https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...
      

Criar webhook no HackerOne

  1. Faça login no HackerOne e navegue até seu programa.
  2. Acesse Engajamentos, clique no menu kebab do programa que você quer configurar e em Configurações.
  3. Acesse Automação > Webhooks.
  4. Clique em Novo webhook.
  5. Informe os seguintes detalhes de configuração:
    • URL de payload: cole o URL completo do endpoint com a chave de API acima.
    • Secret: cole a chave secreta da criação do feed do Chronicle.
    • Selecione os eventos que você quer usar para acionar o webhook: escolha uma das seguintes opções:
      • Envie tudo: todos os eventos vão acionar o webhook.
      • Quero especificar eventos individuais: selecione os eventos específicos que você quer enviar ao Chronicle. Eventos recomendados para monitoramento de segurança:
        • report_created: quando um hacker envia uma nova denúncia de vulnerabilidade
        • report_triaged: quando um relatório é triado
        • report_resolved: quando uma denúncia é resolvida
        • report_bounty_awarded: quando uma recompensa é concedida
        • report_swag_awarded: quando um brinde é concedido
        • program_hacker_joined: quando um hacker entra no programa
        • program_hacker_left: quando um hacker sai do programa
  6. Clique em Add webhook.

Testar o webhook

  1. Na página de configuração do webhook, selecione Solicitação de teste para enviar um exemplo de solicitação ao URL de payload configurado.
  2. Verifique se a resposta é HTTP 200.
  3. Verifique o feed do Chronicle para o evento de teste em um ou dois minutos.

Verificar se o webhook está funcionando

Verificar o status do webhook do HackerOne

  1. Faça login no console do HackerOne.
  2. Acesse Engajamentos, clique no menu kebab do seu programa e em Configurações.
  3. Acesse Automação > Webhooks.
  4. Clique no webhook para conferir os detalhes.
  5. Na seção Entregas recentes, verifique se as entregas recentes mostram o status "Concluído" (HTTP 200).
  6. Clique em qualquer entrega para ver a solicitação de payload POST.

Verificar o status do feed do Chronicle

  1. Acesse Configurações do SIEM > Feeds no Chronicle.
  2. Localize seu feed de webhook do HackerOne.
  3. Verifique a coluna Status (deve ser Ativo).
  4. Verifique a contagem de Eventos recebidos (ela precisa estar aumentando).
  5. Verifique o carimbo de data/hora Última execução bem-sucedida em (deve ser recente).

Verificar registros no Chronicle

  1. Acesse Pesquisar > Pesquisa do UDM.
  2. Use a seguinte consulta:

    metadata.vendor_name = "HACKERONE" AND metadata.product_name = "HACKERONE"
    
  3. Ajuste o período para a última hora.

  4. Verifique se os eventos aparecem nos resultados.

Referência de métodos de autenticação

Os feeds de webhook do Chronicle são compatíveis com vários métodos de autenticação. Os webhooks do HackerOne usam uma combinação de parâmetros de consulta e validação de assinatura.

O HackerOne envia webhooks para o URL de payload configurado. A autenticação é processada por:

  • Chave de API no URL: a chave de API do Chronicle é anexada como um parâmetro de consulta ao URL de payload.
  • Validação de assinatura secreta: o HackerOne gera um cabeçalho X-H1-Signature que contém um hexdigest HMAC SHA256 do corpo da solicitação assinado com o segredo configurado.

    • Formato do URL:

      <ENDPOINT_URL>?key=<API_KEY>
      
    • Formato da solicitação:

      POST <ENDPOINT_URL>?key=<API_KEY> HTTP/1.1
      Content-Type: application/json
      X-H1-Signature: sha256=<HMAC_HEXDIGEST>
      X-H1-Event: <EVENT_TYPE>
      X-H1-Delivery: <DELIVERY_ID>
      
      {
        "data": {
          "activity": {...},
          "report": {...}
        }
      }
      
  • Vantagens:

    • Autenticação dupla: chave de API para acesso ao Chronicle e assinatura para validação de payload
    • O HackerOne oferece geração de assinatura integrada.
    • Verificação segura da integridade do payload

Validação de assinatura

  • O HackerOne inclui os seguintes cabeçalhos em cada solicitação de webhook:

    • X-H1-Signature: hexdigest HMAC SHA256 do corpo da solicitação (formato: sha256=<hexdigest>)
    • X-H1-Event: o tipo de evento que acionou o webhook.
    • X-H1-Delivery: identificador exclusivo da entrega.
  • Para validar a assinatura no endpoint de recebimento:

    import hmac
    import hashlib
    
    def validate_request(request_body, secret, signature):
        _, digest = signature.split('=')
        generated_digest = hmac.new(
            secret.encode(),
            request_body.encode(),
            hashlib.sha256
        ).hexdigest()
        return hmac.compare_digest(digest, generated_digest)
    

Tipos de eventos de webhook

O HackerOne é compatível com os seguintes tipos de eventos de webhook:

Tipo de evento Descrição
report_created Acionado quando um hacker envia um novo relatório de vulnerabilidade.
report_triaged Acionado quando uma denúncia é analisada
report_resolved Acionado quando uma denúncia é resolvida
report_bounty_awarded Acionado quando uma recompensa é concedida por uma denúncia
report_swag_awarded Acionado quando um brinde é concedido por uma denúncia
report_became_public Acionada quando uma denúncia se torna pública
program_hacker_joined Acionado quando um hacker entra no programa
program_hacker_left Acionado quando um hacker sai do programa

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
attributes.cleared, attributes.rules_of_engagement_signed, attributes.identity_verified, attributes.background_checked, attributes.citizenship_verified, attributes.residency_verified, type, attributes.title, attributes.main_state, attributes.state, relationships.reporter.data.type, relationships.reporter.data.attributes.reputation, relationships.reporter.data.attributes.signal, relationships.reporter.data.attributes.impact, relationships.reporter.data.attributes.disabled, relationships.reporter.data.attributes.profile_picture.62x62, relationships.reporter.data.attributes.profile_picture.82x82, relationships.reporter.data.attributes.profile_picture.110x110, relationships.reporter.data.attributes.profile_picture.260x260, relationships.reporter.data.attributes.hackerone_triager, relationships.program.data.id, relationships.program.data.type, relationships.program.data.attributes.handle, relationships.severity.data.type, relationships.severity.data.attributes.rating, relationships.severity.data.attributes.author_type, relationships.severity.data.attributes.calculation_method, relationships.weakness.data.id, relationships.weakness.data.type, relationships.weakness.data.attributes.name, relationships.weakness.data.attributes.description, relationships.weakness.data.attributes.external_id, relationships.structured_scope.data.id, relationships.structured_scope.data.type, relationships.structured_scope.data.attributes.asset_type, relationships.structured_scope.data.attributes.eligible_for_bounty, relationships.structured_scope.data.attributes.eligible_for_submission, relationships.structured_scope.data.attributes.instruction, relationships.structured_scope.data.attributes.max_severity, relationships.structured_scope.data.attributes.confidentiality_requirement, relationships.structured_scope.data.attributes.integrity_requirement, relationships.structured_scope.data.attributes.availability_requirement, relationships.inboxes.data.id, relationships.inboxes.data.type, relationships.inboxes.data.attributes.name, relationships.inboxes.data.attributes.type additional.fields Unidos como rótulos de chave-valor
timestamp metadata.event_timestamp Analisado usando o filtro de data com o formato yyyy-MM-dd'T'HH:mm:ss.SSSZ
metadata.event_type Definido como "STATUS_UPDATE" se has_principal for verdadeiro, "USER_UNCATEGORIZED" se has_principal_user_user for verdadeiro, caso contrário, "GENERIC_EVENT"
ID metadata.product_log_id Valor copiado diretamente
relationships.structured_scope.data.attributes.asset_identifier principal.asset.asset_id Prefixo "ASSET:"
attributes.email_alias principal.user.email_addresses Mesclado
relationships.reporter.data.id principal.user.employee_id Valor copiado diretamente
relationships.reporter.data.attributes.name principal.user.first_name Valor copiado diretamente
attributes.username, relationships.reporter.data.attributes.username principal.user.user_display_name Valor de "relationships.reporter.data.attributes.username" se não estiver vazio. Caso contrário, "attributes.username".
relationships.severity.data.attributes.user_id principal.user.userid Valor copiado diretamente
relationships.severity.data.id security_result.rule_id Valor copiado diretamente
relationships.severity.data.attributes.max_severity security_result.severity Convertido para maiúsculas
attributes.vulnerability_information security_result.summary Valor copiado diretamente

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.