Xpoint
   [напомнить пароль]

Дыры безопасности в моем Анти-Анонимайзере

Метки: [без меток]
2006-01-27 15:21:22 [обр] Даниэль Алиевский(9/125)[досье]

Уважаемые коллеги!

Я был бы очень признателен, если бы вы попытались найти "дыры" в недавно разработанной мной технологии, обсуждавшейся здесь: Об анти-анонимайзере

Принципы работы описаны здесь: http://webwarper.net/wwantianonymizerru.htm#wwaa

Вначале я думал, что все просто :) Но сегодня, разбирая, каким путем некий спамер преодолел мою защиту на некоем форуме, стал искать "дыры" - и сразу нашел (умозрительно) целых две. Наверно, есть еще. Эти дыры теперь закрыты, но пока не отражены в документации.

Дыра #1. Я полагал, что достаточно проверить на исходном защищаемом сервере кукис ww___aaStatus. Он ставится анти-анонимайзером и, по идее, должен содержать либо правильный IP, либо указание на некую проблему (и в этом случае можно запретить постинг). Очень глупо. Ведь хороший хакер может запросто сымитировать запрос броузера для ситуации, когда все в порядке. И подставить любой желаемый IP, скажем, IP анонимного прокси. Да что там, можно просто вручную отредактировать кукис броузера.

Решение: конечно, шифрование. Апплет неким "хитрым" способом шифрует найденный IP, серверный скрипт webwarper его расшифровывает и передает исходному серверу в виде традиционного x-forwarded-for. Причем при зашифровке IP снабжается контрольной суммой, и если webwarper обнаруживает несоответствие, выдается сообщение об ошибке (а можно было бы сделать что-нибудь похуже). Конечно, очень умный хакер может скачать апплет, восстановить Java-код и разобраться в алгоритме, а затем применить для шифровки собственного кода. Но с этим, кажется, в принципе ничего поделать нельзя - классическая неразрешимая задача защиты от отладчика. Точно разобравшись, как работает клиентский софт, можно послать серверу все, что угодно, и "обмануть" его. Впрочем, если такой случай произойдет, ничто не мешает поменять алгоритм.

Дыра #2. Расшифровка происходит на сервере webwarper.net, а не на оригинальном сервере. Поэтому можно легко обмануть оригинальный сервер - послать ему запрос, в котором будет указано, что страница якобы пропущена через WebWarper, и стоит нужный хакеру x-forwarded-for.

Решение: проверять на оригинальном сервере REMOTE_ADDR (а не только кукис). REMOTE_ADDR должен обязательно соответствовать webwarper.net.

Может быть, я еще чего-то не учел? Был бы очень благодарен, если найдете другие "дыры". Даже если они окажутся, увы, непреодолимыми и поставят крест на технологии.

P.S. Я уезжаю до 8 февраля. Но потом с радостью прочитаю комментарии, если таковые будут :)

спустя 2 часа 4 минуты [обр] Даниэль Алиевский(9/125)[досье]

Кстати, если можно, еще один глупый вопрос. (Не обижусь, если ответите RTFM :))

В том обсуждении звучала мысль поддержать вариант со скриптом в Macromedia Flash, вместо апплета.

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

А что в случае Flash? Его скрипты тоже во что-то компилируются? Или, загрузив себе на компьютер Flash-компоненту, с помощью любой системы редактирования Flash-роликов мы увидим исходный код алгоритма?

Еще раз извиняюсь за тривиальный вопрос: я до сих пор никогда не работал с Flash, у меня даже пока нет систем разработки :)

спустя 8 минут [обр] Алексей В. Иванов(28/2861)[досье]
Искодный код флэша компилируется в байт-код, который после "зажимается" с помощью gzip, но декомпилируется это все в искодный текст "на счёт раз", кому надо.
спустя 16 минут [обр] Даниэль Алиевский(9/125)[досье]

Алексей В. Иванов[досье] Байт-код? Я верно понял, что защита от понимания не хуже, чем в случае Java? Ибо если нет, не стоит и разбираться с Flash.

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

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

спустя 2 дня 2 часа [обр] Владимир Палант(80/4445)[досье]

Если вас беспокоит защита кода апплета — просто не вставляйте туда ничего важного. Хотите шифровать IP-адрес? Шифруйте его на сервере. Отдавайте апплету уже зашифрованный адрес, который он поместит в cookie. Апплету незачем знать, как расшировывается адрес, соответственно и злоумышленник из его кода ничего взять не может.

Поищите в Google "replay attack". Шифрование вам не сильно поможет, если один и тот же IP всегда шифруется в одно и то же значение cookie. Злоумышленник может к примеру создать собственный сайт и предложить вход через WebWarper. Предполагаю, что WebWarper вырезает свой cookie из запроса. Тем не менее сайт может прочитать cookie с помощью JavaScript (document.cookie). И уже ничего не мешает злоумышленнику пользоваться этим cookie, чтобы заходить на чужие сайты с фальшивым IP-адресом.

Можно, конечно, сделать шифрование зависимым от сайта (к REMOTE_ADDR, который виден на WebWarper, лучше не привязываться — некоторые прокси меняют внешний IP при каждом запросе). Но чтобы действительно решить эту проблему, придется отказаться от state-less подхода. Вариант: когда апплет связывается с сервером, он получает обратно идентификатор сессии, который и попадает в cookie. К этому идентификатору сервер привязал IP пользователя, причем через час сессия истекает и IP проверяется заново.

Кстати, я правильно понял, что WebWarper проксирует cookie? В этом случае у вас широко открытая XSS-дыра (см. cross-site scripting на Google), ведь для браузера у всех сайтов один и тот же домен. Тут есть только одно решение — сделать WebWarper настоящим HTTP-прокси (можно альтернативно к существующему веб-интерфейсу, но тогда рекомендовать его использование, если пользователь где-либо авторизуется). Думаю, что с mod_proxy это реализовать несложно.

