Os URLs privados e inquestionáveis ​​são equivalentes à autenticação baseada em senha?


128

Quero expor um recurso na web. Quero proteger esse recurso: garantir que ele seja acessível apenas a certos indivíduos.

Eu poderia configurar algum tipo de autenticação baseada em senha . Por exemplo, eu só podia permitir o acesso ao recurso por meio de um servidor Web que verifica as solicitações recebidas por credenciais corretas (talvez em alguns bancos de dados de usuários) antes de enviar o arquivo.

Como alternativa, eu poderia apenas usar um URL privado . Ou seja, eu poderia simplesmente hospedar o recurso em algum caminho impossível de adivinhar, por exemplo https://example.com/23idcojj20ijf..., que restringe o acesso àqueles que conhecem a string exata.

Da perspectiva de um malfeitor que deseja acessar esse recurso, essas abordagens são equivalentes? Se não, o que os torna diferentes? E quanto à capacidade de manutenção, existem prós e contras em qualquer uma das abordagens que eu deveria estar ciente antes de implementar uma ou outra?


45
Essa abordagem geralmente é usada apenas sem autenticação para coisas como redefinições de senha. O link indesejável normalmente expira dentro de um curto período de tempo e só pode ser usado por alguém já semi-autenticado (ou seja, o site já sabe o endereço de email para o qual o link foi enviado).
Robert Harvey

6
Discussão relacionada sobre security.SE: security.stackexchange.com/q/58215/37496
Mark Mark

9
@MonkeyZeus não é segurança através da obscuridade. O segredo, que normalmente é uma senha, nesse caso, é uma URL.
Davidmh 27/07/16

16
@MonkeyZeus: Segurança através da obscuridade refere-se a manter em segredo a implementação do mecanismo, sem usar chaves obscuras. Se URLs indizíveis são segurança através da obscuridade, senhas fortes também são.
JacquesB

1
@GladstoneKeep lembre-se dos encurtadores de URL. Quando alguém malicioso usa um deles, o link será muito mais fácil de adivinhar / anotar.
RookieTEC9

Respostas:


203

Um URL privado é um pouco mais fraco que a autenticação com credenciais, mesmo que o tamanho do bit do URL seja o mesmo que o das credenciais. O motivo é que o URL pode "vazar" com mais facilidade. Ele é armazenado em cache no navegador, conectado ao servidor e assim por diante. Se você tiver links de saída, o URL privado poderá aparecer no cabeçalho do referenciador em outros sites. (Também pode ser visto por pessoas olhando por cima do seu ombro.)

Se ele vazar (por acidente ou devido ao descuido do usuário), pode acabar sendo público e até indexado pelo Google, o que permitiria que um invasor pesquisasse facilmente todos os URLs vazados no seu site!

Por esse motivo, os URLs privados geralmente são usados ​​apenas para operações de uma só vez, como redefinições de senha, e geralmente são ativas apenas por um tempo limitado.


Existe um tópico relacionado em Segurança da informação: os URLs aleatórios são uma maneira segura de proteger fotos de perfil ? - uma resposta compartilha a história: o Dropbox desativa os links compartilhados antigos depois que as declarações fiscais acabam no Google . Portanto, não é apenas um risco teórico.


7
Pequenas reclamações, mas "normalmente usado apenas para operações de uma só vez" parece uma declaração exagerada, uma vez que o Dropbox (e talvez outros serviços nublados) as estão usando para "proteger" o acesso aos arquivos.
21816 Steve Jessop

4
Eu acrescentaria que os usuários são ensinados, com sucesso limitado, a proteger suas senhas, mas não a proteger seus URLs.
svavil

1
Você deve adicionar que muitas das preocupações técnicas podem ser atenuadas usando um parâmetro na URL privada, portanto xzy.com/myDoc?auth=8502375, e um redirecionamento automático para um URL simples após o término da autenticação. - Mas isso não resolve todos os problemas possíveis
Falco

3
TL; DR - não existe um URL secreto. Existe um ataque atual que expõe URLs a um agente mal-intencionado em pontos de acesso WiFi, mesmo que você normalmente envie o URL por HTTPS. O ataque abusa da descoberta automática de proxy da Web (WPAD), forçando o navegador a enviar todos os seus URLs para o invasor. Veja (por exemplo) arstechnica.com/security/2016/07/…
Harald

5
@JacquesB Não são alguns dos riscos que você identificou mitigados ao colocar a parte privada na parte do fragmento da URL (ou seja, após o "#", como, por exemplo, o Stack Exchange faz por suas respostas de autenticação Oauth)? Por exemplo, o cabeçalho do referenciador não tem permissão para incluir o fragmento .
28616 Jason C #

