Skip to content

Commit

Permalink
Fixes a bug that allows a user to bypass 2FA authentication requirements
Browse files Browse the repository at this point in the history
This bug was reported to us by a user (@ferry#1704) on Discord on
Monday, November 7th, 2016.

It was disclosed that it was possible to bypass the 2FA checkpoint by
clicking outside of the modal which would prompt the modal to close,
but not submit the form. The user could then press the login button
which would trigger an error. Due to this error being triggered the
authentication attempt was not cancelled. On the next page load the
application recognized the user as logged in and continued on to the
panel.

At no time was it possible to login without using the correct email
address and password.

As a result of this bug we have re-factored the Authentication code for
logins to address the persistent session. Previously accounts were
manually logged back out on 2FA failure. However, as this bug
demonstrated, causing a fatal error in the code would prevent the
logout code from firing, thus preserving their session state.

This commit modifies the code to use a non-persistent login to handle
2FA checking. In order for the session to be saved the application must
complete all portions of the login without any errors, at which point
the user is persistently authenticated using Auth::login().

This resolves the ability to cause an exception and bypass 2FA
verification.
  • Loading branch information
DaneEveritt committed Nov 7, 2016
1 parent e77b984 commit 659c33f
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 9 deletions.
14 changes: 6 additions & 8 deletions app/Http/Controllers/Auth/LoginController.php
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ public function login(Request $request)
}

// Is the email & password valid?
if (!Auth::attempt([
if (!Auth::once([
'email' => $request->input('email'),
'password' => $request->input('password')
], $request->has('remember'))) {
Expand All @@ -116,14 +116,10 @@ public function login(Request $request)

}

$G2FA = new Google2FA();
$user = User::select('use_totp', 'totp_secret')->where('email', $request->input('email'))->first();

// Verify TOTP Token was Valid
if($user->use_totp === 1) {
if(!$G2FA->verifyKey($user->totp_secret, $request->input('totp_token'))) {

Auth::logout();
if(Auth::user()->use_totp === 1) {
$G2FA = new Google2FA();
if(is_null($request->input('totp_token')) || !$G2FA->verifyKey(Auth::user()->totp_secret, $request->input('totp_token'))) {

if (!$lockedOut) {
$this->incrementLoginAttempts($request);
Expand All @@ -135,6 +131,8 @@ public function login(Request $request)
}
}

// Successfully Authenticated.
Auth::login(Auth::user(), $request->has('remember'));
return $this->sendLoginResponse($request);

}
Expand Down
5 changes: 4 additions & 1 deletion resources/views/auth/login.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,10 @@
}
}).done(function (data) {
if (typeof data.id !== 'undefined') {
$('#openTOTP').modal('show');
$('#openTOTP').modal({
backdrop: 'static',
keyboard: false
});
$('#openTOTP').on('shown.bs.modal', function() {
$('#totp_token').focus();
});
Expand Down

0 comments on commit 659c33f

Please sign in to comment.