Skip to content

Commit

Permalink
fix potential timing attack issue
Browse files Browse the repository at this point in the history
  • Loading branch information
xabbuh authored and fabpot committed Nov 23, 2015
1 parent 3dc2244 commit f1fd768
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Util\SecureRandomInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\Security\Core\Util\StringUtils;

/**
* Concrete implementation of the RememberMeServicesInterface which needs
Expand Down Expand Up @@ -90,7 +91,7 @@ protected function processAutoLoginCookie(array $cookieParts, Request $request)
list($series, $tokenValue) = $cookieParts;
$persistentToken = $this->tokenProvider->loadTokenBySeries($series);

if ($persistentToken->getTokenValue() !== $tokenValue) {
if (!StringUtils::equals($persistentToken->getTokenValue(), $tokenValue)) {
throw new CookieTheftException('This token was already used. The account is possibly compromised.');
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Util\StringUtils;

/**
* Concrete implementation of the RememberMeServicesInterface providing
Expand Down Expand Up @@ -53,7 +54,7 @@ protected function processAutoLoginCookie(array $cookieParts, Request $request)
throw new \RuntimeException(sprintf('The UserProviderInterface implementation must return an instance of UserInterface, but returned "%s".', get_class($user)));
}

if (true !== $this->compareHashes($hash, $this->generateCookieHash($class, $username, $expires, $user->getPassword()))) {
if (!StringUtils::equals($this->generateCookieHash($class, $username, $expires, $user->getPassword()), $hash)) {
throw new AuthenticationException('The cookie\'s hash is invalid.');
}

Expand All @@ -64,31 +65,6 @@ protected function processAutoLoginCookie(array $cookieParts, Request $request)
return $user;
}

/**
* Compares two hashes using a constant-time algorithm to avoid (remote)
* timing attacks.
*
* This is the same implementation as used in the BasePasswordEncoder.
*
* @param string $hash1 The first hash
* @param string $hash2 The second hash
*
* @return bool true if the two hashes are the same, false otherwise
*/
private function compareHashes($hash1, $hash2)
{
if (strlen($hash1) !== $c = strlen($hash2)) {
return false;
}

$result = 0;
for ($i = 0; $i < $c; ++$i) {
$result |= ord($hash1[$i]) ^ ord($hash2[$i]);
}

return 0 === $result;
}

/**
* {@inheritdoc}
*/
Expand Down

0 comments on commit f1fd768

Please sign in to comment.