Ну ладно, не 1000 и 1 способ, но их довольно много! О чем это мы? О том, что пандемия COVID-19 внесла много изменений в нашу жизнь, в том числе, и в образование — как школьное, так и ВУЗовское. Уроки, лекции и семинары перешли в онлайн-формат, а вопрос, как быть с контролем успеваемости, остался. Как преподавателям убедиться, что сдающий экзамен студент не открыл в соседней вкладке шпаргалки?

В России эту проблему решили с помощью open-source программы Safe Exam Browser (SEB). Казалось бы, теперь ни один искатель халявы не сможет смухлевать, но так ли уж неприступна эта «крепость»? Заходи под кат, сегодня мы расскажем и покажем кучу способов обмануть SEB!

Шёл 2020-й год… Весь мир в панике, курс рубля падает, государства переходят в режим ЧС… Несмотря на все это, основное желание среднестатистического студента остается прежним — сдать сессию с наименьшими затратами сил и времени на подготовку. Казалось бы, с переходом на дистанционное обучение для студента все стало проще — нужно всего лишь сделать умное лицо при ответе на вопрос по веб-камере, а прочитать материал можно и с параллельно открытого документа на компьютере. Но не тут-то было!

Многие российские ВУЗы для проверки успеваемости студентов внедрили программу Safe Exam Browser, которая предотвращает практически все попытки читерства. Конечно, для находчивых студентов и это не препятствие — ведь можно гуглить ответы на тест и на втором компьютере (или попросить погуглить друга).

Но, поскольку мы в душе тру хацкеры, мы решили проверить, насколько этот SEB действительно помогает при проведении экзаменов и как все же программно обойти его чуткий контроль (при условии, что студент обладает базовыми навыками работы на компьютере, не впадает в ужас от слов «виртуальная машина» и знает, как установить плагин для браузера Mozilla Firefox). Готовы? Поехали!

Что такое Safe Exam Browser (SEB)?


Safe Exam Browser (SEB) — программа для проведения экзаменов, тестов и т.д. в режиме онлайн. Предусматривает защиту от:

  • открытия посторонних приложений (видео- и голосовой связи);
  • параллельного поиска информации в веб-браузере;
  • запуска приложения на виртуальной машине;
  • перехода на определенные сайты;
  • сохранения информации в буфере обмена перед входом в программу.

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


Конфигуратор SEB представляет собой приложение с интуитивно понятным интерфейсом:


В нем можно задать URL-адрес экзаменационного ресурса, список разрешенных/запрещенных приложений и сайтов, разрешения на загрузку файлов из Интернет, работу в виртуальной машине и т.д.

Большой простор для творчества и фантазии, не так ли?) Что же, приступим.

Для тестирования нам потребуется: программа SEB, виртуальная машина (VmWare, VirtualBox), браузер Mozilla Firefox, что-нибудь для компиляции большого проекта на C# (автор использовал Visual Studio Code), какой-нибудь образовательный ресурс (например, тест на Moodle, настроенный только для работы с SEB).

Дисклеймер: при написании статьи автору очень помогла эта статья.

1. Смена user-agent браузера


Для реализации этого способа не потребуется практически никаких знаний и инструментов. Проверим, как реагирует тест на Moodle на запуск через обыкновенный веб-браузер:


Как видно из скриншота, SEB не позволяет получить доступ к тесту из обычного браузера.
Согласно документации, в качестве веб-браузера SEB использует XULRunner — движок Gecko браузера Mozilla. Попробуем подменить user-agent браузера Mozilla на user-agent, указанный в конфигураторе SEB:

Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0 SEB

Установим какой-нибудь плагин для подмены user-agent, например, User-Agent Switcher, и добавим к нему следующий вариант:



Ловкость рук и немного мошенничества — и теперь можно спокойно приступать к тесту, параллельно открыв гугл в соседней вкладке! :)



2. Изменение конфигурационного файла виртуальной машины


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

Сначала мы решили посмотреть, можно ли включить SEB на виртуальной машине. Здесь, к сожалению, нас постигла неудача — в таких условиях SEB даже не позволяет себя запустить. Но как-то же он понимает, что используется виртуальная машина!

Было опасение, что SEB использует не очень приятные для студента способы вроде обнаружения процессов и сервисов виртуальной машины (ВМ) в системе, но при изучении исходного кода было выяснено, что проверка на запуск из ВМ происходит в функции IsInsideVM() файла SEBWindowsClientMain.cs:

