Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
linux-entra-sso-PoC — PoC — erro de validação de origem que permite a exfiltração do cookie SSO PRT do Entra ID no linux-entra-sso (GHSA-g9vc-5j77-f2cm, CVE-2026-87005, CVSS 5.3). | Kitploit
Ferramentas/GitHubGitHub/squeeze440/linux-entra-sso-poc
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebColeta de InformaçõesSegurança WebTestes de PenetraçãoAutenticaçãoPapers e Pesquisa
GitHub
squeeze440/linux-entra-sso-poc

linux-entra-sso-PoC

PoC — erro de validação de origem que permite a exfiltração do cookie SSO PRT do Entra ID no linux-entra-sso (GHSA-g9vc-5j77-f2cm, CVE-2026-87005, CVSS 5.3).

Ver Repositório
há 8 diasAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Resumo

Status da CVE: solicitada, aguardando atribuição. Esta descoberta é publicada como GHSA-g9vc-5j77-f2cm. Após a atribuição da CVE, este repositório é renomeado para CVE-YYYY-NNNNN-linux-entra-sso-PoC e este banner é substituído pelo link da CVE.

PesquisadorDostxodjayev Abdullox (@squeeze440)
AvisoGHSA-g9vc-5j77-f2cm
CVSS 3.15.3 (Médio)
FraquezaCWE-346, CWE-20

Resumo

Platform.SSO_URL em linux-entra-sso não possui um separador de caminho à direita, portanto a proteção onBeforeSendHeaders do Firefox/Thunderbird (e.url.startsWith(Platform.SSO_URL)) é contornada por qualquer domínio registrado pelo atacante no formato login.microsoftonline.com.<attacker-domain>, fazendo com que a extensão adquira e injete um cookie SSO de Primary Refresh Token (PRT) do Entra ID ativo em requisições enviadas ao próprio host do atacante.

Produto

siemens/linux-entra-sso — Plugin de navegador para Linux para SSO no Microsoft Entra ID através do Microsoft Identity Broker local (Intune). A versão para Firefox é praticamente explorável; o Thunderbird compartilha o caminho de código vulnerável idêntico, mas atualmente não é alcançável por este vetor (ver Detalhes); Chrome/Chromium não é afetado (ver Detalhes).

Versão Testada

v1.10.0 (commit 676854c, main atual em 2026-08-03). Confirmado presente na versão atual, ou seja, não corrigido por GHSA-52rj-42vh-2rxc / CVE-2026-42177 (aquela correção tocou apenas o adaptador declarativeNetRequest do Chrome).

CVSS v3.1 Estimado

5.3 (Médio) — CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:N/A:N

  • AC:H — a exploração requer que a extensão possua uma permissão de host concedida que cubra o hostname elaborado pelo atacante. Na prática, o atacante deve enganar a vítima para que ela clique no link "Background SSO (enable)" da extensão enquanto estiver na página do atacante — uma condição fora do controle direto do atacante, correspondendo à justificativa de complexidade usada para o GHSA-52rj-42vh-2rxc irmão.
  • UI:R — a concessão de permissão é um clique explícito do usuário.
  • C:H — um cookie SSO PRT roubado é diretamente reproduzível contra login.microsoftonline.com para emitir tokens de acesso/ID para qualquer aplicativo que a vítima tenha consentido (sequestro completo da sessão SSO).
  • I:N/A:N — o bug divulga uma credencial, mas não modifica dados nem disponibilidade por si só.

Detalhes

Causa raiz — src/platform.js:9:

root@kitploit:~
static SSO_URL = "https://login.microsoftonline.com";

Sem / à direita.

Verificação vulnerável — platform/firefox/js/platform-firefox.js:55-59:

root@kitploit:~
async #onBeforeSendHeaders(e) {
    // filter out requests that are not part of the OAuth2.0 flow
    if (!e.url.startsWith(Platform.SSO_URL)) {
        return { requestHeaders: e.requestHeaders };
    }
    ...

String.prototype.startsWith realiza uma comparação bruta de prefixo de caracteres, não uma comparação de hostname/origem. Como Platform.SSO_URL não possui um separador à direita, qualquer URL cujo host seja login.microsoftonline.com.<anything> — um nome DNS sintaticamente válido totalmente controlado pelo atacante — também satisfaz a verificação, por exemplo:

