Pull to refresh

Comments 62

Ой зря мне кажется вы выложили это…
Это статья есть на Hacker News. Так что думаю от появляния ее на хабре гораздо хуже не будет
Этой статье несколько лет, читал давным давно где то. Уверен — ничего плохого от этой статьи не произойдет, кому надо и так об этом знал.
Не знаю, совпадение или нет, у меня сейчас Хабр был не доступен около получаса
В сочетании Google Apps Script это просто готовая «машина DDoS»
Теперь фраза «Do more with Google.» раскрывается в новом свете:)
интересно, если вставить ссылку на картинку, хостящуюся на google, он сам себя заддосит? :)
Не думаю, что даже при сильном желании можно хоть как-то заддосить Google :)
По ходу чтения строк
это не уязвимость, и не проходит по программе Bug Bounty.

тоже подумал о том, чтобы заставить гугл ддосить себя, до тех пор пока не сочтут это багом. :)
Гугл высосет сам себя и сколлапсирует в черную дыру.
Не на картинку, а на Google Chrome :)
Вот Вы кому-то бизнесс накрыли :)
PS. Если с 2012 года гугл об этом знает… возможно это кому-то нужно?
Ну со стороны атакуемого источник атаки в данном случае достаточно легко обнаружить и зафильтровать
Их спредшит разве не умеет for?
И? Как это позволит обойти фильтр по рефереру или по IP (если запросы идут через сервер гугла)?
Нет, по рефереру и IP не поможет так как можно создать 1000и запросов сразу (for i in 1000000 do =image:http://google.com?=i done грубо говоря). Не знаю сколько их клиент сможет понаоткрывать соединений правда.
Меня лично в этой истории больше всего напрягает, что feed fetcher игнорирует robots.txt (why, godgoogle, why?!)
robots.txt — это ж для поиска только.
А тут прямые ссылки.
Скажем так, я не против того чтобы «неиндексирующие» боты «по-особому» читали robots.txt

Но было бы удобнее если бы они его все же читали и могли получать из него особые указания (можно было и предусмотреть для этого бота особые команды. Тогда эта проблема с DDOS решалась бы довольно просто)
Да, было бы удобнее, но если запрашивает _не поисковик_, зачем его читать?
запрашивает «робот». В конце концов файл называется robots.txt а не searchbots.txt :)
Однако, директивы его, на текущий момент, предназначены именно для поисковых роботов.
Так я ж разве сие отрицаю?

