Как избавиться от домашки с помощью кода… и спалиться

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

image


В 2020 году наша школа пользовалась для онлайн-обучения несколькими платформами. Профессора и учителя давали домашние задания с её помощью. А я, ленивый разраб, очень хотел проводить больше времени за играми и программированием, особенно когда все сидели по домам из-за локдауна. Я начал писать этот пост в январе 2022 года, но долго откладывал публикацию. С тех пор прошло много времени, так что, пожалуйста, откиньтесь в кресле и наслаждайтесь — к старту курса SkillFactory «Белый хакер».


Предыстория


Распишу всё по порядку. В 2018 году в моей школе ввели новую онлайн-платформу для учеников. Она называется HegartyMaths и умеет многое. Всё было устроено довольно просто: учителя выбирали тему домашнего задания, после чего мы получали обучающее или информационное видео по теме на 10–15 минут, которое должны были конспектировать во время просмотра, и короткий тест после видео. Это куча работы, особенно тест. При плохом раскладе выполнение одной темы может отнять до часа. Так себе перспектива.


Большинство разработчиков ПО — личности довольно ленивые. Мы заставляем «железо» делать всё за нас. И разрабу, который ещё учится в школе, делать домашку, естественно, нелегко. В том же 2018 году мы с моим хорошим другом Скоттом Хаеттом решили дать отпор этой Hegarty. Мы стали декомпилировать фронтэнд-приложение, пока, наконец, не добили пользовательский скрипт на Tampermonkey, от которого встроенный YouTube-плеер глючил и говорил, что видео уже просмотрено, как минимум, 1 раз. Важно было, чтобы наши учителя видели, сколько раз мы посмотрели видео. Поэтому пропустить до 20 минут домашнего задания было очень важно — да и просто классно.


Мы флексили всё это в истории на Snapchat, а друзья писали нам, мол, давайте дальше в том же духе. Наконец, мы поняли, что можно было сделать видео просмотренным хоть 9999 раз. Но каждый раз, когда мы делали так, ребята из Hegarty сбрасывали наши учётки в 0.


Первое письмо


После этого в ноябре 2018 года мы обратились к математичке, чтобы она сообщила HegartyMaths о нашей маленькой лазейке. Ответ пришёл быстро. У меня не осталось оригинала того письма, но я чётко помню, что там среди прочего говорилось что-то вроде «Прекратите ломать нашу платформу и займитесь домашними заданиями». Пока я это писал, мне удалось найти удалённое письмо на фотографии. Мы сделали её в 2020 году. По понятным причинам детали замазаны. Вот фото:


Письмо от Hegarty о манипуляциях со временем


«Благодарим вас за сообщение. Мы в HegartyMaths очень серьёзно относимся к вопросам безопасности и расследуем любые сообщения о возможном использовании уязвимостей. Мы были бы удивлены, если бы он смог получить доступ к любым нашим закрытым данным или к сайту. Пока мы заняты проблемами, которые он выявил, ему лучше сосредоточить своё внимание на заданиях по математике, а не на взламывании нашего сайта.


По вопросам безопасности мы регулярно берём консультации у уважаемой фирмы и устраняем любые пробелы в безопасности своей платформы. Мы осведомлены о манипуляции с видео и временем просмотра и разрабатываем соответствующую защиту. Однако данная хакерская программа не опасна и не передаёт пользователю всей информации. Мы сбросим время просмотра всех видео в аккаунте данного пользователя.


Пожалуйста, сообщите нам, если у Вас есть какие-либо другие опасения».


Такой ответ нас слегка взволновал. Ведь теперь они знали, что мы возимся с их сайтом, и не собирались исправлять мелкую ошибку. Поэтому мы продолжали её использовать. Мы пытались создать скрипт, который отвечал бы на вопросы, но тогда эта задача была нам не по зубам (сложные структуры данных, странные ответы API и т. д. и т. п.).


Educake


