Доступно об АйТи: Тот секретный ингредиент, который испортил сайты на Node.JS
На Пикабу возник огромный спор, насколько (без)опасны открытые библиотеки, если их производитель может в любой момент стать враждебным. Мой ответ — могут быть опасны при определённых условиях, основное из них — разработчик бездумно обновляет библиотеку, не делая ревизии.
Библиотека подпрограмм — несамостоятельный набор кусочков программного кода, предназначенный, чтобы их вызывали из других программ. Например, это может быть компонент визуального оформления, или библиотека для доступа к сети, обработки текстов, компьютерной математики…
Но открытый исходный код лучше, чем закрытые библиотеки в виде DLL, те опасны изначально.
Но на Node.JS, распространившейся в серверном вебе системе, есть нечто, сильно упрощающее жизнь одиночке-разработчику, но и позволившее эту атаку.
Пакетный менеджер.
Пакетный менеджер — программа, отслеживающая взаимосвязи между компонентами ПО, и централизованно устанавливающая, удаляющая и обновляющая их.
Это значит: программа делится на независимо разрабатываемые пакеты, и для каждого указано, какие пакеты ему нужны для работы. Например, в NPM, тот самом менеджере для Node.JS:
Первыми пакетный менеджер стали использовать сборщики дистрибутивов Linux. Потом — языки Python и JavaScript. И только в 2011 подтянулся менеджер Chocolatey для Windows.
Пакетный менеджер никак не проверяет свои пакеты на вредность. И если версия 1.0.0 проверена как безвредная, где гарантия, что 1.0.1 не получит бэкдор? Вот в этом была проблема: вышло вредоносное обновление, и пакетные менеджеры в разных концах мира обновились до него.
Бэкдор — «чёрный ход», секретная функциональность, позволяющая пробраться в систему постороннему.
Другие известные мне пакетные конфузы
2016: NPM left-pad
Азер Кочулу, американский программист турецкого происхождения, имел несколько пакетов на NPM. Один из этих пакетов звался kik. И вот однажды высоколобые канадцы из Kik Messenger просят его переименовать пакет — он отказался, сославшись, что пишет открытый пакет с таким именем. Они ответили настолько эпично, что разрешите уж процитировать письмо.
Мы не хотим быть кондомами насчёт него [пакета], но это зарегистрированный товарный знак в большинстве стран мира, и если вы выпустите проект по имени Kik, наши юристы по товарным знакам будут долбить в вашу дверь, стирать ваши аккаунты и всё прочее — и у нас нет выбора, ведь мы должны или насаждать товарный знак, или терять его. Можем ли мы прийти к какому-то компромиссу, не привлекая юристов?
Азер разозлился, назвал авторов письма «корпоративными кондомами», и потребовал целых 30 тысяч долларов. Владельцы NPM вручную передали Kik контроль над пакетом, и тогда Азер со злости удалил все свои проекты — в том числе тривиальный left-pad, дополнявший строку до длины N. Это парализовало Babel (транслятор JavaScript, выдававший код, совместимый со старыми версиями интерпретаторов) и React (крупную фронтэнд-библиотеку, то есть выполняющуюся на браузере).
Пакет восстановили.
2020: комбинирование внутренних и общих пакетов
Если ваш пакет внутренний и вы не хотите его никому показывать, в дополнение ко всеобщему хранилищу можно использовать дополнительное.
И тут хакер, подписывавшийся как Alex Birsan, выяснил такое: если каким-то образом пронюхать имя внутреннего пакета, что-то вроде «auth-paypal», и создать одноимённый общедоступный, можно запустить его в глубинных сетях PayPal, Apple и Tesla. Выдавать внутренние имена — это не единичная ошибка, очень многие фирмы делали это. Хакер получил за это по программе охоты на баги минимум 60 тысяч.
Есть борьба?
Иногда. Допустим, тот же NPM позволяет зафиксировать версию конкретного пакета на 1.0.0, указывать его контрольную сумму. Это позволяет загружать только те пакеты, что прошли ревизию.
А что же на Android?
На Android программы более монолитны, и за библиотеками должен смотреть сам разработчик. Не будет того, что программа запустится в не предусмотренной разработчиком конфигурации.
Правда, есть две оговорки — иногда программа для Android представляет собой браузер, показывающий один сайт. Такая прога уязвима настолько же, как и любой другой сайт.
Кроме того, у любой сетевой программы есть серверная сторона, но она обычно устроена значительно проще, чем у сайта с фронтэндом и бэкэндом.
А можно встроить бэкдор так, чтобы он прошёл ревизию?
Можно, но это целая шпионская история, о которой когда-нибудь напишу — если смогу описать её захватывающе. Кто разбирается в компьютерах, гуглите «Бэкдор в XZ».
А вот другая уязвимость, Heartbleed — по-видимому, её когда-то упомянули в документах Сноудена, но это простая ошибка. Просто замеченная государственными хакерами раньше, чем независимыми.