Я лишь считаю что такое положение дел видится менее удобным.
Тогда, боюсь, ваш комментарий был воспринят не так, как вы ожидали, в том числе и мной
Я же пишу "было бы удобнее"… то есть могло бы быть — но не сбылось :(
Возьмём другую ситуацию. К примеру, у ВКонтакте есть свой парсер статей со сторонних сайтов. Допустим, у вас встала задача написать что-нибудь похожее на такое. Придет ли вам в голову анализировать robots.txt прежде чем обрабатывать ссылку, которую оставил ваш пользователь? Осмелюсь предположить, что скорее всего, нет.
Это — не самая плохая идея.

Нет, конечно, there is more than one way to skin a cat, но продумать простой и доходчивый вариант управления доступом со стороны хозяев внешнего сайта — стоит.

А еще стоит все-таки подумать о возможности превращения такого изделия в инструмент «мелкого дедоса»
Robots.txt поддерживают не только поисковики, но и некоторые программы (типа Xenu или Teleport Pro). Поэтому, например, для защиты от парсинга имеет смысл добавлять туда соответствующие директивы.
Действительно вежливо со стороны любой автоматики его читать.
Насколько помню, robots.txt — лишь рекомендация индексирования, к тому же связана с поисковой выдачей.
Yahoo pipes не делает fetch страниц с сайта, закрытого с помощью robots.txt
В принципе, схожая ситуация.
А этот FeedFetcher ходит с разных ip? Разве нельзя его тупо забанить? Или он ходит оттуда же, откуда и индексатор гугла?
С разных, но пишут, что User-Agent всегда один и тот же, так что заранее забанить, думаю, можно…
К варианту «как сломать» в пост стоит, в таком случае, добавить «как лечить», думаю…
Интересно, сколько своих серверов ляжет из-за тестов?
Сделал по примеру *.pdf файл, замену адреса на *.php файл и получил такой запрос от гугла

10.03.2014 16:34:12
Array
(
[REDIRECT_STATUS] => 200
[HTTP_HOST] => ***
[HTTP_X_SHINDIG_DOS] => on
[HTTP_CACHE_CONTROL] => no-cache, no-store
[HTTP_CONNECTION] => Keep-alive
[HTTP_USER_AGENT] => Mozilla/5.0 (compatible) Feedfetcher-Google; (+http://www.google.com/feedfetcher.html)
[HTTP_ACCEPT_ENCODING] => gzip,deflate
[PATH] => /usr/local/bin:/usr/bin:/bin
[SERVER_SIGNATURE] =>
[SERVER_SOFTWARE] => Apache
[SERVER_NAME] => ***
[SERVER_ADDR] => ***
[SERVER_PORT] => 80
[REMOTE_ADDR] => 66.249.81.232
[DOCUMENT_ROOT] => /var/www/***/www
[SERVER_ADMIN] => [no address given]
[SCRIPT_FILENAME] => /var/www/***/www/somepdf.php
[REMOTE_PORT] => 54687
[REDIRECT_URL] => /some.pdf
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /some.pdf
[SCRIPT_NAME] => /somepdf.php
[PHP_SELF] => /somepdf.php
[REQUEST_TIME] => 1394454852
)

А что если на уровне системы блокировать по USER_AGENT?
Так и надо сделать, вероятно.
'|Feedfetcher-Google' я зря дописал, ~* — регистронезависимый, так что этой строки не нужно.
Вы вообще зря его редактировали, добавление поиска feedfetcher-google дублирует поиск просто робота google (1ый в списке).
Как проверить, что моя таблица на гугл.докс с запросами на картинку + параметр, работает?
Спортивный интерес, Вы не подумайте ничего лишнего: О
Я запускал синатру, она в консоль пишет все запросы и ip (изменить адрес и порт на свои):

ruby -rsinatra -e'set :public_folder, "."; set :bind, "192.168.0.102"; set :port, 8080;'

Вывод части теста:

Скрытый текст
66.249.83.56 — - [10/Mar/2014 19:04:06] «GET /__sinatra__/157 HTTP/1.1» 404 457 0.0031
66.249.83.56 — - [10/Mar/2014 19:04:06] «GET /__sinatra__/158 HTTP/1.1» 404 457 0.0015
66.249.83.56 — - [10/Mar/2014 19:04:06] «GET /__sinatra__/159 HTTP/1.1» 404 457 0.0008
66.249.83.56 — - [10/Mar/2014 19:04:07] «GET /__sinatra__/160 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:07] «GET /__sinatra__/161 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:07] «GET /__sinatra__/162 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:07] «GET /__sinatra__/163 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:08] «GET /__sinatra__/164 HTTP/1.1» 404 457 0.0012
66.249.83.56 — - [10/Mar/2014 19:04:08] «GET /__sinatra__/165 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:08] «GET /__sinatra__/166 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:08] «GET /__sinatra__/167 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:09] «GET /__sinatra__/168 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:09] «GET /__sinatra__/169 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:09] «GET /__sinatra__/170 HTTP/1.1» 404 457 0.0015
66.249.83.56 — - [10/Mar/2014 19:04:09] «GET /__sinatra__/171 HTTP/1.1» 404 457 0.0016
66.249.83.56 — - [10/Mar/2014 19:04:09] «GET /__sinatra__/172 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:10] «GET /__sinatra__/173 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:10] «GET /__sinatra__/174 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:10] «GET /__sinatra__/175 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:10] «GET /__sinatra__/176 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:11] «GET /__sinatra__/177 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:11] «GET /__sinatra__/178 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:11] «GET /__sinatra__/179 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:11] «GET /__sinatra__/180 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:11] «GET /__sinatra__/181 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:12] «GET /__sinatra__/182 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:12] «GET /__sinatra__/183 HTTP/1.1» 404 457 0.0015
^C66.249.83.56 — - [10/Mar/2014 19:04:12] «GET /__sinatra__/184 HTTP/1.1» 404 457 0.0013
А если сюда еще и функцию GOOGLECLOCK() добавить…
Подскажите а такая схема поможет?

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?masite\.ru/ [nc]
RewriteRule .*\.(gif|jpe?g|png|bmp|pdf|zip|rar|mp3|js)$ — [F]
Во-первых, есть мнение, что при неблагоприятном стечении обстоятельств апач рискует умереть еще до выполнения mod_rewrite.
Во-вторых, эта схема защищает только картинки — но злоумышленник не обязан загружать именно их. Ведь ему не нужен результат в виде картинки на экране — ему нужен запрос к серверу. А значит, он вполне может поставить ссылки на главную страницу сайта.
В-третьих, Referer — это необязательный заголовок. Браузеры для параноиков не будут передавать его вам.
А неужели нет никакого заголовка, который бы сообщал браузеру о том, что «данный файл неизменен относительно query-части в location»?
Теоретически можно делать редирект на урл без параметра запроса. А тот урл уже будет говорить not-modified
Нет, таких способов нет. Есть редиректы, есть canonical url, но оба способа работают только после того, как запрос с новой query-частью уже был отправлен. Еще я где-то видел альтернативные url — но там можно указать лишь конечное число записей, злоумышленник же всегда придумает что-то еще.
Надеюсь, писатели облачных хостингов добавят защиту от этого в свои конфиги. Иначе действительно можно высосать сколько угодно трафика (который в облаках оплачивается помегабайтно), и владелец аккаунта получит счет на десятки тысяч баксов.
google уважает robots.txt, не? можно запретить там все большие файлы.
FeedFetcher не является поисковым роботом, он, фактически, загружает для пользователя указанные пользователем же материалы.
> Вчера я отправил описание этого бага в Google и получил ответ, что это не уязвимость, и не проходит по программе Bug Bounty. Возможно, они заранее знали о нём, и действительно не считают это багом?

Надо тогда натравить Spreadsheet на сервисы Google, пусть отрабатывают фичу :)
К слову говоря — вконтакте тоже забират своим сервером картинки с сайтов…
Вероятно и им можно уложить сайт, чуть позже даже проверю

Даже проверил:
87.240.182.189 — - [11/Mar/2014:12:49:38 +0300] «GET /images/index.jpg HTTP/1.1» 206 80802 "-" «Mozilla/5.0 (compatible; vkShare; +http://vk.com/dev/Share)»
И фейсбук тоже должен.
И gmail с недавних пор выкачивает картинки из писем.
Теперь идеальный DDoS будет выглядеть как публикация картинки в спредшит, отправления ссылки на неё в гмайл и запощиванием в свой фейсбук и вконтакт.
Only those users with full accounts are able to leave comments. Log in, please.