Ученики получили доступ и к платформе, Educake, подобной HegartyMaths, но заточенной под биологию, химию и физику. Там не надо было смотреть видео в начале. Мы пользовались ей несколько лет; на самом деле, с тех пор, как я пошёл в эту школу, но до начала описанных здесь событий я и не думал заниматься реверсом.


Общей чертой Hegarty и Educake было то, что обе платформы показывают правильный ответ, если вы дали неправильный. На этом мы и решили сыграть. И написали небольшое приложение с базой данных на Node/Mongo и скрипт на Tampermonkey. Наш код определял посещение пользователем страницы с тестом, отвечал на каждый вопрос рандомно и записывал правильный ответ в MongoDB. У меня не осталось исходного кода, но скрипт на TamperMonkey, возможно, выглядел как-то так:


const guess = Math.random ();

const result = await post ('/api/answer', {
body: {
answer: guess,
},
});

await post ('http://localhost:8080/save', {
body: {
question_id: question.id,
answer: result.success? guess: result.correct_answer,
},
});

// Go to next question and repeat code above
nextQuestion ();

const guess = Math.random ();

const result = await post ('/api/answer', {
body: {
answer: guess,
},
});

await post ('http://localhost:8080/save', {
body: {
question_id: question.id,
answer: result.success? guess: result.correct_answer,
},
});

// Go to next question and repeat code above
nextQuestion ();

Как видите, каждый вопрос проходил цикл, правильный ответ сохранялся, и мы двигались дальше. Я добавил ещё несколько фич для поиска в базе данных, когда у нас уже были правильные ответы (мы не всегда давали ответ Math.random), а ещё добавил выбор нескольких ответов (мы именно выбирали один из возможных ответов, а не создавали его. Я удивился, что бекенд Educake допускает ответы даже не в числе возможных вариантов).


Когда я работал над проектом в одиночку, я решил, что пора уже сделать интерфейс поприятнее и привязать его к простенькому скрипту Tampermonkey. Мы сделали его, чтобы флексить права на Snapchat: люди меня всё время об этом просили; конечно, это раздувало моё эго. Я же такого раньше не делал. Это было и для себя, чтобы скинуть с плеч домашку, которую так не хотелось делать.


Результат? Кодовая база — где-то 200 строк. Мы собрали все вопросы и ответы с сайта, чтобы набрать 100% за любое индивидуальное задание. База данных Mongo занимала 15 МБ.


Вот небольшое видео. Там показана и фича, которая давала пользователям возможность набирать «целевой процент» правильных ответов менее 100%, чтобы результат выглядел реалистично и «более-менее по-человечески». Видео записал на Snapchat в ноябре 2019 года.


Hegarty 2


Успех скрипта и давление сверстников заставили меня вернуться к работе над Hegarty. Я связался с другом из сети, которого ради приватности буду называть Джейком. В его школе тоже использовали HegartyMaths, и мы были в одной лодке. Он тоже не хотел делать домашнюю работу. Вместе мы разобрались с ответами на многие вопросы в разных вариантах, в том числе с выбором нескольких ответов. Ответы вылились в огромный объём данных для хранения. С пользовательских аккаунтов, отданных «на убой», мы смогли ответить на 60000 вопросов за пару минут и вырвались в лидеры всемирного топа HegartyMaths.


Отдельное спасибо Буну за его аккаунт и возможность проанализировать его статистику.

Мы с Джейком слили всю базу данных Hegarty, и теперь у нас был JSON-файл, который, надо полагать, стоил столько же, сколько вся компания Hegarty, ведь это была вся их база данных. Имея этот файл, я решил сделать ещё один шаг вперед и дать друзьям и другим людям использовать его без прямой передачи базы данных (ведь такая передача безответственна…) Так был придуман Mochip.


Mochip


Как в этой истории появился Mochip? Mochip был расширением для Chrome. Это расширение содержало все слитые с Hegarty и Educake базы данных, скрытые за API TypeScript и небольшим приложения React. На бесплатных уровнях Heroku и MongoDB Atlas пользователи могли войти в систему, ввести вопрос (с любого из сайтов) и получить список ответов Mochip на этот вопрос. Вот как выглядела страница целиком:


