O hook cors é o engine determinístico por trás da especialização http-request, e você mesmo pode executá-lo. Ele funciona em dois modos a partir de um único comando: um scan, que varre o código-fonte em busca de uma allowlist de origens contornável (uma regex de validação de host pela qual o host de um atacante passa), e um score, que classifica um único valor de origem CORS como wildcard, null ou safe.
Varrer um código
Sem nenhuma flag, ele varre o projeto inteiro.
- Projeto inteiro
- Um diretório
- Um único arquivo
npx lagune read cors
npx lagune read cors --dir src/server
npx lagune read cors --file internal/auth/origin.go
Ele lista cada allowlist contornável sob um único cabeçalho, agrupada por arquivo. Um validador de host cujo .+/.* fica no segmento de autoridade antes do sufixo do host confiável (^https?://.+\.trusted\.com) deixa passar o host de um atacante como your-site.com.attacker.com.
Origin-allowlist patterns with a greedy wildcard (bypassable, review):
internal/auth/origin.go
^https?://.+\.trusted\.com
Isso é uma pista para revisão, não um achado fechado: pelo texto, não dá para decidir se a regex controla uma decisão de confiança real, então um scan nunca altera o código de saída. Leia cada uma e confirme que a allowlist compara por igualdade completa. Quando nada é encontrado, ele imprime uma única linha.
npx lagune read cors --dir src/clean
# => no bypassable origin allowlist found
Avaliar uma origem
Passe cada origem com --origin. O hook imprime uma palavra por origem e termina com código diferente de zero diante de qualquer wildcard ou null.
- Uma origem
- Várias origens
npx lagune read cors --origin '*' # => wildcard
npx lagune read cors --origin 'null' # => null
npx lagune read cors --origin 'https://app.example.com' # => safe
Repita --origin para avaliar uma allowlist inteira em uma única chamada, com um veredito por linha, na ordem.
npx lagune read cors \
--origin 'https://app.example.com' \
--origin '*' \
--origin 'null'
# => safe
# => wildcard
# => null
| Veredito | Significado |
|---|---|
safe | Não é *, null nem um glob com *. Não garante uma origem bem formada. |
wildcard | *, ou um glob de subdomínio, host ou porta: qualquer site (ou um conjunto amplo) pode ler a resposta. |
null | A origem null, que iframes em sandbox e redirecionamentos conseguem forjar. |
Só safe é uma permissão, e --origin é um oráculo de valores: ele julga o valor, não o handler, então confirme o handler com a especialização http-request.
Opções da CLI
| Opção | Valor | Descrição |
|---|---|---|
--origin | uma origem | Avalia um valor de origem. Repita para avaliar vários, um por linha. |
--dir | um diretório | Restringe a varredura a um diretório. Pode ser repetida e combinada com --file. |
--file | um arquivo | Restringe a varredura a um único arquivo. Pode ser repetida e combinada com --dir. |
Sem nenhuma opção, ele varre o projeto inteiro. --origin é o modo score e não pode ser combinada com --dir nem com --file.
O scan lê o formato de regex contornável, e --origin avalia valores de origem. Dois padrões no nível do código-fonte ficam fora de alcance: o reflexo do Origin da requisição (o servidor devolve o Origin recebido, ou o combina com credenciais) e uma allowlist permissiva por endsWith ou por substring. Reconheça esses padrões no código e trate-os como a especialização http-request descreve.
Perguntas frequentes
Iframes em sandbox e alguns redirecionamentos enviam Origin: null, então uma allowlist que confia em null dá acesso de leitura a esses contextos. O hook cors a sinaliza junto com o wildcard.
Execute npx lagune read cors sobre o código. Ele sinaliza uma regex de validação de host cujo wildcard guloso fica antes do sufixo confiável, de modo que o host de um atacante como your-site.com.attacker.com passa por ela.
