Comments 48
ну это еще один повод советовать пользователям хром уже сейчас. И пусть остальные себе копошаться. Юзерам надо плюшки, уже сейчас возможные только сокетами, а не пространные рассуждения о возможных атаках
Блин, я уж игруху почти написал с этой технологией, во меня подставили.
Вот уж действительно, у нас тоже проект на вебсокетах в разработке. Надеюсь, проблему быстро устранят. Протокол-то хороший.
Пользуясь вот такими претендентами на стандарт вы сами себя подставляете. Это все равно что пользоваться рабочими сборками программ и жаловаться на их нестабильность…
Отличный пример того, почему не стоит сразу кидатся использовать неутвержденные стандарты.
Мы чуть менее года назад думали о том, чтобы использовать Web SQL Database в одном из проектов для поддержки офлайн режима. К счастью вовремя отказались от этой идеи и спустя некоторое время узнали, что проект стандарта спустили в унитаз.
Мы чуть менее года назад думали о том, чтобы использовать Web SQL Database в одном из проектов для поддержки офлайн режима. К счастью вовремя отказались от этой идеи и спустя некоторое время узнали, что проект стандарта спустили в унитаз.
Не очень понял ваше описание уязвимости. Если я держу обычный HTTP прокси, мне тоже ничего не мешает подменить закешированный у меня www.google-analytics.com/ga.js. Почему же HTTP не признают опасным протоколом?
Подвох в том, что прокси чужой. Понятно, что если прокси мой, то я всегда могу подменить данные, проходящие через меня.
Подробности здесь www.adambarth.com/experimental/websocket.pdf.
Подробности здесь www.adambarth.com/experimental/websocket.pdf.
Подвох в том, что по тексту статьи не понятно, чем это плохо в случае WebSokets и почему другие протоколы этому не подвержены. Статью скачал, на свежую голову попробую понять :)
Суть проблемы в следующем, как я понимаю:
Между клиентом и сервером стоит промежуточная прозрачная прокси, часто выполняющая кеширующую функцию.
Злоумышленник коннектится через эту прокси к своему серверу, открывая сокет-соединение. В посылаемый запрос, который распознается прокси как обычный http-запрос, злоумышленник вставляет дополнительные данные, которые промежуточной прокси в силу ряда причин трактуются как второй запрос.
Этот второй запрос в качестве хоста содержит сервер-жертву (target.com), но посылается в рамках сокет-соединения туда же, куда и первый. И получает ответ от сервера злоумышленника с нужной информацией.
Дальше этот запрос вместе ответом кешируется в прокси.
Клиент-жертва обращается за этой же информацией на свой сервер, но так как его запросы выглядит также, как запрос злоумышленника, то он получает версию информации от злоумышленника, закешированную в прокси. И есть обратная схема, когда подменяется направление запроса (IP сервера).
В случае веб-сокетов это становится возможным в силу того, что промежуточная прокси не понимает, что ее используют для веб-сокетов и первичный запрос на открытие сокета и последующие запросы она видит как обычные http-запросы.
Между клиентом и сервером стоит промежуточная прозрачная прокси, часто выполняющая кеширующую функцию.
Злоумышленник коннектится через эту прокси к своему серверу, открывая сокет-соединение. В посылаемый запрос, который распознается прокси как обычный http-запрос, злоумышленник вставляет дополнительные данные, которые промежуточной прокси в силу ряда причин трактуются как второй запрос.
Этот второй запрос в качестве хоста содержит сервер-жертву (target.com), но посылается в рамках сокет-соединения туда же, куда и первый. И получает ответ от сервера злоумышленника с нужной информацией.
Дальше этот запрос вместе ответом кешируется в прокси.
Клиент-жертва обращается за этой же информацией на свой сервер, но так как его запросы выглядит также, как запрос злоумышленника, то он получает версию информации от злоумышленника, закешированную в прокси. И есть обратная схема, когда подменяется направление запроса (IP сервера).
В случае веб-сокетов это становится возможным в силу того, что промежуточная прокси не понимает, что ее используют для веб-сокетов и первичный запрос на открытие сокета и последующие запросы она видит как обычные http-запросы.
Подвох не в этом. Подвох в том, что прокси использует для кэширования хэддер Host, а не IP адрес сервера. Тут такой вектор атаки:
1. Мы создаем swf которая при открытии страницы создает сокет соединение с сервером attacker.com по 843 и получаем с него policy файл разрешающий подключение по всем портам.
2. Создаем socket соединение по 80 порту с сервером attacker.com.
3. Создаем запрос с фейковым хэддером:
по которому наш attacker.com вернет зловредный код script.js. Так как прокси для кэширования использует Host — в кэше окажется наш зловредный код, но принадлежащий к target.com, а не к attacker.com.
4. Пользователь запрашивает target.com/script.js и прокси отдает ему файл из кэша — файл полученный ранее с attacker.com.
1. Мы создаем swf которая при открытии страницы создает сокет соединение с сервером attacker.com по 843 и получаем с него policy файл разрешающий подключение по всем портам.
2. Создаем socket соединение по 80 порту с сервером attacker.com.
3. Создаем запрос с фейковым хэддером:
GET /script.js HTTP/1.1
Host: target.com
по которому наш attacker.com вернет зловредный код script.js. Так как прокси для кэширования использует Host — в кэше окажется наш зловредный код, но принадлежащий к target.com, а не к attacker.com.
4. Пользователь запрашивает target.com/script.js и прокси отдает ему файл из кэша — файл полученный ранее с attacker.com.
Спасибо!
Прозрачный прокси должен выполнять серверные запросы к IP в который резолвится заголовок Host.
Если он вместо этого использует оригинальный IP назначения клиентского соединения, то это уязвимость конкретного прокси.
Причем здесь Web sockets? Вероятно уязвимость в чем то другом.
Если он вместо этого использует оригинальный IP назначения клиентского соединения, то это уязвимость конкретного прокси.
Причем здесь Web sockets? Вероятно уязвимость в чем то другом.
Это вопрос не веб-сокетов в браузере, а вопрос протокола, предлагающего решение, которое в таких случаях можно массово эксплуатировать. Да, это проблема прокси и правильной настройки прокси. Но эту проблему массово никато исправить не может, а вот пофиксить протокол — да.
А откуда про массовость проблемы известно?
Ни squid ни другие популярные прокси сервера такой уязвимости как transparent cache poisoning (из-за игнорирования DNS) не содержат, иначе она давно стала бы известна безо всяких веб сокетов.
Ни squid ни другие популярные прокси сервера такой уязвимости как transparent cache poisoning (из-за игнорирования DNS) не содержат, иначе она давно стала бы известна безо всяких веб сокетов.
3 месяца назад начинал новый проект, и тогда серьёзно думал писать целиком под вебсокеты. Слава богу вовремя одумался в сторону APE. В нём, кстати говоря, реализованы различные методы передачи данных от клиента к серверу и наоборот (transport methods): Long Polling, JSONP. А в последних git версиях есть и поддержка 76 версии вебсокетов, так, что ребята работают в этом направлении, и, есть все основания верить, что с превращением Web Sockets в нормальную стабильную технологию можно будет с минимальными трудозатратами заставить работать приложение на APE через вебсокеты.
А в вебсокетах нет чего-нибудь вроде аналога ssl? Ну так с самого начала надо было думать :-/
Да на самом деле если кто то сейчас и разрабатывает на веб-сокетах, то, скорее всего, для подстраховки на случай когда они не поддерживаются браузером, имеет или Long Pooling или Flash альтернативу
Как я понял, IE и не собирался поддерживать WebSockets. А вот как насчет WebKit'овских браузеров (Chrome, Safari, др.)? Они будут выключать WebSockets?
Apple и Google, вроде, пока молчат относительно будущих версий и поддержки или неподдержки веб-сокетов.
Представители Microsoft периодически участвуют в дискуссиях по WebSockets и протоколу, но скорее выжидают стабилизации стандарта. Внутри есть понимание, что в целом, это нужная вещь. Но на грабли несовместимостей при реализации наступать как-то не хочется ;)
Представители Microsoft периодически участвуют в дискуссиях по WebSockets и протоколу, но скорее выжидают стабилизации стандарта. Внутри есть понимание, что в целом, это нужная вещь. Но на грабли несовместимостей при реализации наступать как-то не хочется ;)
Бля. Ну, ничего, есть пока что Flash Websocket, можно и через него работать.
Mozilla/5.0 (X11; Linux i686; rv:2.0b8pre) Gecko/20101209 Firefox-4.0/4.0b8pre
В версии 4.0~b8~hg20101209r58922+nobinonly-0ubuntu1~umd1~maverick из PPA уже выпилено. Печаль…
В версии 4.0~b8~hg20101209r58922+nobinonly-0ubuntu1~umd1~maverick из PPA уже выпилено. Печаль…
about:config -> network.websocket.override-security-block -> true
Выдыхаем и продолжаем свои переднекраевые экзерсисы.
Выдыхаем и продолжаем свои переднекраевые экзерсисы.
хорошо, что есть такая штука, как socket.io.
сменить веб-сокеты, на лонг-поллинг и прочее доисторическое говно можно крайне легко.
сменить веб-сокеты, на лонг-поллинг и прочее доисторическое говно можно крайне легко.
У меня такое ощущение, что развитие IT-технологий — это вечное переизобретение велосипеда, только каждый раз более грузного и медленного. Изначально существовали обычные TCP-сокеты, которые решали и до сих пор решают поставленную задачу. Вебсокеты — это очередной велосипед, только средствами браузера.
Всё-таки зря назвали эту технологию «сокетами», люди путаются. TCP-сокеты и WebSocket — это совсем разные вещи. Примерно как JavaScript и Java.
> WebSocket — протокол полнодуплексной двунаправленной связи поверх TCP соединения, предназначенный для обмена сообщениями между браузером и веб-сервером в режиме реального времени.
Один реализуется поверх другого. Отличие примерно такое же как между JavaScript и JQuery. Но цель у них одна — дуплексный обмен данными в реальном времени. Использовать голый TCP в окружении браузера проблематично — это не юникс, и с тредами здесь проблемы. Поэтому добавили асинхронный JavaScript API для пакетного обмена.
Основная идея — прикинуться обычным http-запросом и как бы обойти корпоративные файрволы, для того, чтобы чатиться на фейсбуке или в gtalk-е. Реально же файрволы попросту обрежут непонятые хидеры и все.
Один реализуется поверх другого. Отличие примерно такое же как между JavaScript и JQuery. Но цель у них одна — дуплексный обмен данными в реальном времени. Использовать голый TCP в окружении браузера проблематично — это не юникс, и с тредами здесь проблемы. Поэтому добавили асинхронный JavaScript API для пакетного обмена.
Основная идея — прикинуться обычным http-запросом и как бы обойти корпоративные файрволы, для того, чтобы чатиться на фейсбуке или в gtalk-е. Реально же файрволы попросту обрежут непонятые хидеры и все.
А чем WebSocket, как интерфейс, отличается от, например, TCP Socket?
Так что можно было те же сокеты TCP дооформить до нужного уровня безопасности, и включить в стандартный набор браузера.
Так что можно было те же сокеты TCP дооформить до нужного уровня безопасности, и включить в стандартный набор браузера.
Есть такая старая мысль, что всё развивается по спирали.
очень расстроен( буквально на них одних я делал ставку в проекте
Сейчас рано делать ставку на эту технологию. Кроме того пройдет немало времени, прежде чем все клиенты будут поддерживать ее. Поэтому лучше использовать оболочку для дуплексных коннекшнов, которая снизу умеет работать как с Comet, так и с WS. Для серверной части это фреймворк Atmosphere. К нему существует куча клиентов, например JQuery plugin: jfarcand.wordpress.com/2010/06/15/using-atmospheres-jquery-plug-in-to-build-applicationsupporting-both-websocket-and-comet
В своем проекте я использовал GWT Comet. В итоге не придется адаптировать логику на сервере и на клиенте под каждый тип коннекшна.
В своем проекте я использовал GWT Comet. В итоге не придется адаптировать логику на сервере и на клиенте под каждый тип коннекшна.
Sign up to leave a comment.
Веб-сокеты временно отменяются