Скриншот главной страницы дашборда Mochip


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


Приложение для Chrome мы написали под Educake: копирование текста вопроса в буфер обмена блокировалось. Эту функцию мы разблокировали простым нажатием на кнопку в пользовательском интерфейсе. На Chrome Web Store нашего расширения больше нет, но в его зеркалах ещё видно объявления, удалить которые мы не можем: extpose.com/ext/195388.


База пользователей выросла настолько, что пришлось подключать сервер Discord. Появилось даже упоминание в Urban dictionary — до сих пор интересно, кто это сделал!


Наконец, мы провели «ребрендинг»: я хотел отделить своё имя от проекта. К сожалению, у меня нет скриншотов той эпохи, и показать нечего. Я создал учётку alt Discord и несколько анонсов вроде «…права собственности были переданы…», однако уже через несколько недель после этого нас ждал неизбежный разгром.


Крушение надежд


Всё хорошее когда-нибудь кончается. Так вышло и с Mochip после того, как Скотт залил пост о нём на свой аккаунт в Reddit. Как любой хороший гендиректор, Колин Хегарти постоянно гуглит свою компанию, чтобы знать, что о ней говорят, что творится вокруг. Вот он и наткнулся на тот пост. Он зарегистрировался (хотя и с чужой почты) и потестил приложение. Он был в шоке, когда увидел, что оно работает. Вскоре после этого я получил от Колина личное сообщение. Вот оно:


«Приветствую, Алистер.


Это мистер Хегарти из HegartyMaths — надеюсь, у вас всё хорошо.
Недавно наткнулся на пост на Reddit и нашёл онлайн-приложение и расширение к Chrome, которое сделали вы с друзьями для ввода ID вопроса на HegartyMaths и получения мгновенного ответа. Я приложил несколько ссылок.


Прежде всего хотел бы сказать, что впечатлён вашими талантами и умениями — ума вам и вашим друзьям не занимать! Я настроил HegartyMaths, чтобы дети учились и добивались многого в жизни. И видеть, что кто-то развил талант и интеллект насколько, всегда приятно. На самом деле, мой ведущий разработчик — ещё мальчик, его зовут Дэн. Когда я был учителем, я учил его математике. Как и вы, с юных лет он в свободное время программировал. В 16 лет я принял его на работу, и он написал для меня HegartyMaths. Он проработал здесь уже довольно долго, и теперь руководит группой разработчиков в должности ведущего инженера. Я всегда с уважением отношусь к таланту молодых программистов и стремлюсь поощрять его.


Я был бы очень рад возможности побеседовать с вами о созданном вами приложении. Могли бы мы с вами организовать встречу в Google Meet или где-нибудь ещё на этой рабочей неделе?


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


Дайте мне знать, когда вам будет удобно».


С наилучшими пожеланиями и надеждой на скорую встречу,


Колин Хегарти | Основатель HegartyMaths | Финалист из десятки лучших во всемирном конкурсе Global Teacher Prize 2016 | Учитель года в Великобритании в 2015 году | colin@hegartymaths.com | www.hegartymaths.com | @hegartymaths | LinkedIn

Письмо от Коллина


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


Скриншот из Google Meet



Я хотел бы отдельно поблагодарить легендарного Колина Хегарти за доброту и внимание, с которыми он ко мне отнёсся. Будь он другим человеком, для меня всё кончилось бы гораздо хуже. HegartyMaths — великолепный обучающий ресурс. И он гораздо больше помогает ученикам, чем создаёт им неудобства.


Чуть позже Колин связался и с группой Educake, с которой мы также назначили встречу. Мы полностью объяснили им свой метод и предложили способы избежать подобного в будущем. Самое простое решение с нашей точки зрения — слегка ограничить скорость в Redis. Это сделало бы автоматизацию теста невыполнимой. Ещё мы предложили скремблировать [прим. перев. — шифровать путём перестановки и инвертирования участков спектра или групп символов] ID в базе данных, чтобы, насколько возможно, вывести из строя наш клон базы данных (у нас были только ID Hegarty, поэтому мы больше не могли выполнить обратный поиск вопроса).


