Ученикам École 42 в процессе обучения необходимо сдавать экзамен. С учётом того, что в школе существует ачивка за "хацкерство", появилось желание найти способ схитрить. Под катом история небольшой шалости с использованием особенностей HFS+.
Дано
Школа представляет из себя несколько кластеров iMac, за которыми работают студенты. Работа начинается с логина в учетную запись и заканчивается выходом из неё. На время экзамена один из кластеров закрывается, "происходит магия", и по своему логину и паролю на время экзамена студент входит в экзаменационную учетную запись. В ней ограничен доступ в интернет, практически отсутствуют какие либо доступы. Намерение школы - дать студенту на время экзамена консольную команду, которая даёт задачи и проверяет ответы. Ответами являются исходные коды программ на Си и Баше. Не ограничены в явном виде только права на создание и редактирование текстовых файлов.
Найти
Шпаргалка должна содержать ответы на ~100 задачек по ~30-100 строк. С учётом объёма и пристального внимания наблюдателей, пронести такой трактат в руках/ногах/трусах тяжело. Да и такие способы морально устарели (хотя были попытки от отдельных студентов). Лично мной двигало желание найти способ технического обхода ограничений для последующей автоматизации процесса.
Решение
Заметим, что в школе уделено много внимания устройству *nix, системному программированию. Автор позволил себе предположить, что максимально возможный спектр способов защиты был предпринят. Конечно же, после продолжительных поисков "традиционных" способов. Однако перед тем как сдаться промелькнула мысль "но это же Apple!". Наверняка можно использовать одну из особенностей платформы, которая даже не рассматривалась школой как угроза. Зачем рыть подкоп, если есть дыра в заборе?
Вспомнилась история, как один ученик обнаружил, что экзаменационная учетная запись имеет доступ на чтение к папкам и файлам других пользователей. Нехитрым движением, до экзамена сохранялись ответы в "нормальной" учётке, а на экзамене читались и отправлялись. Конечно же, школа узнала про такой способ и ограничила его.
То есть над сетевой безопасностью они поработали более чем хорошо, а на локальном уровне смогли пропустить такое? Спасибо, куда смотреть стало ясно.
Говоря о локальном хранилище и платформенных особенностях на ум сразу приходит HFS+. Для справки, это файловая система Apple. После пары часов курения документации и вики нашлось кое-что интересное!
Из википедии HFS+ (ссылка):
With Mac OS X 10.4, Apple added support for Inline Attribute Data records, something that had been a part of the Mac OS X implementation of HFS Plus since at least 10.0, but always marked as "reserved for future use".[9] Until the release of Mac OS X Server 10.4, HFS Plus supported only the standard UNIX file system permissions; however, 10.4 introduced support for access control list–based file security, which provides a richer mechanism to define file permissions and is also designed to be fully compatible with the file permission models on other platforms such as Microsoft Windows XP and Windows Server 2003.
В отличие от расширенных атрибутов POSIX, расширенные атрибуты в HFS+ защищены не через разрешения файлов, а через "список управления доступом". А защищено ли хоть что-то в школе через этот список? Нет. Команда записи атрибута на корневую папку сработала с первого раза на экзаменационной учётке, не предъявив никаких претензий:
xattr -w my_attribute attribute_value /
Считаем атрибут:
xattr -p my_attribute /
# attribute_value
То есть мы можем повесить произвольную строку в атрибуты и считать её на экзамене! Опять же, автор не мог себе позволить пользоваться столь варварским способом, как копипаста. Было принято решение написать программу maraudersmap (по аналогии с произведениями Джоан Роулинг). Её суть - считать номер задания из консоли и отправить решение на проверку.
![](https://habrastorage.org/getpro/habr/upload_files/f1b/544/839/f1b5448390de482da6e401146828152f.png)
Получив бинарный файл maraudersmap, хочется положить его в атрибуты. На всякий случай при передаче конвертируем в формат дампа через xxd. xattr как раз имеет флаг -x для принятия такого формата:
xattr -wx "maraudersmap" "$(xxd -p maraudersmap)" /
Ответ
На экзамен приходим и уверенно вводим:
xattr -p "maraudersmap" / >> maraudersmap
chmod +x maraudersmap
./maraudersmap
![](https://habrastorage.org/getpro/habr/upload_files/745/935/545/745935545ee677e1196358445c9dd09e.png)
Как из этих команд составить односточник, который не создаст физического файла, автор так и не догадался. Варианты ответов в комментариях приветствуются.
P.S. Реальная версия maraudersmap для интереса требует пароль и громко играет дабстеп если он введён неверно. Посмотреть можно тут.