Skip to content

Commit 557f32d

Browse files
committed
minor #6234 File System Security Issue in Custom Auth Article (finished) (mattjanssen, WouterJ)
This PR was merged into the 2.3 branch. Discussion ---------- File System Security Issue in Custom Auth Article (finished) Finishes #5846 Original description: > | Q | A > | ------------- | --- > | Doc fix? | yes > | New docs? | no > | Applies to | all > | Fixed tickets | #5845 > > I hope to address this security concern: If `$token->nonce` is set to [ANY USER INPUT] and later we run `file_put_contents($token->nonce, time())` are we allowing hackers to destroy any www-writable file in the system? > > I did notice that `$nonce` is run through `base64_decode($nonce)` later in the article, implying nonce needs to be a Base64 string. Could this Regex be updated to only accept a Base64 string `[a-zA-Z+/]+={0,2}` for the nonce? > > At the same time, Base64 allows `/` characters, so `file_put_contents()` would fail in those cases, so even this change, while secure, seems flawed. Replace [+/] with [-_]? Commits ------- 673fd71 Hash nonce when using as file name 5f125f3 File System Security Issue in Custom Auth Article
2 parents ff938a4 + 673fd71 commit 557f32d

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

cookbook/security/custom_authentication_provider.rst

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ set an authenticated token in the security context if successful.
130130
{
131131
$request = $event->getRequest();
132132
133-
$wsseRegex = '/UsernameToken Username="([^"]+)", PasswordDigest="([^"]+)", Nonce="([^"]+)", Created="([^"]+)"/';
133+
$wsseRegex = '/UsernameToken Username="([^"]+)", PasswordDigest="([^"]+)", Nonce="([a-zA-Z0-9+/]+={0,2})", Created="([^"]+)"/';
134134
if (!$request->headers->has('x-wsse') || 1 !== preg_match($wsseRegex, $request->headers->get('x-wsse'), $matches)) {
135135
return;
136136
}
@@ -256,14 +256,17 @@ the ``PasswordDigest`` header value matches with the user's password.
256256
257257
// Validate that the nonce is *not* used in the last 5 minutes
258258
// if it has, this could be a replay attack
259-
if (file_exists($this->cacheDir.'/'.$nonce) && file_get_contents($this->cacheDir.'/'.$nonce) + 300 > time()) {
259+
if (
260+
file_exists($this->cacheDir.'/'.md5($nonce))
261+
&& file_get_contents($this->cacheDir.'/'.md5($nonce)) + 300 > time()
262+
) {
260263
throw new NonceExpiredException('Previously used nonce detected');
261264
}
262265
// If cache directory does not exist we create it
263266
if (!is_dir($this->cacheDir)) {
264267
mkdir($this->cacheDir, 0777, true);
265268
}
266-
file_put_contents($this->cacheDir.'/'.$nonce, time());
269+
file_put_contents($this->cacheDir.'/'.md5($nonce), time());
267270
268271
// Validate Secret
269272
$expected = base64_encode(sha1(base64_decode($nonce).$created.$secret, true));

0 commit comments

Comments
 (0)