спустя 6 минут [обр] Владимир Палант(80/4445)[досье]
Обнаружил Как уберечь cookies от затирания при переполнении лимита 20? - оказывается по поводу XSS вам уже все насоветовали.
спустя 1 час 21 минуту [обр] Старынин Валерий(2/57)[досье]
А как быть, если у меня вся сетка выходит в интернет через прокси? Запретить ей доступ?
спустя 11 дней [обр] Даниэль Алиевский(9/125)[досье]

Владимир Палант[досье]
Спасибо за дельные комментарии. Однако ж...

Если вас беспокоит защита кода апплета — просто не вставляйте туда ничего важного. Хотите шифровать IP-адрес? Шифруйте его на сервере. Отдавайте апплету уже зашифрованный адрес, который он поместит в cookie. Апплету незачем знать, как расшировывается адрес, соответственно и злоумышленник из его кода ничего взять не может.

Да, эта идея (шифрование на стороне сервера) правильная - немного я недодумал. Но, к сожалению, это не очень полезно. Предположим, я, злоумышленник, читаю исходный код апплета и умею программировать. Я вижу, что в некотором месте апплет напрямую, через сокеты, обращается к некоторому серверному скрипту (а именно к http://webwarper.net/returnip.pl), который ему нечто возвращает, пусть даже зашифрованное (чего сейчас нет). И в конечном счете JavaScript формирует некий хитрый кукис, в котором это нечто присутствует, пусть даже еще раз зашифрованное (что сейчас есть). Что ж, я целиком клонирую страницу, прописываю в \WINDOWS\system32\drivers\etc\hosts, что webwarper.net есть IP моего компьютера, и слегка правлю апплет, чтобы он обращался к returnip.pl не напрямую, а обычным способом (т.е. с учетом прокси броузера). Захожу через какой-нибудь левый прокси и вижу, какой кукис при этом получается. Этот кукис и будет ключом, позволяющим мне "пройти" на защищенный сайт. Достаточно сопроводить мой POST-запрос таким же кукисом, и сервер будет считать "истинным" IP-адресом IP выбранного мною прокси.

Возможно, задача защиты от подделки IP принципиально неразрешима, если считать, что злоумышленник достаточно умен для дешифровки исходного кода апплета. С другой стороны, защититься от дизассемблирования можно достаточно хорошо, а алгоритм можно менять хоть каждую неделю. Тогда взлом будет стоить, по меньшей мере, дороже, чем переключение на другого провайдера. Хотя, к сожалению, он все-таки будет оправдан, если злоумышленник ставит целью спрятаться от уголовного следствия. (См. мою ссылку в начале темы - насчет целей Анти-Анонимайзера. Переключение провайдера или визит в Internet-кафе малоэффективны против профессионального следствия, а вот указание в качестве "реального IP" адреса случайного сервера из Мумбо-Юмбо может спасти.)

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

Зачем так сложно? :) Любая утилита типа Live HTTP Headers позволит увидеть все кукисы, отправляемые на сервер. Хотя, может быть, я не понял вашу мысль. Как злоумышленник создаст фальшивый IP, не зная алгоритма, как именно его следует зашифровать? А чтобы узнать алгоритм, нужен исходный код, который можно защитить от дизассемблирования.

Вариант: когда апплет связывается с сервером, он получает обратно идентификатор сессии, который и попадает в cookie. К этому идентификатору сервер привязал IP пользователя, причем через час сессия истекает и IP проверяется заново.

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

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

Еще раз повторяю вопрос к MacroMedia-программистам. Верно ли я понял, что скрипты MacroMedia, точно так же как и Java-код, компилируются в некоторый внутренний байт-код? И, соответственно, их так же удобно защищать от дизассемблирования, как Java-классы (для которых есть обфускаторы, скажем, в JavaBuilder)?

Кстати, я правильно понял, что WebWarper проксирует cookie? В этом случае у вас широко открытая XSS-дыра (см. cross-site scripting на Google), ведь для браузера у всех сайтов один и тот же домен.

А в каком смысле "дыра"? Разные сайты все равно не могут прочитать кукисы друг друга - ясное дело, что при передаче кукиса я всегда снабжаю его соответствующим path. А установку кукисов средствами JavaScript я попросту блокирую :) Понятно, что если два сайта "знают" про WebWarper и специально хотят обменяться кукисами, то их разработчики смогут обойти мои блокировки. Ну и в чем тут беда? Кукисы, установленные нормальным путем, остаются приватными для сайтов.

И как эта "дыра" мешает анти-анонимайзингу?

Старынин Валерий[досье]

А как быть, если у меня вся сетка выходит в интернет через прокси? Запретить ей доступ?

Эта ситуация, скорее всего, будет классифицирована анти-анонимайзером как ErrorCannotConnect (см. мою документацию). Ибо апплет, пытаясь действовать в обход прокси, просто не сможет выйти в сеть. Что делать в этом случае - решать автору сайта. Можно отрубить таких пользователей вообще (некоторые сервисы в таких условиях, действительно, не работают). Можно дать им альтернативный вход с модерацией сообщений. А можно, наоборот, считать, что все в порядке - ибо почти всегда в таких случах IP соответствует одной организации. Блокировка такого IP, на фоне мирового интернета, практически не скажется на количестве посетителей. И найти организацию, при жесткой необходимости, тоже можно.

спустя 16 дней [обр] Даниэль Алиевский(9/125)[досье]

Странно, что никто пока не вспомнил про VPN. Сейчас по миру раскиданы анонимные прокси. С ними можно бороться, хоть и тяжело.

