Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Разработчики уделяют большое внимание дизайну программных продуктов для гаджетов, стараясь сделать их максимально удобными. Люди охотно устанавливают мобильные приложения и регистрируются в них. А что насчет безопасности данных, которые мы доверяем производителям этих приложений? И как научить(ся) создавать безопасные приложения?
На PHDays наши коллеги из «Яндекса» — Анна Максимова и Алексей Мещеряков —поделились своим опытом в обучении разработчиков и показали участникам систему, позволяющую тренироваться в поиске и исправлении уязвимостей. Каждое задание в этой системе состоит из кода, содержащего уязвимости. Задача разработчика — найти заложенную проблему и исправить ее.
Рассказ получился, как говорится, о наболевшем: из зала так и сыпались вопросы, и коллег не отпускали минут двадцать. Сегодня мы решили поделиться их докладом в нашем блоге. Итак, передаем слово ребятам.
Не хотите читать? У нас отличная новость: можно послушать подкаст-версию этой статьи. Выбирайте удобную вам платформу — и вперед!
Кстати, у нас есть целый подкаст, где мы говорим о практической безопасности, современных киберугрозах и защите от них, а также делимся самыми интересными выступлениями с форумов PHDays. Уже доступны 19 выпусков. Советуем подписаться, чтобы не пропустить новые эпизоды :)
О важности безопасной разработки
Если неподготовленный разработчик пишет код, то это выглядит примерно так:
Через какое-то время такого разработчика настигают они — БАГИ.
А следом к нему прибегает злобный безопасник и просит устранить какие-то уязвимости.
Основная идея обучения безопасной разработке в том, что любую уязвимость кто-то все равно когда-нибудь найдет, и код в итоге придется переписывать. Чтобы этого избежать, разработчиков необходимо научить писать хорошие коды (сразу!).
Знакомьтесь, это Аркадий
Аркадий — новый сотрудник «Яндекса». Сейчас он хорошо умеет «вертеть деревья», но пока плохо понимает разницу между XSS и CSRF. Как можно помочь Аркадию лучше разобраться в аспектах информационной безопасности?
В теории обучения есть модель с пятью уровнями усвоения информации. Вот они: понимание, узнавание, воспроизведение, применение и творчество. Мы проведем Аркадия по всем этим этапам, и в конце пути он научится самостоятельно строить системы, которые будут не только высоконагруженными, но и безопасными.
Уровень 0. Понимание
На данном этапе у Аркадия еще отсутствуют какие-либо знания и навыки по безопасности, но уже формируется понимание того, что они ему необходимы. В это же время он получает приветственное письмо от нашей службы ИБ, которое сообщает, что отныне он будет жить в безопасном мире «Яндекса». Аркадия просят пройти ряд курсов по безопасной разработке приложений — под эту активность создается специальная задача, напоминания по которой, если что-то еще оказалось не пройденным, приходят каждую неделю.
Уровень 1. Узнавание
На этой ступени Аркадий начинает получать теоретические знания о том, что такое безопасность, что это за ребята из службы ИБ и чем они занимаются. Здесь нам помогают плакаты, которые, с одной стороны, напоминают нашим сотрудникам, что безопасность вообще существует (и даже если они ее не видят — она все равно есть), а с другой, являются своеобразным пиаром внутреннего подразделения ИБ.
Многие наши сотрудники все еще продолжают работать удаленно и нечасто посещают офис, поэтому плакаты в кофепойнтах — уже не такой эффективный инструмент донесения информации, как раньше. Сейчас мы в основном информируем коллег в нашем внутреннем блоге по ИБ — там публикуются посты об интересных уязвимостях, киберугрозах, которые могут затронуть «Яндекс», и другие полезные материалы.
А поговорить?
Еще мы проводим тренинги, на которых стараемся создать живую дискуссию между разработчиками и безопасниками. На этих тренингах мы сосредотачиваемся не на абстрактных уязвимостях, а на тех проблемах ИБ, которые непосредственно волнуют наши команды. Вместе мы разбираемся, почему у них возникают те или иные проблемы, как атакующие могут проэксплуатировать конкретную уязвимость и какой ущерб это может нанести компании. И конечно, на этих встречах ибэшники помогают командам эти проблемы устранить.
Тренинги — инструмент хороший, но, к сожалению, не масштабируемый. Команда по безопасности у нас не очень большая, в то время как сервисов и команд разработки в компании очень много. Кроме того, в «Яндекс» постоянно приходят новые разработчики. Чтобы охватить всех, мы выпускаем руководства по разработке безопасных приложений для всех участников процесса: тестировщиков, сисадминов, менеджеров и других специалистов. Мы хотим, чтобы наши разработчики не изобретали велосипеды, а переиспользовали готовые и правильные решения, поэтому в процессе создания руководств отталкиваемся не столько от уязвимостей, сколько от лучших практик разработки. У нас есть руководства по ИБ для веба, Android, iOS, компилируемых приложений, умных устройств.
И это еще не всё
Только плакатами, блогом по ИБ, тренингами и руководствами мы не ограничиваемся. Вспомним о курсах по разработке безопасных приложений, которые необходимо пройти Аркадию. Сначала мы предполагали, что сделаем один общий курс для абстрактного разработчика, который подойдет всем. На практике оказалось, что лучше сделать несколько индивидуальных курсов: для разработчиков приложений для Android; для разработчиков приложений для iOS; для тех, кто разрабатывает приложения на C++; отдельный курс для облака и общий курс для веб-разработчиков, который основан на OWASP Top 10 и тех уязвимостях, которые чаще всего нам попадаются на SEC-аудитах.
Для визуализации материалов из курсов мы приглашаем художников, которые рисуют картинки, комиксы, а иногда даже создают мультфильмы. Вот как мы проиллюстрировали одну из уязвимостей race condition.
Тема безопасной разработки достаточно сложная, но тем не менее художникам удалось найти персонажа, с которым можно проассоциировать этот процесс. Узнали? Это доктор Эмметт Браун из фильма «Назад в будущее». Если помните, у героев этой картины тоже были проблемы с доступом к объектам в разных потоках.
Уровень 2. Воспроизведение
На этом уровне Аркадий может закрепить полученные знания на практике с помощью решения типовых задач. Раньше у нас не было специальной утилиты, которая позволяла бы сотрудникам потренироваться в исправлении уязвимостей. Хотя на рынке есть множество подобных систем, в том числе опенсорсные инструменты, мы все же решили разработать собственную систему. К тому же мы хотели, чтобы решение удовлетворяло следующие наши требования:
1. Практика в поиске и исправлении уязвимостей.
2. Автоматизация проверки решения.
3. Добавление кастомных заданий.
Так мы и создали Security Gym. Его интерфейс состоит из трех частей: теоретической, онлайн-редактора, где надо исправлять код программы с уязвимостями, и кнопки check.
Вот как работает проверка решения, когда наш Аркадий нажимает кнопку сheck:
Как разработать задания, актуальные для использующихся в компании технологий
Здесь есть несколько этапов. Давайте их рассмотрим.
1. Готовим код с уязвимостями. Чтобы добавить собственное задание в Security Gym, необходимо сначала найти общий код с проблемами. Мы в «Яндексе» идеи для заданий не выдумываем специально, а просто смотрим на заведенные тикеты, на то, что нам присылают в Bug Bounty и что мы находим в своих аудитах. Оттуда отбираем паттерны, которые могут быть интересны большей части сотрудников, и на их основе готовим коды с уязвимостями. Ниже пример одного из наших кодов.
Как вы думаете, есть ли здесь ошибка? И если есть, то где?
Все верно. В четвертой строке, когда мы считаем накопленную сумму, можно выйти за границу uint32.
2. Пишем функциональные тесты.
3. Пишем security-тесты. Надо проверить, действительно ли уязвимость исправлена правильно. Здесь есть интересный нюанс: для большинства уязвимостей написать такие тесты несложно, особенно если мы хотим дать разработчику возможность исправить ошибку разными способами. В нашем случае необходимо проверить, что корзина не переполняется.
4. Проверяем ожидаемое решение. На этом этапе лучше самостоятельно решить задание и проверить корректность работы тестов.
Итак, как это исправить?
Пример решения
Следует проверить, во-первых, не переполняет ли произведение корзину и, во-вторых, не переполняет ли накопленная в basketPrice сумма uint.
5. Готовим Docker-образ, в котором можно запустить тесты.
6. Пишем теорию и описание задания в Markdown.
Сейчас в Security Gym загружены задачи по таким языкам программирования, как Go, JavaScript, Java и Python, а также по 10 типам уязвимостей. Еще есть API, который показывает статистику прохождения заданий. Основываясь на этих данных, мы награждаем наших лучших сотрудников виртуальными медальками. Когда Аркадий правильно решит все задания по одному из языков, он тоже получит медаль, чтобы все коллеги знали, какой он молодец :).
Уровень 3. Применение
Потренировавшись в Security Gym, Аркадий может принять участие в корпоративном CTF, который ежегодно собирает сотни сотрудников.
Уровень 4. Творчество
На этом этапе Аркадий переходит к творчеству — к использованию полученных навыков и знаний для написания надежного кода и разработки безопасных сервисов.
Как вам опыт «Яндекса»? Попробуете тренироваться в исправлении уязвимостей в Security Gym? Какие инструменты для безопасного написания кода и тестирования приложений используете вы? Делитесь своим мнением в комментариях!
Больше полезной информации о практических приемах OSINT, трендах и прогнозах кибербеза, самых впечатляющих расследованиях, сложностях в обнаружении вредоносного поведения, о том, как найти злоумышленников, вычистить APT-группировку из инфраструктуры и многом другом — в нашем подкасте HACK ME, если сможешь. Слушайте когда и где удобно.