48

Nota:

Muitas pessoas parecem estar confundindo um URL "privado" com autenticação. Além disso, parece haver alguma confusão de que o envio do link por uma entidade confiável é uma tentativa de autenticação de dois fatores. Para deixar claro, estamos falando de um recurso acessível ao público, embora seja suficientemente difícil de adivinhar.

Ao usar um URL privado, você deve sempre assumir que ele pode ser comprometido - você deve criar um URL para que, mesmo que seja comprometido, o recurso não vaze informações para o invasor.


URLs privados / difíceis de adivinhar não são equivalentes à autenticação baseada em senha. Por natureza, os URLs privados não são privados - são recursos acessíveis ao público. Eu acho que o termo URL "privado" é um nome impróprio, mas são URLs "obscuros".

Há certos casos em que o uso de um URL "privado" é aceitável, mas eles são inerentemente menos seguros que os métodos de autenticação tradicionais, como autenticação por senha ou autenticação baseada em chave.

Alguns dos lugares que eu normalmente vi URLs "particulares" usados ​​são:

  1. Redefinir senha por e-mail
  2. E-mails de geração de certificado
  3. E-mails de confirmação da conta / e-mail
  4. Entrega do conteúdo comprado (e-books, etc.)
  5. Outras coisas diversas, como check-in de voo, cartão de embarque impresso, usam URLs particulares, além da autenticação tradicional

O ponto comum aqui é que URLs aleatórios normalmente são bons apenas para operações de uma só vez. Além disso, a autenticação tradicional e URLs aleatórios não são mutuamente exclusivos - na verdade, eles podem ser usados ​​em conjunto para fornecer segurança adicional ao fornecer um recurso.


Como Robert Harvey apontou, a única maneira de usar com segurança um URL aleatório / privado é gerar a página dinamicamente e enviá-lo ao usuário de uma maneira que o usuário possa ser considerado semi-autenticado. Pode ser email, SMS etc.

Um URL privado / gerado aleatoriamente geralmente possui algumas propriedades:

  1. Deve expirar após um período de tempo razoável
  2. Deve ser um URL de uso único: ou seja, deve expirar após a primeira vez que for acessado.
  3. Deve adiar a autenticação do usuário para outra entidade em que confia para autenticar com segurança o usuário. (Enviando o link por e-mail ou SMS, etc)
  4. Deveria ser impossível para um computador moderno forçar com força o URL no período anterior à expiração - limitando a taxa da API que expõe o recurso ou criando um ponto de extremidade de URL com entropia suficiente para que não possa ser adivinhado.
  5. Não deve vazar informações sobre o usuário. IE: Se a página for redefinir uma senha: a página não deve exibir as informações da conta do solicitante. Se Alice solicitar um link de redefinição de senha e Bob de alguma forma adivinhar o URL, Bob não deverá ter como saber de quem está redefinindo a senha.
  6. Se vazar informações sobre o usuário, ele deverá ser usado em cima da autenticação tradicional; por exemplo, uma página pode considerar um usuário autenticado se ele tiver um conjunto de cookies ou se o ID da sessão ainda for válido.

Recursos diferentes requerem diferentes níveis de segurança. Se você deseja compartilhar uma receita secreta com alguns amigos, por exemplo, seria aceitável usar um URL aleatório / privado para compartilhá-lo com eles. No entanto, se o recurso puder ser usado para roubar a identidade de alguém ou comprometer suas contas com outros provedores de serviços, você provavelmente se importaria muito mais com a restrição de acesso a esse recurso.


4
Se eu quisesse compartilhar a receita secreta da Coca-Cola com minha equipe de desenvolvimento de produtos, isso exigiria algo um pouco diferente de se eu quisesse compartilhar a receita da salada de batata que servi aos vizinhos durante uma festa de churrasco no bairro. Mais uma vez, contexto. :-)
a CVn

7
@ MichaelKjörling Não tenho certeza de como alguém inferiria diferenças diferentes do meu post. Indiquei claramente que recursos diferentes exigem níveis diferentes de autenticação. A receita da coca-cola seria muito mais valiosa do que a receita dos biscoitos da vovó.
Charles Addis

9
@CharlesAddis Claramente, você nunca provou os biscoitos da minha avó!
Brian

1
Eu acho que, embora eu possa estar errado, que @ Michael está dizendo que sua descrição de 5 pontos das propriedades que um URL secreto deveria ter já é um exagero por compartilhar uma receita secreta com os amigos. Tornar cada um de uso único (e, portanto, necessitar de um URL separado por amigo que acessa a receita), em particular, parece muito aborrecedor para benefícios insignificantes, especialmente se também houver um prazo de validade. Eu li sua resposta como "é aceitável usar um URL privado, mas os URLs privados devem ter essas 5 propriedades" e a IMO está levemente errada.
21816 Steve Jessop