А если вместо них будет множество бесплатных VPN-серверов по всему миру? И публичные обновляемые базы таких серверов, с открытыми логинами? Против такого лома, вроде бы, нет приема. Никак не обнаружить, что ты лишь пользуешься аргентинским VPN, а на самом деле находишься где угодно. Разве что весьма низкоуровневым API, который не один броузер не даст запускать. С точки зрения броузера, ты - аргентинец. Или я что-то недопонимаю?

спустя 3 часа 50 минут [обр] Сергей Чернышев(39/589)[досье]

Даниил, против лома нет приема. Если человек связал трубки двух телефонных автоматов, как это делали в супербоевике "Хакеры", то вам ничто не поможет кроме Большого Брата который видит все и вся.

Я к тому, что бывают еще и SSH-тунели и еще черта лысого - я бы вам не рекомендовал опускаться до уровня TCP.

спустя 1 час 25 минут [обр] Даниэль Алиевский(9/125)[досье]

Сергей Чернышев[досье] Бывает-то много чего, было бы смешно придумывать как универсальную защиту от преступника, так и универсальную защиту от Большого Брата :) Однако и те, и другие должны знать меру, а вот этому простые программисты вроде нас, пожалуй, могут помочь.

Бесплатный анонимный прокси - это все-таки пустяки. Навряд ли кто-нибудь станет возражать, что законодательно, что на неформальном уровне, если я поставлю себе на домашний компьютер какой-нибудь прокси, отключу передачу x-forwarder-for и открою всему миру. Покуда не буду для этого воровать трафик. Мало ли зачем мне это нужно? Потому таковых прокси и немеряное количество. И понятно, что обманывает такой прокси только штатный броузер. Если кому нужна защита от спамеров - технологий, аналогичных Анти-Анонимайзеру, можно придумать сколько угодно.

А вот если я начну организовывать VPN-сервера, да еще с открытыми паролями для всех... Это уже анонимизация всех вариантов выхода в Internet. Впрочем, черт его знает. По идее, такие начинания должны как-то ограничиваться - или законодательно, или технически (возможность опознать VPN со стороны сервера). Иначе ведь действительно у хакеров будет полная свобода засорять Internet-форумы чем угодно. Создание вирусов, в конце концов, уголовно наказуемо (если не ошибаюсь).

спустя 6 часов [обр] Сергей Чернышев(39/589)[досье]

Даниэль Алиевский[досье]
Анонимный Socks proxy - это практически VPN-сервер и таких много и они стоят дешево. Мне нужно было для некоторых кратковременных, но весьма насыщенных исследований посылать много запросов на один популярный search engine, который не любит этого дела и я затачивал LWP под работу через серию Socks-серверов.

Так что все это вполне реально и о реальной защите говорить достаточно бесполезно. Хотя, вероятно, я не похож по уровню на типичного спаммера средней руки и, скорее всего ваш тул будет полезен кому-то.

спустя 6 часов [обр] Даниэль Алиевский(9/125)[досье]

Сергей Чернышев[досье]

...я затачивал LWP под работу через серию Socks-серверов... Хотя, вероятно, я не похож по уровню на типичного спаммера средней руки

Поняли ли мы друг друга? При чем тут LWP? Логика апплетной защиты и необходимость взлома его кода обсуждалась выше. Пока апплет не отправит правильно зашифрованный код на сервер, тот не примет постинг. Если не говорить о взломе (дизассемблировании) апплета, то для обхода защиты необходимо добиться, чтобы при обращении апплета к скрипту на webwarper.net этот скрипт получил фальшивый REMOTE_ADDR. Обращение апплета выглядит так:

Socket sock = new Socket(url.getHost(), 80);
String request = "GET " + url.getFile() + " HTTP/1.1\r\n"
    + "Host: " + url.getHost() + "\r\n"
    + "\r\n";
byte[] requestBytes = ... (request в виде цепочки байтов);
OutputStream os = sock.getOutputStream();
os.write(requestBytes);
InputStream is = sock.getInputStream();
читаем ответ скрипта из is;

Но этот код, по изначальному предположению, спамеру недоступен и модифицирован быть не может. Ситуация взлома апплета по определению не рассматривается, ибо это очевидное и полное решение проблемы обхода защиты.

Если и возможно в данной ситуации скрыть свой IP, то квалификация тут не нужна. Нужно средство, которое заставит все апплеты, флэшки (в будущем) и аналогичные прибамбасы к веб-странице работать от имени желаемого, то бишь фальшивого IP, расположенного где-нибудь в далекой стране. Например, достаточно подключиться к публично открытому VPN, и все сокеты в системе начнут работать через этот VPN. Только вот, в отличие от громадных списков публичных, доступных всем анонимизирующих прокси, а также анонимайзеров вроде моего WW, аналогичных списков бесплатных анонимизирующих VPN я пока в Internet не видел.

Насчет socks-прокси я не уверен, негде проверить. И я с ними никогда не работал. Вообще-то про настройки прокси в броузере сокеты апплета ничего "не знают". Скажем, для HTTP-прокси сам запрос request должен быть другим. Разве, если в броузере настроить SOCKS Proxy, то любой экземпляр new Socket в апплете начнет им пользоваться? По-моему, нет. Во всяком случае, сейчас у меня в FireFox настроен некий SOCKS Proxy (собственно, одинаковый прокси для всех протоколах). Причем, насколько я знаю, на самом деле этот прокси SOCKS не поддерживает. АнтиАнонимайзер прекрасно работает - апплет соединяется от имени истинного IP.

спустя 8 часов [обр] Сергей Чернышев(39/589)[досье]

Даниэль Алиевский[досье], я не углублялся в вопрос защиты апплета, который вы обсуждали - я говорил просто о целесообразности защиты от VPN и пр.

