Подтвердить что ты не робот

Использование локального хранилища для авторизации с помощью Stackoverflow кажется небезопасным. Правильно ли это, как мы его укрепляем?

Я работаю над модулем проверки подлинности и авторизации, аналогичным тому, как выполняется пакетная замена. Теперь я уверен, что они используют определенную модель сервера генерации oAuth или маркера, которая разрешает использование их на разных сайтах. Я попробовал небольшой эксперимент.

Как только я войду в Stackoverflow, я удалю все свои файлы cookie с консоли разработчика.

Я оставляю объект localstorage неповрежденным, который содержит ключ se:fkey xxxxxxxxxxxxxxxxxxxxxxxxx для домена stackoverflow.

имеется еще один ключ для домена stackauth GlobalLogin: xxxxxxxxxxxxxxxxxxxxxxx

se.fkey, если я использовал для захвата сессии, ничего не произошло. но GlobalLogin, я смог скопировать и захватить мою сессию. Итак, мой запрос будет, как S/O справится с авторизацией после авторизации для каждого из сайтов. Кроме того, существует ли способ сделать недействительным для globalLogin для них после его использования один раз?

{EDIT1}

Итак, достаточно только одного globalLogin. Если вы можете получить этот ключ, просто откройте приватный экземпляр просмотра. В Localstorage для stackauth, когда вы находитесь на странице входа, создайте отображение key-value и обновите страницу. Вы войдете в систему.

{EDIT2}

Клавиша globalLogin кажется последовательной в нескольких сеансах. Это был день и не обновление моего ключа globalLogin. Безопасно предположить, что если ваш ключ захвачен, у злоумышленника будет неограниченный доступ к вашему профилю.

{EDIT3}

Для всех, кто голосует, и будет голосовать за этот вопрос как не связанный с программированием вопрос. Позвольте мне сказать так: как сохранить SSO в веб-браузере с помощью localstorage безопасно, и поскольку они подвержены риску, что нам нужно предотвратить, чтобы это не произошло? Один из моих коллег был достаточно внимательным, чтобы дать мне свой ключ GlobalLogin, я смог захватить его сеанс с другого компьютера, хотя он был в той же сети.

Set the GlobalLogin key life this

PS: Это чисто теоретическое понимание того, что я сделал это.

4b9b3361

Ответ 1

Ну, а не глядя на уязвимость, давайте посмотрим на возможные атаки. Я добавлю таблицу здесь как TL/DR

Attacker      | Vulnerable?
Eavesdropper  | Yes
MITM          | Yes
Local Attack  | Yes
Server Attack | Yes

Итак, это проблема.

Удаленный атакующий, может наблюдать трафик, но не может изменить трафик

Считайте это пассивным злоумышленником в кафе. Они могут видеть весь трафик уровня TCP.

Запросы назад и вперед для SO - по умолчанию - не зашифрованы. Вы можете просматривать HTTPS, но по умолчанию это только HTTP.

Таким образом, злоумышленник может увидеть любой запрос и проверить/украсть данные.

Итак, посмотрим, если токен GlobalLogin когда-либо отправляется в запросе...

На самом деле это так. На странице входа запрос отправляется через iframe по следующему URL-адресу:

https://stackauth.com/auth/global/read?request=//snip//

Этот URL возвращает script:

var data = {
    "ReadSession":"https://stackauth.com/auth/global/read-session",      
    "Request":"//snip//",
    "Nonce":"//snip//",
    "Referrer":"//snip//",
    "StorageName":"GlobalLogin"
};

var toMsg = window.parent;
var obj = localStorage.getItem(data.StorageName);

if(obj != null) {
    var req = new XMLHttpRequest();
    req.open(
        'POST', 
            data.ReadSession+
            'request='+encodeURIComponent(data.Request)+
            '&nonce='+encodeURIComponent(data.Nonce)+
            '&seriesAndToken='+encodeURIComponent(obj), 
        false
    );
    req.send(null);

    if(req.status == 200){
        toMsg.postMessage(req.responseText, data.Referrer);
    }else{
        toMsg.postMessage('No Session', data.Referrer);
    }
}else{
    toMsg.postMessage('No Local Storage', data.Referrer);
}

Теперь обратите внимание, что GlobalLogin отправляется через HTTPS на сервер. Таким образом, удаленный злоумышленник, который может читать трафик, не сможет получить токен GlobalLogin.

Таким образом, часть GlobalLogin безопасна для подслушивания.

Однако обратите внимание, что он все еще очень уязвим для обнюхивания cookie сеанса, поскольку он отправляется через HTTP.

Удаленный атакующий, может изменять трафик (MITM)

Ну, здесь, где все становится интересным.

Если вы можете изменить трафик, вы можете сделать что-то действительно весело.

Начальная страница создает iframe, вносящий вышеуказанный URL-адрес stackauth.com через HTTPS. Ну, если вы можете изменить начальную страницу (также возможно через XSS), вы можете изменить запрос на HTTP.

И StackAuth.com будет в порядке с этим. Когда он делает запрос на stackauth.com, вам также нужно будет перехватить его, а также изменить его URL ReadSession как HTTP.

Но тогда все, что вам нужно сделать, это посмотреть вызов на ReadSession URL-адрес и стрелу, вы украли токен GlobalLogin.

Но трафик HTTP в любом случае, так что это не имеет значения, так как вам не нужно проходить эту проблему, чтобы украсть файл cookie. Так зачем беспокоиться?

Локальный атакующий

Если у человека есть доступ к компьютеру для чтения локального файла хранилища, они могут сделать FAR хуже, чем просто украсть ваш токен входа.

Там есть класс атаки под названием "Браузер в центре", где компромисс в браузере позволяет злоумышленнику делать все, что захочет.

И нет реальной эффективной защиты от этого, кроме как пытаться сохранить браузер в безопасности (вы ничего не можете сделать с вашего конца).

Таким образом, если злоумышленник может получить локальный доступ к компьютеру, он перейдет в игру.

Серверный атакующий

Если злоумышленник может получить доступ к серверам StackOverflow, эта игра в любом случае...

Заключение

До тех пор, пока HTTP разрешен (поскольку MITM всегда может понизить подключение к HTTP), нет ничего, что можно было бы защитить, поскольку секреты сеанса всегда можно украсть с помощью подслушивания.

Единственный способ защитить эту информацию - использовать HSTS и повсюду заставить HTTPS.

Стоит отметить, что вы можете защитить GlobalLogin, заставив HSTS на stackauth.com, оставив основной сайт доступным через HTTP. Это не помешает эффекту атаки (захват сеанса). Но он защитит один вектор.

Но переход HTTPS только через HSTS повсюду был бы лучшим и действительно единственным способом предотвращения подобных проблем. Все остальное было бы бандадой при огнестрельном ранении.

Примечание. Я говорил об этом до публикации этого сообщения.