Qual a frequência da Atualização de token na segurança do CSRF?

9

Para começar com o segundo plano, este post é o que Jeff Atwood diz sobre os tokens de CSRF. Nesta mesma página, ele continua dizendo:

Um método de prevenção ainda mais forte, embora mais complexo, é alavancar o estado do servidor - gerar (e rastrear, com tempo limite) uma chave aleatória exclusiva para cada FORMULÁRIO HTML enviado para o cliente. Usamos uma variante desse método no Stack Overflow com grande sucesso.

Mas neste post em si, Jeff nunca comenta sobre quando e como os tokens devem ser atualizados.

Eu estava usando uma técnica semelhante em um aplicativo da web em que estava trabalhando. Funciona assim:

  1. Sempre que o usuário POSTfornecer dados ao meu servidor, um token csrf é enviado junto.
  2. Esse token CSRF é armazenado em um cookie criptograficamente forte na sessão do usuário.
  3. Se o token for válido, a solicitação do usuário é processada e vice-versa.
  4. Se a solicitação for válida, descarte o token antigo no lado do servidor e crie um novo token. A resposta do servidor contém um novo token csrf para ser usado na próxima solicitação. O token antigo em todos os formulários de uma página é atualizado com o novo, para que a próxima solicitação seja processada corretamente.

É aconselhável atualizar os tokens após qualquer POSTsolicitação ou a atualização deve ser feita apenas quando o usuário faz uma GETsolicitação e mantém o mesmo token até a próxima solicitação GET ser feita?

c0da
fonte
este prolly pertence em security.stackexchange.com
tylerl

Respostas:

10

O ponto principal de um token CSRF é que ele não pode ter sido enviado de outro site. Portanto, (a) não pode ser previsto ou detectado por um invasor e (b) não é anexado automaticamente a uma solicitação da maneira que um cookie é.

Portanto, teoricamente, se um token CSRF nunca for divulgado a terceiros, novamente, teoricamente, você não precisará expirá-lo. Mas então você corre o risco de o seu token ser "vazado" de alguma forma. Portanto, seu período de validade deve ser curto o suficiente para combater a possibilidade de um token sair e ser usado contra seu usuário.

Na verdade, não existem diretrizes, mas uma boa técnica sólida é gerar automaticamente um novo token a cada solicitação que incorpore um código de tempo assinado e, em seguida, aceite tokens até uma certa idade.

Uma função de amostra pode ser:

concat(current_time,salt,sha256_sum(concat(salt,userid,current_time,secret_string)))

O token contém informações de tempo e um salt, mas também contém uma assinatura que não pode ser falsificada e que está vinculada ao ID do usuário.

Em seguida, você pode definir seu próprio intervalo de expiração - uma hora, um dia, 2 horas. Tanto faz. O intervalo, neste caso, não está vinculado ao token; portanto, você pode definir regras de expiração da maneira que desejar.

No mínimo, os tokens de CSRF devem expirar quando a sessão de login expirar ou quando o usuário efetuar logout. Não há expectativa do usuário de que um formulário que você criou ANTES de fazer logoff continuará funcionando depois que você fizer login novamente.

tylerl
fonte
"Teoricamente, se um token CSRF nunca for divulgado a terceiros". Mas não é o token no código html do formulário? Estou confuso.
C0da 17/03/12
1
Sou a primeira parte, você, a pessoa com quem estou falando, é a segunda parte. Alguém que escuta do lado de fora é o terceiro. É por isso que compartilhar o mesmo token entre diferentes usuários é desastroso.
tylerl