Что касается апплета, то мне кажется, что если все web-соединения на низком уровне пропущены через Socks, то из Java как не пытайся - пройти "по другому пути" до сервера вам не удастся все равно и больше информации вы не получите. Хотя, возможно, я и не прав.

спустя 33 минуты [обр] Даниэль Алиевский(9/125)[досье]

Сергей Чернышев[досье]

Что касается апплета, то мне кажется, что если все web-соединения на низком уровне пропущены через Socks, то из Java как не пытайся - пройти "по другому пути" до сервера вам не удастся все равно и больше информации вы не получите.

Наверно, так и есть - только как это сделать, "пропустить все web-соединения через Socks на низком уровне"? Я могу понять - настроить все варианты proxy в броузере, но у меня это не дает эффекта.

спустя 9 часов [обр] Сергей Чернышев(39/589)[досье]

Фиг знает - может и нельзя так сделать на самом деле - тогда Socks, до VPN-а не дотягивает.

Думаю, что на крайняк можно тунель делать - через ssh, например.

спустя 7 часов [обр] Даниэль Алиевский(9/125)[досье]

Сергей Чернышев[досье]

Думаю, что на крайняк можно тунель делать - через ssh, например.

Чувствую, плохо вы понимаете, да и прочие коллеги, о чего я пытаюсь построить защиту :)
Сделать, конечно, можно все что угодно, обладая квалификацией, если у тебя (или у друга) есть некий сервер, куда можно ставить VPN, организовывать туннель и т.п. От этого защищаться не надо. Если у тебя есть доступ к серверу, чей IP ты хочешь выдать за свой, ты можешь попросту физически прийти и сесть за него.

Попытаюсь сказать предельно четко. Я утверждаю, что нужна защита от следующей ситуации.

  1. Есть спамер за компьютером A, подключенный к провайдеру, или набору провайдеров, или серверу интернет-кафе.
  2. Спамер хочет, чтобы сервер, на который он шлет сообщение, зафиксировал некий IP (назовем его IPB), не имеющий к нему отношения.
  3. IPB не должен иметь к A абсолютно никакого отношения:

3.1) ни географически (один город),
3.2) ни с точки зрения подключения (общая подсетка провайдера, или интернет-кафе, где свидетели видели спамера),
3.3) ни с точки зрения приятельских отношений (IPB - это IP моего хорошего знакомого),
3.4) ни с точки зрения деловых отношений (я арендовал сервер в некоей компании и поставил туда VPN для своего использования). Иначе говоря, ни официальное, ни неофициальное следствие не может простыми штатными методами найти спамера A, зная IPB.

  1. Спамер имеет возможность без проблем выбрать IPB случайно из множества вариантов, например, из публичной базы, содержащей тысячи таких IP.

Только при выполнении условий 3.1, 3.3, 3.4, 4 спамер представляет реальную опасность "убить" форум, засоряя его мусорными сообщениями. Иначе достаточно будет забанить всего несколько IP, в худшем случае, один город - это все же не смерть форума.

Только при выполнении условий 3.2, 3.3, 3.4 спамер может эффективно уклониться от уголовного или иного преследования и, таким образом, сделать автора форума "крайним" при выяснении, кто же автор крамольного сообщения.

Вы постоянно упускаете некоторые из этих условий. Единственная форма анонимизации, соответствующая всем условиям, которая мне известна - это публичные базы анонимных прокси и каталоги анонимизирующих CGI-прокси наподобие WW. С этим Анти-Анонимайзер справляется.

Вот если появятся публичные базы бесплатных VPN, разбросанных по разным странам, к которым можно подключиться без всяких проблем - тогда, действительно, ситуация изменится. Признаюсь, я не долго искал их в google, но не видел даже намеков. Поддержка и администрирование VPN недешевы - возможно, в этом все дело.

спустя 2 часа 31 минуту [обр] Александр Самойлов(5/342)[досье]
Вроде бы большинство спама сейчас рассылается не через анонимные прокси, а через так называемые зомби-сети. К тому же в движке форума, можно проверить, не является ли адрес пославшего сообщение, адресом публичного анонимного прокси просто запрашивая в автоматическом режиме сайты публикующие соответствующие списки анонимных прокси.
спустя 5 часов [обр] Даниэль Алиевский(9/125)[досье]

Александр Самойлов[досье] Можно подробнее про зомби-сети? Как-то не слышал пока.

Насчет "запрашивая сайты, публикующие списки" - думаю, все не так просто. Попробуйте написать робота, который вычислит, что программа xxxxxxx.exe является freeware, опрашивая все каталоги software от freesoft.ru и китайского hotdl.com до download.com. Я не взялся бы. Тем более, что проверять существование данного прокси надо при отправке каждого сообщения. Однажды я пытался найти через google и известные мне списки анонимных прокси некий конкретный прокси, который заведомо анонимный и заведомо использовался именно для спама (это была проверка анти-анонимайзера на реальном форуме и реальном спамере). Я не нашел. Честное слово, техника анти-анонимайзера куда проще :)

спустя 1 час 38 минут [обр] Александр Самойлов(5/342)[досье]

Зомби-сети, это сети из обычных компьютеров, зараженных каким-либо трояном, поддерживающим удаленное управление системой. Используются для рассылки спама, DDOS атак, естественно, нерадивый хозяин компьютера при этом не уведомляется.

Найти программу в каталоге сложнее, так как каталоги sofware используют сильно разный дизайн.
Хотя не удивлюсь, если они поддерживают, что-то типа RSS, тогда все упрощается.
Впрочем можно поддерживать только несколько самых больших каталогов.

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

