Статьи

Ruby Devs — Вы слишком доверчивы. Драгоценные камни могут напортачить.

Вы встречали разработчиков всех драгоценных камней, которые вы используете? Знаете ли вы их личную позицию в отношении безопасности и используют ли они надежные пароли или повторно используют имя своего питомца на каждом сайте?

Исполнители: Я разворачиваю

Исполнители: Я разворачиваю

Я не знаю, являюсь ли я единственным, но когда появятся обновления для моих Gems, я, как правило, с удовольствием обновлю их — проведу свои тесты — и буду на моем веселом пути. Я поднимаю свой меч и кричу «Развернись!» для многих моих подчиненных (ну, я набираю несколько команд и развертываю — но это звучит совсем не так впечатляюще).

Примечание : если вы человек, который внимательно просматривает каждое изменение кода в каждом обновленном вами геме и все их зависимости, то эта статья не для вас… ублюдок .

Мы слишком доверяем?

Я беспокоюсь, что процесс обновления Gems недостаточно прозрачен, особенно для новых разработчиков. Я беспокоюсь о том, что мы доверяем системе, которая имеет один главный недостаток: безопасность отдельных разработчиков Gem. Я беспокоюсь о том, что кто-то получит доступ к учетной записи разработчика и отправит злонамеренное изменение в один из драгоценных камней, которые я использую. И, самое главное, я беспокоюсь о том, что я невольно буду использовать этот драгоценный камень и облажаться .

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

Доказательство концепции

Чтобы доказать эту концепцию, я создал новый Gem под названием innocent . Он просто имеет метод Something::Innocent#perform_action который принимает строку, а затем возвращает ее … обычно. Это прекрасно работает в версии 2.0, но кто-то получил доступ к моему ноутбуку; или мой репозиторий GitHub; или держит мою подругу в заложниках и требует, чтобы я отдал свои личные ключи; и выдвинул версию 3.0, которая также вызывает метод Something::Evil#do_evil .

Если вы проверите код ниже, вы увидите, что все, что он делает, читает ваш database.yml, а затем вызывает его как исключение. Но все, что вам нужно сделать, это написать по электронной почте, и у вас есть серьезная проблема под рукой — и вы даже не знаете об этом.

Это, очевидно, предполагает, что вы используете здесь стек Rails, но было бы так же просто найти общие файлы конфигурации и отправить их.

Вот что- Something::Innocent на работе, оскверненный чем- Something::Evil .

 module Something class Innocent def self.perform_action(string) Something::Evil.do_evil string end end class Evil def self.do_evil file = File.open("./config/database.yml", "r") raise file.read.inspect # I could just as easily email this information # Or I could browse directories for API Keys # Or I could email your wife and tell her about the other girl end end end - module Something class Innocent def self.perform_action(string) Something::Evil.do_evil string end end class Evil def self.do_evil file = File.open("./config/database.yml", "r") raise file.read.inspect # I could just as easily email this information # Or I could browse directories for API Keys # Or I could email your wife and tell her about the other girl end end end 

Если вы хотите проверить его, пример проекта, использующего невинный самоцвет, доступен по адресу https://github.com/snikch/innocent-project , а сам невинный самоцвет — по адресу https://github.com/snikch/innocent. ,

Commit d3cff993b62e05d7e1cc — точка «до».
Фиксация ba1db02e4405b4fc614b происходит после обновления пакета.

Не плачь меня

Я знаю, что именно мы должны проверять код, который мы используем в наших проектах, и, конечно, ответственность в конечном итоге лежит на нас самих. Я не пытаюсь это отрицать, но я говорю о том, что мы люди и легко совершаем ошибки, экономя время вместо того, чтобы тратить время на некоторые аспекты нашей работы. Тратить часы на обновление кода каждую неделю / месяц / десятилетие — это не то, на что мы хотим или должны потратить наше время.

Мой рабочий процесс — шаг в правильном направлении

Рабочий процесс, который мы приняли на Learnable , не связан с необходимостью решения этой проблемы, а связан со снижением рисков. Мы больше не включаем git Gems, которых нет в нашем репозитории. Это означает, что для обновления Gem нам нужно объединить ветвь владельцев с мастер-веткой нашего собственного форка. Когда мы сделаем это, мы увидим изменения, которые вносятся, и у нас есть шанс обнаружить любой забавный бизнес.

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

Это утомительный шаг? Да
Это делает наш код безопаснее? Может быть
Буду ли я счастлив, если это спасет нас от нападения в какой-то момент? Да, черт возьми .
Стоит ли оно того? Я не уверен

Я хотел бы услышать от людей об этом, с любыми идеями, которые они имеют отношение к снижению этого риска.

Люди не заметят?

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

Gem с несколькими сотнями или тысячами пользователей, которые часто совершают коммиты, но имеют только одного основного участника, будет более вероятным кандидатом, особенно если это всего лишь маленький Gem, который действительно только на периферии вашего проекта.

Кто хочет написать код для обзора Gem, который обеспечивает немного более быстрый анализ csv для того отчета администратора, который хотел ваш маркетолог? Или, более уместно, кто хочет взглянуть на Gem, который был зависимым от разбора CSV Gem, который нужен маркетологу!

Так…

Мы слишком доверяем? Я так думаю
Можем ли мы что-нибудь с этим сделать? Вы говорите мне .

Шутки в сторону. Я хочу узнать мнение людей по этому поводу, поэтому, пожалуйста, внесите свой вклад в комментарии .

Post Script.

Я потратил немного времени на размышления об этом один день, и написал электронное письмо своим коллегам, а затем решил, что это не проблема. Уже на следующий день вектор атаки, о котором я размышлял, произошел с некоторыми популярными плагинами WordPress .

Post Post Script.

Если кто-нибудь упомянет о подписи кода, я пну их в голени.