Всем привет. Я решил ещё раз поднять тему Flash Player в контексте его использования на Codeforces для взломов.
Эту тему уже поднимали неоднократно, давно и не очень. Все ответы администрации сводились к двум утверждениям: что Flash работает и что систему, основанную на Flash, трудно обойти. Оба эти утверждения ‒ ложь.
В последнее время я несколько раз пытался смотреть код других участников во время контеста, и у меня не разу не получилось. Каждый раз показывалось что-то такое. При этом я использовал последнюю версию Flash. При этом процесс plugin-container
, в котором работает Flash, падал с необработанным исключением (SIGSEGV). Это то, что может произойти, если, например, решение задачи на C++ выходит за границы массива. Видимо, Flash Player по качеству кода недалеко ушёл от таких решений.
При таком качестве кода не удивительно, что у Flash плохо с безопасностью. MikeMirzayanov, конечно, скажет, что уязвимости есть не только в Flash. Но если в Chrome или Firefox найдут уязвимость, которая будет активно эксплуатироваться, то Google и Mozilla выпустят обновление как можно быстрее, а Adobe (как и Microsoft) будут ждать до следующего планируемого выпуска патчей (патчи выпускаются во второй вторник каждого месяца). Кроме того, использование Flash добавляет все его уязвимости к тем, что уже есть в браузере (это одна из причин, по которой браузеры отказываются от поддержки вообще всех плагинов, а не только Flash).
В общем, как я уже написал, Flash небезопасен. Flash не работает ‒ по крайней мере, под Linux. Из-за лицензионных ограничений, Flash под Linux нельзя скачать из репозитория, нужно качать и ставить обновления вручную (но это не важно, так как он всё равно не работает). Можно, конечно, специально для взломов использовать виртуальную машину с Windows (там Flash работает), но это неудобно. Я считаю, что необходимость в подобных действиях для полноценного участия в контестах ‒ свинство со стороны администрации.
Даже когда Flash работает, основанный на нём интерфейс для чтения кода, мягко говоря, оставляет желать лучшего. Код приходится читать в окошке посередине экрана, набранный корявым шрифтом, а прокрутка ‒ это вообще извращённый садизм. Да чтоб тот, кто это поделие придумал, до конца жизни писал код только через такой же интерфейс!
И наконец: MikeMirzayanov почему-то считает, что новички для того, чтобы нарушить правила, с лёгкостью установят Firebug, но при этом не додумаются установить декомпилятор для Flash. Так вот: декомпиляторы для Flash существуют, их легко найти, и первый же найденный декомпилятор легко декомпилирует Flash-файлы с Codeforces. И я удивлюсь, если ещё никто ни разу не копировал чужой код через функцию взлома. Впрочем, если это и так, то это скорей говорит о честности участников.
Теперь к главному. Я изучил, как работают Flash-файлы с Codeforces и, в частности, как они расшифровывают решения. Я собираюсь выложить эту информацию, чтобы показать, что «защита» на основе Flash не имеет преимуществ перед «защитой» на основе Javascript, и таким образом подтолкнуть администрацию к тому, чтобы отказаться от Flash. Также я сделал расширение для Chrome и Firefox, которое позволяет читать код без Flash. Его я тоже собираюсь выложить. Так или иначе, я избавлю себя и других участников от необходимости держать Flash ради Codeforces. Других сайтов, где без Flash что-то не работает, я не встречал уже давно.
UPD Продолжение: Почему Codeforces не нужен Flash.
К слову, лично у меня при взломах Flash глючит даже на Windows (холст с кодом "убегает" вверх от окна, в котором он должен находиться + плохо скроллится). Это не значит, что я на 100% поддерживаю радикальный подход автора, но что-то с этим делать определенно надо.
Можно добавить еще то, что Adobe отказывается от поддержки Flash.
eatmore, вот честно твой тон и основной посыл меня разочаровали. Неконструктивное и невзрослое поведение. ИМХО, при наличии желания помочь быстрее внедрить замену ты мог бы: написать пост или обсудить в личной переписке возможные пути реализации замены, сделать свой прототип на JS или других технологиях (вот ilyakor писал что это не сложно, сделал, но получилось не очень).
Я не ожидал настолько наивной уверенности, что мы не работаем по замене Flash-у. Конечно, его дни сочтены и осталось ему не долго. Работа по замене давно ведется и заходится на завершающей стадии, тестируем. А вот торопить нас такими неэтичными способами кажется неуважительным.
Проблема Flash возникла далеко не вчера ‒ я привёл ссылку на пост, где это обсуждалось 5 лет назад. Лично я о проблемах Flash тоже несколько раз писал. С тех пор Flash работать лучше не стал, и никаких подвижек со стороны Codeforces тоже не было.
Что касается замены, то у меня есть расширение, позволяющее работать с нынешней системой без Flash. Для меня это именно замена ‒ теми средствами, которые есть у меня. Почему то, что замену делает кто-то другой, вызывает столько негодования?
На протяжении лет Flash был хорошим решением для нашей задачи. Браузеры и операционные системы стали его активно дропать не так давно. Не знаю про текущее положение дел, но, например, самый популярный браузер Chrome (и очень кроссплатформенный) долгое время имел свою встроенную реализацию (pepper), которая работала из коробки, просто поставив браузер.
Последние годы экосистема javascript активно развилась и переписывать что-то сейчас правильнее и своевременней (и учитывая наши ресурсы) чем 3-5 лет назад.
Что же касается распространения информации по тому как ломать систему, угрозы публикации инструмента — это точно некрасиво и за гранью диалога приличных людей.
Раньше Flash было разумно использовать для решения задач, для которых в браузерах не было необходимых функций, например, воспроизведение и запись аудио и видео. Но Flash всегда был проприетарным и небезопасным, а интерфейс Codeforces на Flash — неудобным. Для того, чтобы показать пользователю код, Flash не был нужен никогда.
Публикацию метода «взлома» (не очень правильное название, так как в результате пользователь не получает доступ к информации, которого у него изначально не было) имело бы смысл отложить, если бы эту систему можно было бы исправить. Но эту систему невозможно исправить: нельзя сделать так, чтобы пользователь мог видеть код, но не мог с помощью соответствующих средств достать его в виде текста. Единственный вариант — никогда никому не рассказывать, что система на самом деле дырявая, но это не конструктивно — рано или поздно кто-то другой всё равно обнаружит это.
В такой ситуации нет смысла ставить вопрос того, можно ли «взломать» систему: и так понятно, что можно; это можно понять, даже не зная, как она устроена. Насколько трудно: в текущем виде — легко, хотя и не тривиально. Если знать, куда идти, то легче, хотя направление «попробовать декомпилировать Flash» мне и так кажется одним из самых очевидных. Но я это всё делаю не для «взлома», а для того, чтобы решить проблему с Flash. Решения от администрации я, увы, не дождался.
При чём здесь угрозы? Во-первых, обсуждения о проблемах Flash действительно начались на кф примерно тогда же, когда на кф появился я (not related). Во-вторых, сказать "Вы заколебали, я не могу пользоваться функциональностью на равне со всеми. Поэтому я сделал для себя инструмент (который заодно доказывает, что применение Flash не позволяет защитить исходный код). Однако этот инструмент ставит меня в привилегированное положение, поэтому через какое-то время я выложу его в открытый доступ." — это абсолютно нормально. Кф дали понять, что текущую систему взломали, и дают время, чтобы это исправить.
"Что же касается распространения информации по тому как ломать систему, угрозы публикации инструмента — это точно некрасиво и за гранью диалога приличных людей."
А что может быть приличного, если в течение 5 лет проблема, о которой все знают, и которая уже поддостала (мягко говоря, без мата, так скажем), никак не решается? Думаю тот формат, в котором была представлена эта проблема в очередной раз, ещё очень даже вежливый и учтивый.
А Евгений писал Вам в последнее время в личку насчет того, что у него из-за всей этой темы уже люто пригорает? Если нет, то мое к нему предложение — умерить пыл и выложить плагины для браузеров в обфусцированном виде (это и принесет пользу сообществу, и, наверное, не сильно поможет всяким script kiddies — если они, конечно, не вставляют код в plaintext-е внутрь веб-страницы). Если же писал, но ответа не получил, то я его агрессивную позицию прекрасно понимаю — сами знаете.
Я не писал в личку, я писал открыто. Ответа не получил.
Вот это он реально мог не прочитать... :(
А как же уведомления об упоминаниях?
Ну, тогда текущая тема будет очередным напоминанием о важности коммуникации с сообществом...
У меня их довольно много, я не слежу за всеми упоминаниями, сорри.
Конечно, я не читаю прям все комментарии и этот не помню (конкретно на комментарии Евгения обычно обращаю внимание, он почти всегда дело говорит). Ничего никак выкладывать не надо, это не принесет пользы. Дайте нам спокойно работать, скоро всё будет. Мы в приличном темпе двигаемся вперед по всем вопросам и нормально реагируем на запросы сообщества. Пожалуйста, не берите на себя право устанавливать правила и диктовать требования. Не надо так.
А как мы можем это право взять на себя? Даже если с ресурса уйдут все "сливки" вроде всех медалистов ACM ICPC, то он навряд ли потонет — пипл все равно продолжит хавать (хотя объяснять причину этого спонсорам вроде Дурова таки придётся).
Честно говоря, пользователи с активной позицией на самом деле не настолько злые и инфантильные, какими Вы их представляете. Просто им важно чувствовать связь с Вами и понимать, что Вы их по крайней мере слышите. Возможно, было бы неплохо, чтобы для этого было какое-то отдельное пространство, потому что понятно, что Вам в личку флудят все, кому не лень, а кто-то даже задают неприличные вопросы про постельную жизнь или просто хамят. Упоминают Вас комментариях тоже все подряд. На фоне всего этого легко пропустить некоторые действительно важные вещи.
Личку, как показывает практика, тоже
Соглашусь с Евгением, flash работает отстойно. Даже на Windows. Даже с последней версией. У меня стабильно окно просмотра кода уезжает вверх в браузере Chrome и код читать неудобно (не говоря уже о том, что окно для кода и правда маловато, и часто громоздкие шаблоны кода участников превращаются в многостроковое безобразие), а последнее время при загруженной системе, когда пользователей больше среднего, так скажем, так и вообще через раз только код открывается на просмотр. Надо что-то менять, неудобно пользоваться этим.
Раз такой дело, давайте поднимем ещё один нужный больной вопрос.
Когда https будет?
Кажется, скоро совсем не будет работать без https
Кстати, а напомните, в чем смысл этого ограничения, что взламываемый код нельзя копировать? Я вижу только одно объяснение — так было на Топкодере, откуда CF почерпнул многие идеи. А если подумать, то ведь смысл хаков в том, чтобы найти ошибку в коде — для этого все средства хороши. Да, если код можно будет копировать, то количество неудачных хаков значительно уменьшится, но казалось бы что в этом страшного? Зато взломы будут эффективнее, а финальные тесты станут сильнее (если исходить из предположения, что все удачные хаки добавляются в финальные тесты, и некоторые потенциально удачные хаки при текущей системе не используются из-за возможности неудачного взлома).
а) На кодефорсес сейчас достаточно сильная подготовка тестов (вне educational rounds, где копирование кода как раз разрешено), сомневаюсь, что тут реально много смысла говорить об усилении финальных тестов в рамках 2-ух часового контеста, сейчас на 2013. Хаки вроде нужны больше как дополнительный заработок баллов, и уже во вторую очередь лишняя страховка. Т.е. эта страховка то нужна, но и в текущей системе её вполне хватает.
б) При текущей системе ты поощряешь человека за умение понимать чужой код и находить в нём ошибки или понимать, что решение имеет идейную проблему — это всё уместно в рамках соревнования по спортивному программированию. В твоей системе ты поощряешь человека за умение вслепую скопировать код и потестить на каком-то наборе тестов, на котором потенциальное решение может падать — в чём смысл?
в) Куча проблем с распределением баллов. Например, любой дурак сможет написать скрипт для тестирования всех решений в комнате тестами (или хотя бы тестирование одного решения всем набором тестов). Если в задаче есть простой хак (например, int -> long long, крайний случай, большой тест и т.д.), первый, кто это заметит, получает какое-то нечестное преимущество.
г) Ты намного больше мотивируешь людей отвлекаться от решения задач и заниматься какой-то не особо полезной деятельностью.
банальный пример: я пишу контест с линукса, хочу взломать код ярого кодера на вижаке, он у меня не компилится, я в проигрышном положении.
Ещё можно что-то зловредное вписать, на КФ наверняка песочницы, а вот новички могут не глядя запустить и попасть..
На КФ всегда можно написать что-то в духе:
Это реально достаточно странно, если учитывать, что можно(я знаю людей, которые этим реально пользуются) написать прогу, которая будет сама парсить этот некопирующийся текст в обычный, так что польза от того, что копировать нельзя не очевидна вне очных соревнований типа VK cup или Технокубка, это только поощряет жестких хацкеров
Мне кажется проблема копирования в том, что люди в твоей комнате могут скопировать твое решение и случайно заслать. В итоге могут задисквалить обоих. Если же человек парсит осознано, он будет более аккуратен, да и не все умеют такое писать.
Чтобы читать чужие решения, нужно сначала заблокировать своё.
Но ведь для взломов надо заблокировать задачу и посылки по ней больше делать нельзя.
Можно заслать с фейка
"случайно", ага.
Можно специально заслать с фейка
Какова вероятность, что вы с фейком окажетесь в одной комнате?
Не, с фэйка заслать правильное решение, скопировать решение кого-нибудь из своей комнаты, а потом заслать это со своего акка
Вот будет веселуха, если решение, засланное с фейка, пройдет систесты, а скопированное решение упадет.
Ну в таком случае можно и переписать, это не так уж сложно. И проблема, которую я пытаюсь донести как раз заключается в том, что "да и не все умеют такое писать". Кто-то не умеет, да, а кто-то умеет. Дизбаланс так-то, да и нарушение правил, которое отловить нельзя
Сама система взломов уже вносит сильный дизбаланс, когда авторы контестов специально не добавляют всякие случаи в претесты. На таких раундах кто первый придумал этот случай, получает по 10-15 взломов на одном и том же тесте, что сравнимо с дополнительной задачей С div1 и ставит этого человека в неравные условия с остальными. Но сейчас нужно еще аккуратно просмотреть решение человека и подумать, упадет ли оно на этом случае, что даст хоть какое-то время другим участникам из комнаты тоже взломать что-то. А если разрешить копировать — то можно не думая ни о чем просто запустить решения всех людей в комнате и моментально получить +15.
На счет людей, которые умеют и парсят посылки на контсетах. Как уже было сказано, если кто-то захочет получить код — он его получит независимо от системы защиты. Тут правильней было бы спросить "зачем?". Раунды на кф пишутся в основном для удовольствия, а в чем радость быть сверху таблицы, но знать, что на самом деле это место было получено нечестным путем — непонятно. Разрешать копировать всем чтобы выровнять дизбаланс тут звучит нелогично. Можно привести аналогию, что раз государство не может полностью избавиться от воров, у которых есть отмычки, то нужно обязать всех оставлять дверь открытой, чтобы все имели равный шанс попасть в чужую квартиру. Это только спровоцирует еще большее нарушение правил.
Хорошо, соглашусь
На самом деле, например, даже если генерировать изображения с кодом, это проблему никак не решит, потому что сейчас есть полно софта для распознавания текста и при желании что-то несложное, что будет заточено в основном под кф, можно реализовать и самому. И, скорее всего, количество усилий, которое потратится на создание утилиты для вытаскивания кода из флеша или чего-то аналогичного на JS, будет не сильно меньше количества усилий для написания простенькой распознавалки текста с картинки, так что проблема запрета копирования текста по сути не решаема как-то принципиально лучше, чем это сделано сейчас, просто за счет того, что перевод чего-то видимого и хорошо читаемого в текст это несложная проблема.
Может просто убрать взломы из див 1 контестов? Я не вижу особой ценности в них для опытных участников. Див 1 довольно маленький, поэтому проблемы делать претесты чуть сильнее с точки зрения нагрузки на кф нету. Плюсов два: 1) это уберет рандом с тем, что у кого-то нашли багу и взломали и он смог перепослать, а у кого-то не нашли 2) избавит от необходимости бороться с хакерами, которые достают код (никакая система защиты никогда с ними не справится)
А что тогда будет делать Гена в последние полчаса контеста? :)
А если серьезно, то это довольно хорошый способ дифференциации учасников, которые набрали близкие бали на задачах. Думаю, умение читать и понимать чужой код для div1 не менее важно, чем для div2.
Обычно когда есть что ломать, то до последнего получаса оно не доживает. Насчет чужого кода — я и так после контестов его читаю, как и многие из div1 думаю.
Это скорее дифференцирует участников по тому, оказались ли у них в комнате чуваки, которые слали много неверных решений, и не поломал ли их кто раньше. Когда возможность набора баллов (причём достаточно лёгких, так как часто, если в контесте участники набирают много взломов, эти взломы в целом ловят одинаковые или почти одинаковые баги) зависит от рандома — это не очень хорошо.
С этой точки зрения система с открытой фазой взломов после раунда, на мой взгляд, куда лучше.