Естественно через google непосредственно адреса анонимных прокси не ищутся, потому что каталоги анонимных прокси в этом не заинтересованы и могут не предоставлять соответствующую информацию Google, как с помощью robots.txt так и с помощью других методов.

Если же непосредственно мониторить сайты анонимных прокси то такую информацию получить вполне можно.
Тут правда вполне возможно, что анонимные прокси сначала продаются спамерам, и только через некоторое время становятся объявленными публично. А за истекшее время спамер успевает разослать свои сообщения.

спустя 10 часов [обр] Даниэль Алиевский(9/125)[досье]

Александр Самойлов[досье]

Зомби-сети, это сети из обычных компьютеров, зараженных каким-либо трояном, поддерживающим удаленное управление системой. Используются для рассылки спама, DDOS атак, естественно, нерадивый хозяин компьютера при этом не уведомляется.

Ну тогда это уже не моя область. Очевидно, с помощью вирусов и троянов, опять-таки, можно сделать все что угодно. Например, заразить весь мир вирусом, который будет с компьютера пользователя спамить на заданном форуме. Но вирусы, в отличие от анонимных прокси или VPN, являются общепризанным злом - с ними борются антивирусами, законодательством, затыканием "дыр" в операционках и т.д. К моей теме обсуждения это не относится.

А что до поиска адресов анонимных прокси по Internet... Не знаю, не убедили вы меня. Откуда, скажем, взять полный каталог таких сайтов? Как гарантировать, что мой робот найдет любой анонимный прокси раньше, чем все или хотя бы 70% всех спамеров мира? И, действительно, наверняка такие списки - предмет торговли, как, скажем, базы почтовых адресов для традиционного email-спама. По-моему, мой способ вычисления анонимного прокси несравненно проще - разве нет? К тому же, я не просто обнаруживаю, а эффективно преодолеваю анонимный прокси, вычисляя правильный адрес - о чем спамер, вероятно, не догадается.

спустя 1 час 17 минут [обр] Александр Самойлов(5/342)[досье]

С профессиональным спамером скорее всего не сладить. А вот для праздных хулиганов может вполне подойти. Хулиган-то анонимные прокси скорее всего будет искать на известных каталогах таких прокси, а таких каталогов не так уж много.

Хотя ваш метод, конечно проще с точки зрения программирования и дает хорошую гарантию.

Кстати, а ведь java машине тоже можно указывать прокси, которую она должна использовать, не будет ли это брешью?

спустя 1 час 43 минуты [обр] Даниэль Алиевский(9/125)[досье]
С профессиональным спамером скорее всего не сладить.

Поясните, все же. Каким образом он преодолеет мою защиту? Об этом, собственно, и тема.

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

Кстати, если можно, разрешите повторить мой назойливый вопрос насчет Flash :) Насколько легко поддается Flash-скрипт защите от отладки/дизассемблирования? В частности, во что он компилируется - в байт-код, как в Java, или просто исходный текст сжимается, и его можно увидеть, открыв ролик любой системой разработки? Или такой момент: абзацем выше я упомянул, что возможной защитой от дизассемблирования может служить автоматическая периодическая перегенерация class-файла на стороне сервера, со сменой алгоритма. Компилятор Sun бесплатен, его можно запустить в Unix, и я имею право его использовать таким манером. А для Flash инструмент генерации swf-файла тоже бесплатен и может автоматически запускаться под Unix? Я понимаю, что могу и сам разобраться, но на данный момент у меня даже нет никаких систем проектирования под Flash - совершенно новая для меня область. А для тех, кто им пользуется, ответ, наверно, очевиден.

Кстати, а ведь java машине тоже можно указывать прокси, которую она должна использовать, не будет ли это брешью?

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

спустя 32 минуты [обр] Александр Самойлов(5/342)[досье]

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

С флэшем положение такое же как из java, то есть ActionScript преобразуется в байт код, который может дизассемблироваться, декомпилироваться, обфусцироваться и обратно ассемблироваться. Есть и бесплатные компиляторы.

спустя 11 минут [обр] Даниэль Алиевский(9/125)[досье]
Спасибо.
спустя 1 минуту [обр] Александр Самойлов(5/342)[досье]
Посмотрел исходный код вашего апплета.
Очевидная брешь, что вы обращаетесь хоть и через сокеты, но по протоколу HTTP.
Ничто не мешает хакеру взять какой-либо socks proxy подправить ваш запрос и направить его на анонимный прокси. Придумайте какой-либо свой протокол, главное, чтобы он был не совместим с HTTP.
спустя 3 часа 5 минут [обр] Даниэль Алиевский(9/125)[досье]

Александр Самойлов[досье] Про это я уже спрашивал: Дыры безопасности в моем Анти-Анонимайзере (327371) Как можно заставить апплет работать через SOCKS Proxy?
Понятно, что мне http удобнее - не надо специального демона на сервер сажать, достаточно апача.

(Я уж испугался, что вы так сходу взломали мой .class файл. Потом вспомнил, что сам выше приводил кусок исходника :))

спустя 6 минут [обр] Александр Самойлов(5/342)[досье]
java -DsocksProxyHost=socks.localhost
То есть просто определенные системные свойства надо установить.
спустя 1 час 12 минут [обр] Даниэль Алиевский(9/125)[досье]
Александр Самойлов[досье] А можно подробнее? Установив такой параметр у Java-плагина (через Control Panel: -DsocksProxyHost=socks.localhost в Java Runtime Parameters), я, конечно же, получил ошибку ClassNotFoundException. Ибо такой хост, конечно, у меня отсутствует (java.net.UnknownHostException: socks.localhost). А если бы у меня был на localhost socks-овский прокси - это бы повлияло на работу апплета? Или только на его загрузку? Более того, если этот socks-овский прокси взят из публичных баз - что бы это дало? Типа, переменная socksProxyHost влияет на поведение класса Socket? Как? Где прочитать про это? И что даст использование другого протокола, не HTTP? Как видите, пока одни вопросы :)
спустя 30 минут [обр] Александр Самойлов(5/342)[досье]