root@kitploit:~
"https://login.microsoftonline.com.attacker.example/phish".startsWith("https://login.microsoftonline.com")
=> true

Esta é a mesma verificação defensiva que a própria descrição do GHSA-52rj-42vh-2rxc chamou de "a verificação defensiva canônica ... ausente do adaptador do Chrome" — ela existe aqui, mas é ela própria contornável, então a correção do aviso (que apenas reforçou a regra declarativeNetRequest do Chrome) deixou este caminho aberto. platform/thunderbird/js/platform-thunderbird.js estende PlatformFirefox sem sobrescrever update_request_handlers() ou #onBeforeSendHeaders, então o Thunderbird herda a mesma falha.

Caminho de disparo (update_request_handlers, platform/firefox/js/platform-firefox.js:36-53): o listener é registrado com urls: this.well_known_app_filters, que é populado a partir de chrome.permissions.getAll().origins (src/platform.js:78-79, update_host_permissions()). Qualquer permissão de host que o usuário tenha concedido — incluindo uma concessão de site único através do link "Background SSO (enable)" do popup (popup/menu.js:171-260, usando current_filter = "https://" + tab_hostname + "/*" derivado da aba ativa) — é suficiente para registrar o listener para aquele host exato. Nenhuma permissão catch-all https://*/* é necessária, ao contrário do pré-requisito de exploração descrito no GHSA-52rj-42vh-2rxc; uma única concessão direcionada no próprio domínio sósia do atacante é suficiente aqui, o que é um obstáculo menor do que o PoC do aviso anterior.

Sink — mesmo arquivo, linhas 60-70:

root@kitploit:~
let prt = await this.#broker.acquirePrtSsoCookie(this.account, e.url);
ssoLog("inject PRT SSO into request headers");
e.requestHeaders.push({ name: prt.cookieName, value: prt.cookieContent });

e.url (a URL completa do atacante) é passada diretamente como ssoUrl para o broker nativo. linux-entra-sso.py:27-30 documenta que o backend do broker da Microsoft não valida ssoUrl no lado do servidor ("o valor correto não é verificado ... pelo backend de autorização"), então um cookie é emitido independentemente, e é injetado nos cabeçalhos da requisição que realmente vai para o próprio host do atacante — uma exfiltração direta, não apenas um cabeçalho definido em uma requisição destinada à Microsoft.

Chrome não é afetado: platform/chrome/js/platform-chrome.js:96-99 (após a correção do GHSA-52rj-42vh-2rxc, commit 8183759) ancora com "|" + Platform.SSO_URL + "/" (âncora de início de string + barra à direita) e adiciona uma lista de permissões explícita requestDomains: [URL.parse(Platform.SSO_URL).hostname] — ambas rejeitam corretamente um host login.microsoftonline.com.attacker.example.

Thunderbird — mesmo código vulnerável, atualmente não alcançável por este vetor: platform/thunderbird/js/platform-thunderbird.js estende PlatformFirefox sem alterações, então o mesmo bypass de startsWith existe no binário da versão para Thunderbird. No entanto, platform/thunderbird/manifest.json declara apenas um "host_permissions": ["https://login.microsoftonline.com/*"] fixo, sem chave optional_host_permissions. WebExtensions só permite que chrome.permissions.request() conceda origens que estejam pré-declaradas em optional_permissions/optional_host_permissions; como o Thunderbird não declara nenhuma, o fluxo "Background SSO (enable)" do popup (popup/menu.js:259-261) não pode obter permissão para um domínio escolhido pelo atacante no Thunderbird atualmente. O bug é latente ali, não é atualmente alcançável pelo atacante, e ainda deve ser corrigido para defesa em profundidade / caso optional_host_permissions seja algum dia adicionado àquele manifesto.

Prova de Conceito

Confirmado dinamicamente o predicado vulnerável contra a constante real distribuída (importada diretamente do src/platform.js do alvo, não copiada manualmente). Script mantido em ~/engagements/linux-entra-sso/evidence/prt_bypass_poc.mjs.

root@kitploit:~
$ node prt_bypass_poc.mjs
Real Platform.SSO_URL from src/platform.js: "https://login.microsoftonline.com"

Legit MS URL passes filter (expected true): true
Attacker domain-suffix URL: https://login.microsoftonline.com.attacker.example/phish
Attacker URL passes filter (SHOULD be false, is): true