1
@BenjaminHodgson, que é precisamente o motivo do item 5 => se o link / URL acabar nas mãos erradas, ele não deve vazar nenhuma informação sobre o usuário que o solicitou.
Charles Addis

8

Praticamente todos os esquemas de autenticação se resumem a provar que você conhece um segredo. Você se autentica em algum serviço ao provar que conhece uma senha secreta ou um URL secreto ou, ...

Alguns protocolos mais avançados (por exemplo, OAUTH, Kerberos, ...) permitem que você prove que conhece o segredo sem realmente transmiti -lo. Isso é importante porque há mais maneiras de obter um segredo "inimaginável" além de adivinhar.

Eu poderia estar sentado no mesmo cibercafé que você mesmo, espionando sua conexão Wi-Fi quando você digita seu URL "indescritível". Nesse ponto, se você não estivesse usando SSL ou se eu puder explorar o novo bug mais recente na sua implementação de SSL, também conheceria seu segredo.


1
Para ser justo, isso também vale para autenticação ou qualquer comunicação.
Andy

"bisbilhotar sua conexão WiFi" funciona em qualquer coisa: URLs, <form>s protegidos contra CSRF , dados criptografados JavaScript de nível militar (talvez seja necessário detectar sniffing ativo). É simples corrigi-lo: use HTTPS.
Gustavo Rodrigues

@GustavoRodrigues Antes de tudo, se a escuta realmente "funcionasse em qualquer coisa ", funcionaria em HTTPS. Caso contrário, o que significa "qualquer coisa"? Ou que mágica você acha que existe no HTTPS que o coloca acima de tudo?
Solomon Slow

2
... mas não é mágica que afasta bisbilhoteiros: É criptografia de chave pública. Aqui está um exemplo simples: um serviço me envia um desafio contendo um número aleatório e um carimbo de data e hora. Assino o desafio com minha chave privada e a devolvo. Se eles podem validar minha resposta com minha chave pública registrada, isso prova que eu conheço o segredo (o segredo é minha chave privada), mas eu o provei sem nunca revelá-lo a um potencial interceptador. Não ajudará o bisbilhoteiro a reproduzir minha resposta, porque o serviço nunca enviará o mesmo desafio duas vezes.
Solomon Slow

HTTPS (isto é, HTTP sobre SSL) usa criptografia de chave pública, mas, para sua informação, as implementações mais populares do SSL têm um histórico de bugs que permitiram que os bisbilhoteiros invadissem, apesar da criptografia. Novos bugs (aka, "exploits") parecem ser descobertos duas ou três vezes por ano, e todos os desenvolvedores de todos os produtos que usam SSL precisam correr com os cabelos em chamas até que a última exploração seja corrigida. (Não me pergunte como eu sei!)
Solomon Lento

3

Muitas respostas boas já estão neste tópico, mas para abordar diretamente a pergunta:

Da perspectiva de um malfeitor que deseja acessar esse recurso, essas abordagens são equivalentes? Se não, o que os torna diferentes?

Deixe-me estabelecer uma definição. "Autenticação" é o fornecimento de credenciais para provar uma reivindicação de identidade. O controle de acesso geralmente é baseado na identificação do usuário.

Seu URL secreto não está vinculado a um usuário específico. Como outros já apontaram, ele pode acabar no arquivo de log de um proxy, ou em uma solicitação de pesquisa indexada pelo Google ou em muitas outras maneiras pelas quais ele pode vazar.

Por outro lado, uma senha está vinculada a uma conta de usuário exclusiva. Você pode redefini-lo ou permitir apenas que ele seja usado no local de origem do usuário, no endereço IP conhecido ou em qualquer outro número de controles.

Um nome de usuário / senha oferece um controle muito mais granular do acesso.

O controle de acesso permite que uma identidade (assunto) acesse um recurso (objeto). No seu exemplo de URL, a identidade é "qualquer pessoa que obtenha o URL, por qualquer meio".

Vá com o nome de usuário / senha, se puder. Os URLs vazam de várias maneiras inesperadas ao longo do tempo.


1

Um URL secreto é tão seguro quanto uma senha secreta. No entanto, as senhas são mais fáceis de manter em segredo do que os URLs, porque todos e seus programas sabem que as senhas devem permanecer em segredo.

Por exemplo, seu navegador não mostra uma senha na tela, apenas armazena senhas com sua permissão e oferece meios para proteger esse armazenamento de senhas (como armazenamento criptografado desbloqueado por uma senha mestra). Por outro lado, ele sempre mostra os URLs na tela, pode vazá-los através do cabeçalho do referenciador e os armazena automaticamente no seu histórico de navegação sem nenhuma proteção adicional.

