Доступно об АйТи: Тот секретный ингредиент, который испортил сайты на 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 — по-видимому, её когда-то упомянули в документах Сноудена, но это простая ошибка. Просто замеченная государственными хакерами раньше, чем независимыми.
«New Age IPO» Часть 1
😴 Пробуди меня через время. Вероятно, даже через десять лет главным вопросом на рынке IPO/PRE-IPO останется доступ к аллокации. Я начал свой путь в этом деле в 2011 году, то есть 14 лет назад, что позволяет считать меня ветераном индустрии.
📓Немного про Рюриков и Печенегов
Многие специалисты из фондов, инвестиционных структур и брокерских компаний, которые на меня подписаны, так или иначе связаны с этим рынком. Некоторые пришли в индустрию — в том числе и благодаря мне, — а другие читали мои прогнозы по IPO и изменениям стоимости акций в 2017, 2019 и 2021 годах.
Значительный вклад в популяризацию IPO в России внес Тимур Турлов и Ко из Freedom Finance, открыв этот инструмент для широкой публики. Однако наибольшую роль в развитии сыграли, безусловно, инвестбанкиры и брокер-дилеры США.
Аз, буки, веди
🧐 Рынок IPO развивается волнообразно. Текущая фаза — шестая с момента dotcom bubble конца 90-х. Каждая фаза имела схожие паттерны развития/угасания, начиналась с высокого спроса на акции IPO и высокой доходности. Текущая фаза стартовала с успешного размещения Circle $CRCL, что в профессиональной терминологии инвестбанкиров называется "IPO window".
Первым ключевым игроком, которого должен знать каждый в этой индустрии, был RSP. Основанная в 2004 году, компания стремилась перевести учет сделок из бумажного формата в онлайн. Вдохновением послужило размещение Google 19 августа 2004 года. В то время успех Google был неочевиден, поэтому сделки были единичными, но этого было достаточно, чтобы привлечь внимание инвестбанкиров с Уолл-стрит к secondary рынку. До 2009 года SecondMarket активно просвещал рынок о сути и преимуществах вторичного рынка.
🚀 IPO Facebook
Второе значимое событие, свидетелем которого я стал, — публичное размещение Facebook Inc. 18 мая 2012 года. К тому времени, с 2010 года, многие, кто был вовлечен в венчурный капитал и инвестиционную среду, уже знали о вторичном рынке. Немалую роль в этом сыграл Юрий Борисович Мильнер и его тогда молодой фонд DST Global (основан в 2009 году).
DST Global на тот момент не имел достаточной репутации для прямого доступа к лучшим технологическим компаниям, поэтому скупал акции через тендеры и напрямую у сотрудников. Таким образом, DST Global активно пополнял свой портфель активами ныне легендарных tech-компаний США, одновременно завоевывая доверие инвестбанкиров, которые сыграли большую роль в дальнейшем развитии фондов. В этот период на рынке появилось несколько broker-dealer объединений (RMS, Setter Toronto и множество ныне забытых имен), некоторые из которых существуют до сих пор, но в "олдскульном" режиме.
Глубокое погружение
В 2013 году, когда мой стартап Slinky столкнулся со скандалами на фоне хакерских атак и утечки данных, его оценка в $27M значительно упала из-за потери клиентов, снижения выручки и репутационных рисков [1,2,3]. В том же 2013 году, нуждаясь в средствах, я пригласил инвестбанкиров из SM, которые организовали для меня вторичную сделку. С этого момента я начал глубоко погружаться во вторичный рынок.
Одной из моих первых сделок в роли инвестбанкира, а не продавца акций, стали размещения компаний New Relic Inc., Arista Networks, Inc. и GoPro Inc. Все эти сделки осуществлялись в сотрудничестве с коллегами из SecondMarket, которые ранее помогли мне продать мои собственные акции. Стратегия была проста: я был знаком со многими основателями и сотрудниками из технологической индустрии, которые могли выступать продавцами, что создавало взаимовыгодную ситуацию для всех сторон.
NPM was Born
После успешного 2014 corp dev подразделение Nasdaq заметило активное развитие вторичного рынка и в 2015 году выкупило SecondMarket [1].Барри Силберт был доволен сделкой, поскольку видел будущее, где лидером станет крупный бренд, а не небольшая конторка, похожая больше на шарашку, чем на биржу.
🥺 После поглощения SM наши пути на некоторое время разошлись. Я сосредоточился на работе над собственным стартапом, сольных (неудачных) инвестициях, а также на развитии бизнеса CPaaS-платформы VoxImplant
Продолжение следует
—
Автор: Виктор Кох
С ноги в IT - бесплатно: 66 JavaScript задач для начинающих
Друзья, в этом посте хочу рассказать, как можно освоить навыки программирования без затрат на дорогостоящие курсы. Главное - только Вы сами можете научиться. Даже за деньги Вас не смогут научить, только дать информацию. Надеюсь мое видео "66 JavaScript задач для начинающих" будет полезным в совершении первых шагов в программировании.
Это видео - отличный пример того, что платить за обучение не обязательно. Современные ресурсы и доступная информация позволяют самостоятельно изучать и развивать навыки в IT. Если у вас есть желание и немного упорства, вы можете "войти в IT" бесплатно!
Всем удачи в обучении и не забывайте - главное начать!
P.S. Любите своё дело!
PeerDependencies
Недавно делал код ревью и заметил, что в pnpm-lock.yaml (альтернатива yarn.lock в pnpm) добавлена 17-я версия реакта, хотя на проекте мы используем 18-ю. Нам не нужно тянуть в проект 2 версии реакта — поэтому идём разбираться.
Дело в том, что в библиотеке react-cheetah-grid, которую мы используем для рендера длинных таблиц, реакт указан в секции dependencies вместо peerDependencies.
dependencies vs peerDependencies
- dependencies: пакеты, которые необходимы для работы вашего приложения и устанавливаются автоматически
- peerDependencies: пакеты, которые должны быть уже установлены в среде, где используется ваш пакет, чтобы избежать конфликтов версий
Чтобы быстро исправить проблему — можно переопределить версию реакта для определённого пакета в pnpm с помощью метода readPackage. Также нужно откатить изменения в pnpm-lock.yaml и запустить pnpm install .
// .pnpmfile.cjs
const package = require('./package.json');
function readPackage(pkg, context) {
if (pkg.name === "react-cheetah-grid") {
pkg.dependencies['react'] = package.dependencies['react'];
pkg.dependencies['react-dom'] = package.dependencies['react-dom'];
}
return pkg;
}
module.exports = {
hooks: {
readPackage,
},
};
Но затем лучше создать ишью в репозитории библиотеки или отправить пул реквест.