[CONFIRMED] Platform.SSO_URL lacks a trailing '/', so startsWith()
treats 'login.microsoftonline.com.attacker.example' as an in-scope
SSO endpoint. onBeforeSendHeaders would call:
  broker.acquirePrtSsoCookie(this.account, "https://login.microsoftonline.com.attacker.example/phish")
and inject the returned PRT cookie into the request headers sent to
the attacker-controlled host.

O restante da cadeia (o broker emitindo um cookie para um ssoUrl não validado, e o listener webRequest do WebExtensions disparando para uma permissão de host único concedida) é rastreado estaticamente, não confirmado dinamicamente — reproduzi-lo de ponta a ponta requer um host Linux inscrito ativo executando microsoft-identity-broker contra um tenant Entra real, o que está fora deste ambiente. Os passos rastreados:

  1. O atacante registra login.microsoftonline.com.attacker.example e serve uma página lá.
  2. A vítima (com linux-entra-sso instalado, conta Entra ativa) visita a página e é induzida a abrir o popup da extensão e clicar em "Background SSO (enable)" para o site atual (popup/menu.js:259-261 → request_host_permission(["https://login.microsoftonline.com.attacker.example/*"])).
  3. A concessão dispara chrome.permissions.onAdded → on_permissions_changed() (src/background.js:30-34) → update_host_permissions() atualiza well_known_app_filters → update_request_handlers() registra novamente o listener webRequest.onBeforeSendHeaders do Firefox incluindo o novo padrão de host.
  4. Uma requisição main_frame/sub_frame para https://login.microsoftonline.com.attacker.example/... dispara o listener; a verificação startsWith (mostrada contornada acima) passa.
  5. broker.acquirePrtSsoCookie(account, e.url) retorna um cookie PRT real (conforme linux-entra-sso.py:27-30, ssoUrl não é validado pelo backend do broker).
  6. O cookie é inserido nos cabeçalhos da requisição — enviado ao próprio servidor do atacante.

Impacto

Um atacante que faz um usuário do Firefox com linux-entra-sso conceder "Background SSO" para um domínio sósia controlado pelo atacante recebe o cookie SSO PRT do Entra ID da vítima diretamente em seu próprio servidor. Esse cookie é reproduzível contra login.microsoftonline.com para obter tokens de acesso/ID para qualquer aplicativo que a vítima tenha consentido — sequestro completo da sessão SSO. Ao contrário do aviso anterior, isso não requer a permissão catch-all ampla https://*/*, apenas uma concessão de site único no próprio domínio do atacante. O Thunderbird distribui a mesma verificação falha, mas seu manifesto atualmente não tem como conceder em tempo de execução uma permissão de domínio arbitrário, então não é explorável por este vetor hoje (ver Detalhes).

Fraquezas

  • CWE-20: Validação de Entrada Imprópria
  • CWE-346: Erro de Validação de Origem

Remediação

Ancore a comparação em uma verificação adequada de origem/hostname em vez de um prefixo de string bruto, espelhando a correção já aplicada ao adaptador do Chrome:

root@kitploit:~
if (!e.url.startsWith(Platform.SSO_URL + "/")) {
    return { requestHeaders: e.requestHeaders };
}

ou, de forma mais robusta, compare new URL(e.url).origin com new URL(Platform.SSO_URL).origin (rejeita também truques de userinfo/porta). Aplicar a correção no nível da constante Platform.SSO_URL (adicionando a barra à direita uma vez em src/platform.js) fecharia isso tanto para a verificação do Firefox quanto para qualquer outro consumidor da constante, e um teste de regressão afirmando que startsWith rejeita https://login.microsoftonline.com.attacker.example/... fecharia a lacuna de cobertura da mesma forma que o teste de regressão testMatchOutcome sugerido pela correção do Chrome fez para o GHSA-52rj-42vh-2rxc.

Crédito

Dostxodjayev Abdullox (GitHub: squeeze440)

Canal de Relato

Não há SECURITY.md presente no repositório e a API do GitHub não reporta nenhuma política de segurança no nível do repositório, mas o GitHub Private Vulnerability Reporting está habilitado em siemens/linux-entra-sso (verificado através do botão "Report a vulnerability" na aba Security do repositório). Relate através desse canal: https://github.com/siemens/linux-entra-sso/security/advisories/new.

Baixar ferramenta