Da mesma forma, os proxies HTTP normalmente não registram senhas, enquanto os URLs geralmente são registrados.

O uso de URLs para autenticação também significa que o compartilhamento de URLs compartilha autenticação, o que dificulta a revogação (ou registro) individual do acesso.

E, é claro, os URLs secretos herdam todas as fraquezas das senhas secretas. Em particular, o uso de uma senha para autenticação revelará essa senha ao servidor e a qualquer pessoa capaz de ler sua comunicação.


3
Essa resposta faz muitas suposições erradas. Se você fizer login em um site com HTTPS e digitar seu nome de usuário e senha, os saltos intermediários e os proxies não saberão sua senha.
Pieter B

Por "interceptar sua comunicação", quis dizer a capacidade de reconstruir seu conteúdo. Isso pode ou não ser evitado pelo HTTPS. Em particular, confiar em um único certificado inválido (por exemplo, por algum proxy HTTPS corporativo que usa a mesma chave privada para todas as instalações) permite que um invasor faça a intermediação do tráfego HTTPS.
meriton 27/07

2
mas codificando o segredo no URL, você basicamente torna o HTTPS totalmente inutilizável. Cada salto entre o cliente e o servidor tem o segredo. Nenhum certificado comprometido é necessário.
Pieter B

4
Absurdo; em HTTPS, o URL é transmitido apenas no fluxo criptografado. Você deve confundi-lo com o domínio ou IP, que são visíveis nos campos de pesquisa DNS e cabeçalho IP, respectivamente.
meriton 27/07

1

Outro item não observado em qualquer lugar é a limitação de "suposições". Para a maioria dos sistemas de autenticação de senha, você recebe um número limitado de tentativas de adivinhar uma senha para um usuário antes que outras tentativas de autenticação sejam bloqueadas ou limitadas.

Embora você possa fazer algo semelhante com 'suposições' contra o seu esquema de URL, seria um pouco mais difícil de implementar. Se houver um padrão reconhecível na sua geração de URL, pode ser difícil impedir que alguém configure seu caminho através do espaço de URL 'aleatório'.


0

Há outro aspecto que ainda não vi mencionado - encurtadores de URL.

Em uma publicação recente (abril de 2016), foi reivindicado que os serviços de encurtador de URL anulam completamente o aumento da segurança fornecida por URLs "não-assistíveis" gerados aleatoriamente. O espaço de URL do serviço mais curto é consideravelmente menor que o URL gerado aleatoriamente - o que significa que qualquer URL "seguro" compartilhado com um serviço de encurtador pode ser adivinhado de maneira mais fácil do que o previsto.

Para ilustrar - vamos supor que seu URL aleatório tenha 128 bits de comprimento (ou seja, um guia). Além disso, vamos supor que seu gerador de números aleatórios seja realmente forte e que você gere esses bits de maneira uniforme. Adivinhar um número de 128 bits é muito difícil e pode levar um tempo considerável - seu URL é protegido por chave de 128 bits.

Então, vamos supor que alguém tenha compartilhado esse URL no encurtador de URL do Google. Hoje, esse serviço emite um ID de 10 caracteres, composto por letras e números. (26 + 10) ^ 10 ~ = 3,6 * 10 ^ 15 <2 ^ 52 - então reduzimos pela metade a força da chave de 128 para 52 bits.

Acrescente a isso que os geradores não usam todo o espaço devido a outras considerações e você pode montar um ataque eficaz que combina força bruta com canais laterais (provavelmente buffers de URL aleatórios pré-alocados).

O artigo original: http://arxiv.org/pdf/1604.02734v1.pdf
Uma postagem no blog que resume o artigo (pelo autor): https://freedom-to-tinker.com/blog/vitaly/gone-in- URLs de seis caracteres curtos considerados prejudiciais para serviços em nuvem /


2
Bem, sim, mas seria de esperar que alguém que usasse esses serviços para dados confidenciais soubesse melhor do que publicar as URLs em qualquer lugar , inclusive em um serviço de encurtamento. Isso não é realmente diferente de dizer que Gah! My password/private key is too long and complex. I know! I'll just write it in a text document and put that in a zip file with an easier password.ambos são falhas transparentes, o que se espera contra a esperança de que as pessoas não sejam tolas o suficiente para fazer. Mas sim, na realidade, infelizmente, o seu aviso será provavelmente necessário;)
underscore_d

@underscore_d sim exatamente - se você conhece esse assunto com detalhes suficientes para comentar, esse não é um ponto digno de blog.
Robert Grant
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.