Тут уязвимость не в том, что может существовать множество публичных socks proxy, а в том, что вы обрабатываете на стороне сервера как HTTP запрос.

Поэтому, можно даже самому написать socks proxy, установить его локально, а запросы от апплета пересылать внутри socks proxy через внешний публичный анонимный HTTP прокси.

спустя 31 минуту [обр] Даниэль Алиевский(9/125)[досье]

Александр Самойлов[досье] Кажется, начинаю понимать. Я пока не понял, как можно заставить апплет работать через мой socks-прокси. Но, в любом случае, я могу, например, установить свой VPN (или маршрутизатор). Все данные, которые посылает и получает апплет, проходят через мой VPN. Я могу, получив запрос апплета, отправить его через анонимный прокси. Посмотреть, что вернул прокси, и отдать апплету. Да, кажется, это дыра. Действительно, надо писать своего демона для сервера, к которому анонимные прокси не умеют обращаться. Вернее, пока не умеют.

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

спустя 21 минуту [обр] Александр Самойлов(5/342)[досье]

[[[Вернее, пока не умеют.]]]
Что-то я сомневаюсь, что научатся.

Со стороны нельзя, вроде. Тем более, что встроенный фаервол в Windows XP блокирует большинство входящих соединений

спустя 1 день 9 часов [обр] Сергей Чернышев(39/589)[досье]

Даниэль Алиевский[досье]
В принципе, вы защититесь от некоего набора спаммеров - тех, кто это делает "ручками" и не умело - профессоналы же, действительно живот на botnet-ах, наверное.

Что касается сервера, так я свои сервера ни разу в жизни не видел и сесть за них не смогу ;)

спустя 4 часа 45 минут [обр] Даниэль Алиевский(9/125)[досье]

Александр Самойлов[досье]
Стало быть, пошел учиться делать TCP/IP демонов :)

Сергей Чернышев[досье]
Вы все-таки смешиваете понятия. А это ни к чему - сию тему читают мои потенциальные потребители :)

Одно дело - профессионализм. Каким бы я ни был профессионалом, у меня на данный момент нет ни одной возможности - за исключением указанной Александром, за что ему премного благодарен - взломать вышеописанную защиту и анонимно опубликовать, допустим, гнусные инсинуации в ваш адрес на каком-нибудь форуме, защищенном Анти-Анонимайзером. Вы сможете приехать в мой город и вычислить меня. Либо через моего провайдера, если вам удастся его уговорить, или если вы приведете следователя. Либо через хозяев интернет-клуба, в который я регулярно хожу ради спама - это будет потруднее, но возможно. Либо через моего приятеля или офис, чьими VPN я пользуюсь. Поскольку я боюсь, что вы придете ко мне с тяжелыми предметами (или, еще хуже, с милицией), то я заниматься этим не стану :) А если даже не боюсь, то вы, по крайней мере, сможете попросить модераторов форума забанить все те несколько IP и подсеток, которыми я в силах воспользоваться. Впрочем, я повторяюсь - обо всем этом написано в моем тексте на сайте.

Другое дело - преступность. Если я достаточно хитер и не боюсь тюрьмы, и все же хочу написать про вас инсинуации, то у меня есть тривиальное решение. Не нужны никакие специальные зомби-сети. Я просто напишу вирус, который распространится по всему миру и время от времени будет давать мне удаленый доступ на зараженные компьютеры. И я буду публиковать свой спам с этих компьютеров. Правда, если кто-нибудь сумеет меня вычислить, это уже, насколько я понимаю, уголовное преступление. Минимум - мне грозит гигантский штраф. К тому же это малоэффективно - через неделю или месяц появится антивирус и будут заткнуты соответствующие дыры в OS, и моя "лафа" закончится. Зомби-сети (botnet) - это то же самое, только для более серьезных задач (вроде DDoS-атак). Для спама это слишком мощное оружие, а уголовная отвественность за него, вероятно, выше.

Ergo. Пока получается, что Анти-Анонимайзер эффективен во всех ситуациях, кроме вирусных технологий. А что касается последних (вирусы, трояны, зомби-сети, etc.), то:

  1. они заведомо уголовно наказуемы (спам же - лишь в особо тяжких случаях вроде клеветы или пропаганды фашизма);
  2. они заведомо требуют высокой квалифицации программиста (от обычного же спамера требуется лишь элементарное понимание принципов HTTP);
  3. против них и так идет непрерывная технологическая борьба - антивирусы, firewall-ы, security patchs для OS и многое другое, о чем я просто не в курсе (не моя область);
  4. сервер, содержащий форум, заведомо беззащитен даже против самого простого вируса, который даст хакеру возможность отправлять сообщения с разных компьютеров по всему миру.

Иначе говоря, Анти-Анонимайзер эффективен отнюдь не только против "непрофессионалов" (это лишь пункт 2), но также против всех, кто не хочет попасть в тюрьму (п.1), а также тех, кого не устраивает кратковременная возможность поспамить - пока против вируса не появится антивирус либо не будут заткнуты дыры в OS (п.3). Более того, никакие другие технологии не могут защищить сервер лучше Анти-Анонимайзера, то есть он в некотором роде оптимален (п.4).

Где я не прав?