private static bool IsInsideVM()
        {
            using (var searcher = new ManagementObjectSearcher("Select * from Win32_ComputerSystem"))
            {
                using (var items = searcher.Get())
                {
                    foreach (var item in items)
                    {
                        Logger.AddInformation("Win32_ComputerSystem Manufacturer: " + item["Manufacturer"].ToString() + ", Model: " + item["Model"].ToString(), null, null);

                        string manufacturer = item["Manufacturer"].ToString().ToLower();
                        string model = item["Model"].ToString().ToLower();
                        if ((manufacturer == "microsoft corporation" && !model.Contains("surface"))
                            || manufacturer.Contains("vmware")
                            || manufacturer.Contains("parallels software") 
                            || manufacturer.Contains("xen")
                            || model.Contains("xen"))
                            || model.Contains("virtualbox"))
                        {
                            return true;
                        }
                    }
                }
            }
            return false;
        }

Видим, что SEB способен определить виртуальные машины производителей, которые перечислены в коде! А что, если мы изменим конфиг виртуальной машины, подменив, тем самым, производителя?

Сказано — сделано! Открываем конфигурационный файл VmWare и добавляем следующую строку:



Теперь manufacturer model виртуальной машины станет таким же, как и у основной машины. Запускаем виртуальную машину, на ней включаем SEB и пытаемся получить доступ к тесту — все работает!

3. Компиляция новых версий SEB


А теперь переходим к самому интересному — компиляции «своей» версии SEB! Исходный код доступен здесь. Самое интересное, что конфигурационный файл SEB не отслеживает целостность десктопного приложения (либо отслеживает так, что мы смогли без проблем поменять большую часть кода, хи-хи), тогда как целостность конфигурационного файла, присланного экзаменатором, проверяется строже некуда.

3.1 Запуск в виртуальной машине


Подмену производителя мы уже сделали в пункте 2, но как было бы круто создать версию SEB, которая запускается в любой виртуальной машине, верно? К тому же, сделать это более чем легко (если не считать танцев с бубном при попытках скомпилировать проект в первый раз — а все из-за несходства платформ .NET).

Итак, нужно всего лишь в приведенном выше коде закомментировать строчку с нужной ВМ:



В данном случае мы скомпилировали программу таким образом, чтобы она вообще не реагировала на запуск в виртуальной машине VirtualBox. Но есть одно важное замечание: если наши читатели решат воспользоваться данным способом, то необходимо убрать/изменить логгирование событий! Виртуальная машина запустится без проблем, но в логах обязательно отразится запуск через VirtualBox.

3.2 Очистка буфера обмена


Когда SEB включается, он автоматически очищает буфер обмена. Таким образом, все, что скопировал студент до запуска SEB, в SEB не попадет. Что же, вызов принят!

Здесь можно пойти двумя путями:

  1. Покопаться в файле SEBClipboard.cs, убрать логгирование ошибок или немного изменить алгоритм очистки буфера обмена.
  2. Закомментировать строку в файле SEBWindowsClientMain.cs:

    
                 // Clean clipboard
                //SEBClipboard.CleanClipboard();
                Logger.AddInformation("Clipboard cleaned.", null, null);


    При этом лучше оставить последующее логгирование — чтобы проверяющий не понял, что с собой в SEB вы захватили То-Что-Нельзя-Использовать-На-Экзамене :)

Воспользовавшись любым из этих способов, можно получить желанный результат:



Таким образом, с собой в SEB можно «пронести» любой текст, картинку — словом, шпаргалку, которую можно поместить в буфер обмена.

3.3 Помощь друга или убираем запрет на Discord


SEB похож на очень капризную женщину — при включенном Skype, Discord и т.д. он не включится, а поставит тебя перед выбором: или я, или они.

Что ж, постараемся снизить градус напряжения в такой ситуации.

Здесь есть простор для полёта фантазии, но, в целом, достаточно закомментировать подходящие по смыслу строки вроде «processToClose.Kill();» в файле SEBNotAllowedProcessController.cs.
Также советуем рассмотреть строки «SetForegroundWindow(windowHandle);», «BringWindowToTop(windowHandle);» и работу службы WatchDog. Грамотное выстраивание логики приложения и логгирования — ключ к успеху!

И мы тем временем получили запущенный Discord при работающем SEB:



Что еще могут попробовать энтузиасты?


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

Также можно попробовать запустить SEB на других ОС (невероятно, но факт: очевидцы утверждают, что стандартный ВУЗовский конфиг для SEB на OS X даже голосовую связь по Discord остановить не может!).

Итак, способов собрать SEB с урезанным функционалом — великое множество, тут все упирается только в воображение креативных и трудолюбивых студентов!

Закончим статью народной мудростью: остановить студента в поиске халявы может только еще большая халява!