Ответ 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 повсюду был бы лучшим и действительно единственным способом предотвращения подобных проблем. Все остальное было бы бандадой при огнестрельном ранении.
Примечание. Я говорил об этом до публикации этого сообщения.