спустя 1 час 51 минуту [обр] Александр Самойлов(5/342)[досье]
Даниэль Алиевский[досье]
[[[в некотором роде оптимален]]]
Добавление поддержки флэш сделало бы анти-анонимайзер еще более оптимальным.
спустя 10 минут [обр] Даниэль Алиевский(9/125)[досье]
Добавление поддержки флэш сделало бы анти-анонимайзер еще более оптимальным.
Вот уж с чем не спорю :) Вопрос времени и востребованности. Пока реальных пользователей очень мало, соответственно приоритет реализации флэш-варианта пока невысок. Будет спрос - приоритет поднимется. Работы не так мало (учитывая, что пока я с flash не знаком совершенно). Хотя бы пресловутый вопрос определения наличия flash. С Java, скажем, на поверку все оказалось очень не просто (Правильный способ определить наличие/отсутствие JVM в броузере).
спустя 2 часа 33 минуты [обр] Даниэль Алиевский(9/125)[досье]
Запустил демона на сервере, работающего не через HTTP-протокол: Корректная реализация сервера TCP - проверьте, пожалуйста
Надеюсь скоро запустить в работу. Заодно пригодится для flash-версии, раз flash не умеет работать с портами ниже 1024.
спустя 15 минут [обр] Александр Самойлов(5/342)[досье]
А что не на java написали демона?
В Перле, я не спец, но вроде бы рекомендуется обрабатывать каждый запрос в своем потоке.
спустя 11 минут [обр] Даниэль Алиевский(9/125)[досье]

А у меня на сервере не установлена java. Чем меньше лишнего ставишь, тем меньше и проблем. Да и зачем здесь java: на perl вроде столь же просто...

Да, я понимаю, что рекомендуется выделять поток на каждый запрос. И пример видел в документации, как это делается на Perl. Но, вроде бы, у меня не тот случай. Это ведь не веб-сервер, который может полсекунды генерировать страницу, а потом несколько минут отдавать ее клиенту. У меня единственная операция - передача около 15 байтов клиенту через сокет. По-моему, на это времени вообще не требуется. Вернее, требуется меньше, чем на порождение подпроцесса. К тому же число запросов в моем случае не предполагается чудовищным - вряд ли больше 10-20 тысяч в сутки.

спустя 4 минуты [обр] Даниэль Алиевский(9/125)[досье]
Буду ждать дальнейшей критики. Вряд ли даже таланлтивые хакеры найдут дыры, не замеченные уважаемыми коллегами :)
спустя 33 минуты [обр] Александр Самойлов(5/342)[досье]
В принципе, публичный Socks прокси найти не особо сложно.
По крайней мере Google нечто такое находит, другое дело, что похоже их на пару порядков меньше, чем http прокси, впрочем далеко не все из этих тысяч http прокси - анонимные, так что соотношение может быть и поменьше.
спустя 58 минут [обр] Даниэль Алиевский(9/125)[досье]

Александр Самойлов[досье] Что ж мы по кругу ходим? Я ведь уже формулировал этот вопрос. Пусть дан публичный Socks proxy, как спамер может им воспользоваться? Как заставить апплет в броузере использовать его? Да еще с моим нестандартным протоколом, использующим порт с совершенно "левым", никому не известным номером?

Публичный VPN решил бы задачу хакера, но публичный прокси, даже socks - каким образом?

Кстати, Александр, спасибо за идею сменить протокол. Я сразу не сообразил, но этим ведь закрывается еще одна принципиальная дыра, пусть даже не особо "широкая". А именно - теперь можно спокойно переложить шифрование IP на плечи серверного демона и не бояться, что код апплета дизассемблируют. Раньше, зная код апплета, достаточно было чуть подправить его, заменив HTTP-обращение через Socket высокоуровневым HTTP-обращением через URL.openStream(). Такое обращение, конечно, воспользовалось бы настроенными в броузере (или Java-плагине) прокси. Сейчас же, когда протокол мой собственный, он не имеет отношения ни к каким настройкам прокси в броузере или Java-плагине. URL.openStream() просто "не доберется" до моего серверного демона. Соответственно, если шифрование IP перенести на сервер, то изучение или правка апплета становятся бесполезны. Хакер никак не сможет узнать, что нужно записать в кукис, чтобы Анти-Анонимайзер его пропустил с фальшивым IP.

Я прав?

спустя 10 минут [обр] Александр Самойлов(5/342)[досье]
Если есть публичный Socks прокси, то его можно использовать и как обычный HTTP прокси, он просто передает данные которые ему посылают и этому прокси не важно, что это HTTP протокол или ваш собственный протокол. Таким образом достаточно будет настроить java машину использовать в качестве socksProxy этот публичный прокси и настроить браузер, чтобы он использовал в качестве HTTP прокси этот socks прокси.
спустя 29 минут [обр] Даниэль Алиевский(9/125)[досье]

Александр Самойлов[досье] Я настраивал в качестве socks proxy имеющийся "под рукой" прокси (который не socks) - и в Java-плагине, и в броузере. Никакого эффекта. (А по идее вообще не должно было соединиться.) Более того, какое апплету дело до настроек HTTP-прокси в броузере, когда создается класс Socket?

Может быть, вопросы глупые - не хватает квалификации.

Можете подсказать какой-нибудь работающий публичный socks proxy, пусть не анонимный? Я бы проверил.