Здравствуйте, Колин,

Было здорово поговорить с вами, узнать больше о вашей группе и т. п. Подтверждаю, что всё деактивировано, включая API (api.mochip.xyz) и основной сайт (mochip.xyz), а также расширение для Chrome и пост в Reddit.

Просто хотел бы повторить, что мы, разумеется, никогда не ставили себе конечную цель вынуждать вас выходить с нами на контакт и деактивировать сайт. Искренне прошу прощения за то, что так случилось. Был очень рад пообщаться. К следующей неделе подготовлю несколько штук, которые должны понравиться Дэну.

Хороших выходных и примите мои поздравления по поводу слияния со Sparx и (конец фразы закрыт)»

Всего наилучшего,

Алистер

Мой ответ Колину


Спасибо, что прочли этот пост, серьёзно, спасибо. Делать Mochip было реально классно, это было нашей страстью.


Добавлено 23 сентября 2022 г.:

Когда я поделился этим постом на HackerNews, к моему удивлению, он за несколько часов стал там первым, так что сайт получил ощутимый траффик. Мой пост принёс почти 1,5 Тб контента примерно за 6 часов. Некоторые сотрудники Sparx (материнской компании HegartyMaths) увидели это и отправили письмо Колину. Несколько минут назад я получил очень, очень милое письмо от мистера Хегарти с темой «Поздравляю вас!». Я очень благодарен за доброту и внимание, которые Колин проявил к нам со Скоттом. Если вы работаете учителем, пожалуйста, используйте HegartyMaths для своих учеников!


Алистер Смит


А мы научим вас работать с безопасностью информационных систем, чтобы вы прокачали карьеру или стали востребованным IT-специалистом:


  • Профессия «Белый хакер»
  • Профессия Data Analyst (12 месяцев)

Чтобы посмотреть все курсы, кликните по баннеру:



Краткий каталог курсов

Data Science и Machine Learning


  • Профессия Data Scientist
  • Профессия Data Analyst
  • Курс «Математика для Data Science»
  • Курс «Математика и Machine Learning для Data Science»
  • Курс по Data Engineering
  • Курс «Machine Learning и Deep Learning»
  • Курс по Machine Learning

Python, веб-разработка


  • Профессия Fullstack-разработчик на Python
  • Курс «Python для веб-разработки»
  • Профессия Frontend-разработчик
  • Профессия Веб-разработчик

Мобильная разработка


  • Профессия iOS-разработчик
  • Профессия Android-разработчик

Java и C#


  • Профессия Java-разработчик
  • Профессия QA-инженер на JAVA
  • Профессия C#-разработчик
  • Профессия Разработчик игр на Unity

От основ — в глубину


  • Курс «Алгоритмы и структуры данных»
  • Профессия C++ разработчик
  • Профессия «Белый хакер»

А также


  • Курс по DevOps
  • Все курсы
Источник: https://habr.com/ru/company/skillfactory/blog/693328/


Интересные статьи

Интересные статьи

Один из современных способов хранения большущего объема данных для платформ обработки и анализа данных - это распределение каждого датасета между несколькими узлами в кластере. Если мы используем обла...
Molecule — это фреймворк, предназначенный для тестирования ролей в Ansible. На хабре довольно много статей про тестирование с помощью molecule и почти во всех статьях гов...
Liquibase — это инструмент управления изменениями в базе данных. С его помощью вы можете отслеживать изменения в базе данных, сделанные с помощью SQL (или XML) скриптов. ...
GraphQL это современный язык запросов для получения данных с сервера. Существует большое количество документации по построению API для целого вороха платформ, но к сожале...
Как читать эту статью: прошу прощения за то, что текст получился таким длинным и хаотичным. Чтобы сэкономить ваше время, я каждую главу начинаю со вступления «Чему я научился», в котором одним-...