Skip to content

Commit

Permalink
security #cve-2018-11408 [SecurityBundle] Fail if security.http_utils…
Browse files Browse the repository at this point in the history
… cannot be configured

* cve-2018-11408-2.7:
  [SecurityBundle] Fail if security.http_utils cannot be configured
  • Loading branch information
fabpot committed May 24, 2018
2 parents 319e1bd + c003b7a commit b20e835
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 2 deletions.
Expand Up @@ -26,14 +26,15 @@ class AddSessionDomainConstraintPass implements CompilerPassInterface
*/ */
public function process(ContainerBuilder $container) public function process(ContainerBuilder $container)
{ {
if (!$container->hasParameter('session.storage.options') || !$container->has('security.http_utils')) { if (!$container->hasParameter('session.storage.options')) {
return; return;
} }


$sessionOptions = $container->getParameter('session.storage.options'); $sessionOptions = $container->getParameter('session.storage.options');
$domainRegexp = empty($sessionOptions['cookie_domain']) ? '%s' : sprintf('(?:%%s|(?:.+\.)?%s)', preg_quote(trim($sessionOptions['cookie_domain'], '.'))); $domainRegexp = empty($sessionOptions['cookie_domain']) ? '%s' : sprintf('(?:%%s|(?:.+\.)?%s)', preg_quote(trim($sessionOptions['cookie_domain'], '.')));
$domainRegexp = (empty($sessionOptions['cookie_secure']) ? 'https?://' : 'https://').$domainRegexp; $domainRegexp = (empty($sessionOptions['cookie_secure']) ? 'https?://' : 'https://').$domainRegexp;


// if the service doesn't exist, an exception must be thrown - ignoring would put security at risk
$container->findDefinition('security.http_utils')->addArgument(sprintf('{^%s$}i', $domainRegexp)); $container->findDefinition('security.http_utils')->addArgument(sprintf('{^%s$}i', $domainRegexp));
} }
} }
2 changes: 1 addition & 1 deletion src/Symfony/Bundle/SecurityBundle/SecurityBundle.php
Expand Up @@ -50,7 +50,7 @@ public function build(ContainerBuilder $container)


$extension->addUserProviderFactory(new InMemoryFactory()); $extension->addUserProviderFactory(new InMemoryFactory());
$container->addCompilerPass(new AddSecurityVotersPass()); $container->addCompilerPass(new AddSecurityVotersPass());
$container->addCompilerPass(new AddSessionDomainConstraintPass(), PassConfig::TYPE_AFTER_REMOVING); $container->addCompilerPass(new AddSessionDomainConstraintPass(), PassConfig::TYPE_BEFORE_REMOVING);
$container->addCompilerPass(new RegisterCsrfTokenClearingLogoutHandlerPass()); $container->addCompilerPass(new RegisterCsrfTokenClearingLogoutHandlerPass());
} }
} }
Expand Up @@ -96,6 +96,19 @@ public function testNoSession()
$this->assertTrue($utils->createRedirectResponse($request, 'http://pirate.com/foo')->isRedirect('http://pirate.com/foo')); $this->assertTrue($utils->createRedirectResponse($request, 'http://pirate.com/foo')->isRedirect('http://pirate.com/foo'));
} }


/**
* @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException
* @expectedExceptionMessage You have requested a non-existent service "security.http_utils".
*/
public function testNoHttpUtils()
{
$container = new ContainerBuilder();
$container->setParameter('session.storage.options', array());

$pass = new AddSessionDomainConstraintPass();
$pass->process($container);
}

private function createContainer($sessionStorageOptions) private function createContainer($sessionStorageOptions)
{ {
$container = new ContainerBuilder(); $container = new ContainerBuilder();
Expand Down

0 comments on commit b20e835

Please sign in to comment.