спустя 10 минут [обр] Даниэль Алиевский(9/125)[досье]
Так-то публичных socks-ов, вроде бы, пруд пруди...
http://www.samair.ru/proxy/socks8.htm
спустя 8 минут [обр] Даниэль Алиевский(9/125)[досье]
Увы, вы похоже правы. Анти-Анонимайзер показывает адрес socks-прокси. Нда :(
спустя 22 минуты [обр] Александр Самойлов(5/342)[досье]
Более того, какое апплету дело до настроек HTTP-прокси в броузере, когда создается класс Socket?
Я имел ввиду, что браузеру для анонимного доступа можно указать тот же прокси, что и для апплета. И удаленный IP адрес и через апплет и через браузер будет один и тот же.
спустя 3 часа 6 минут [обр] Даниэль Алиевский(9/125)[досье]

В общем, все достаточно печально. Задача, выходит, пока не решена - эта дыра настолько велика, что все прочее не имеет значения.

Нашел на странице http://www.samair.ru/proxy/socks8.htm один из работающих socks-прокси, конкретно 81.232.171.113:8080 (шведский). Выставил его в MSIE, обычный HTTP-прокси указывать не стал. Тест
http://webwarper.net/ww/~av/algart.net/system/antianonymizetest.pl
показал в апплете именно его. Более того, применение новой техники - работа через собственный протокол - не помогает. Все равно в качестве "обратного адреса" определяется адрес socks proxy.

Что ж, тогда придется думать дальше. Хотя бы: как определить факт использования socks proxy? Сервер связаться с апплетом в обратную сторону не может. Какую информацию может передать апплет серверу напрямую, которая заведомо будет потеряна при прохождении через прокси? Мне пока приходит в голову только анализ временных характеристик. Если апплет связан с сервером напрямую, то, теоретически, передавая серверу отдельные байты с некоторыми (немаленькими) паузами, можно с достаточно высокой вероятностью опознать рисунок этих пауз в принимающем сервере. И понятно, что почти любой прокси этот рисунок безнадежно исказит. А может быть, просто выполнить последовательную серию запросов? Прокси, по идее, может спутать последовательность запросов, чего при прямом соединении быть не может. (Или может?)

Может быть, есть другие мысли? Ситуация, конечно, печальна - под угрозой сама идея анти-анонимайзера :) А затея-то хорошая.

спустя 1 час 54 минуты [обр] Александр Самойлов(5/342)[досье]
Может датаграммы слать? Вроде socks4 с ними работать не умеет.
К тому же пишут, что например ping и tracert вообше не могут работать через socks, хотя сокеты используют.
спустя 3 часа 21 минуту [обр] Сергей Чернышев(39/589)[досье]
Александр Самойлов[досье]
А Java апплеты разьве умеют это? мне казалось, что они ниже как TCP не могут.
спустя 1 час 7 минут [обр] Александр Самойлов(5/342)[досье]
Сергей Чернышев[досье]
В смысле ограничение по безопасности? Вроде что-то подобное есть в msjvm, а в sun работает.
спустя 3 часа 35 минут [обр] Даниэль Алиевский(9/125)[досье]

Так, спасибо, можно с этого места чуть подробнее? Хоть намеки, где копать.
К тому же, Александр, если socks4 не умеет, то как насчет socks5? Где вы все это читали :)

И еще такой (глупый) вопрос. Я явно недостаточно понимаю принципы использования socks-прокси, сейчас буду изучать. Пока что не могу понять, откуда Java-апплет - нечто внешнее по отношению к броузеру - узнает, что нужно использовать socks-прокси, и как он это делает? А если я сам напишу некий ActiveX для броузера, внутри ActiveX начну создавать сокеты стандартным API - будут эти сокеты работать через socks-прокси броузера? (Это ведь тоже выход - собственный ActiveX. Он-то заведомо будет миниатюрным.) Соответственно, использует ли Flash socks-прокси, когда я создаю в нем сокет?

спустя 51 минуту [обр] Даниэль Алиевский(9/125)[досье]

Впрочем, материалов навалом. Хотя бы: http://www.computerra.ru/softerra/technologizm/18566/print.html
Уже вижу ответ на все свои вопросы. К сожалению. Все проблемы спамера решаются SOCKSификатором. Как бы я не "развлекался" (Java, Flash, ActiveX, датаграммы - они в socks5 уже поддерживаются), если я запущу броузер через SOCKSификатор, то все пойдет через заданный SOCKSпрокси.

Остаются, вроде бы, такие пути. Первый - каким-то образом "достучаться" до броузера с сервера, пользуясь IP-адресом компьютера клиента. Вряд ли FireWall-ы это пропустят. Второй - требовать скачать независимую маленькую EXE-утилитку, которая выяснит IP пользователя и сообщит его броузеру. Третий - уже упоминавшийся анализ временных характеристик. Впрочем, в этом плане socks-прокси, теоретически, не отличается от любого маршрутизатора, стоящего на пути между клиентом и сервером. Так что вряд ли можно считать, что искажения времен передачи в результате использования socks-прокси чем-то радикально отличаются от искажений при "прямом" соединении.

спустя 33 минуты [обр] Даниэль Алиевский(9/125)[досье]

Впрочем, опять же, утилитку никто не помешает запустить через SOCKSификатор. Но ведь в утилите я, вероятно, имею все возможности помешать запуску через SOCKSификатор. Есть у кого-нибудь идеи, как это сделать?

Так-то идея хорошая. Попросить посетителя форума, перед отправкой сообщения, скачать и запустить утилиту на 30-50 KB, за безопасность которой (в плане вирусов и троянов) автор форума и автор webwarper.net ручаются - не так уж плохо. Утилита откроет окно броузера с параметром - зашифрованным IP, тот запишет его в кукисы - и работай на здоровье. Это вам не Java или даже Flash качать.

спустя 4 часа 27 минут [обр] Даниэль Алиевский(9/125)[досье]
Более того, один мой клиент уже одобрил идею внешней утилиты. По крайней мере, это лучше, чем скачивать Java :)
спустя 23 часа [обр] Даниэль Алиевский(9/125)[досье]
Предлагаю закрыть эту тему в связи с ее разрастанием :)
В продолжение, я создал новую тему: Анти-Анонимайзер в виде утилиты - может быть, поможете?
Powered by POEM™ Engine Copyright © 2002-2005