😍 Логотип и обложка от нашего любимого medhi bouchard ❤️
Привет 👋,
Вернулся к небольшой статье о ребрендинге одного из инструментов NodeSecure: Vulnera (ранее vuln, началась vuln-эра!).
Это возможность для меня также написать об этом замечательном проекте, который родился с редизайном бэк-энда менее года назад ⌚. Если вы не помните, я писал статью:


- Анонс нового бэкенда Node-Secure
- Thomas.G for NodeSecure ・ Sep 11 ’21 ・ 4 min read
- Что такое Vulnera? 👀
- Стандартный формат уязвимостей 👯
- Использование в сканере 🔬
- Что дальше? 🚀
- Кредиты 🙇
- NodeSecure / vulnera
- Программный поиск уязвимостей безопасности с помощью одной или многих стратегий (NPM Audit, Sonatype, Snyk, Node.js DB).
- Требования
- Начало работы
- Пример использования
- Доступная стратегия
Анонс нового бэкенда Node-Secure
Thomas.G for NodeSecure ・ Sep 11 ’21 ・ 4 min read
Не ждите и погрузитесь 🌊 вместе со мной, чтобы открыть для себя этот инструмент 💃.
Что такое Vulnera? 👀
Vulnera — это пакет, который позволяет вам программно получать информацию об уязвимостях вашего проекта Node.js из нескольких источников или стратегий:
- NPM Audit (база данных консультаций Github)
- Sonatype OSS Index
- Snyk
📢 Не стесняйтесь добавлять новые источники (у нас есть руководство о том, как добавить/создать один).
Изначально код был разработан для управления уязвимостями в Сканере. Тем не менее, его API развивается с целью сделать его полноценным проектом.
import * as vulnera from "@nodesecure/vulnera";
const def = await vulnera.setStrategy(
vulnera.strategies.NPM_AUDIT
);
const vulnerabilities = await def.getVulnerabilities(process.cwd(), {
useStandardFormat: true
});
console.log(vulnerabilities);
Стандартный формат уязвимостей 👯
Мы создали стандартный формат для согласования различных источников.
export interface StandardVulnerability {
/** Unique identifier for the vulnerability **/
id?: string;
/** Vulnerability origin, either Snyk, NPM or NodeSWG **/
origin: Origin;
/** Package associated with the vulnerability **/
package: string;
/** Vulnerability title **/
title: string;
/** Vulnerability description **/
description?: string;
/** Vulnerability link references on origin's website **/
url?: string;
/** Vulnerability severity levels given the strategy **/
severity?: Severity;
/** Common Vulnerabilities and Exposures dictionary */
cves?: string[];
/** Common Vulnerability Scoring System (CVSS) **/
cvssVector?: string;
/** CVSS Score **/
cvssScore?: number;
/** The range of vulnerable versions */
vulnerableRanges: string[];
/** The set of versions that are vulnerable **/
vulnerableVersions: string[];
/** The set of versions that are patched **/
patchedVersions?: string;
/** Overview of available patches **/
patches?: Patch[];
}
Вы всегда можете использовать оригинальные форматы каждого источника 😊. Мы реализовали и раскрыли интерфейсы TypeScript для каждого из них.
Использование в сканере 🔬
В сканере у нас есть вся необходимая информация, потому что мы проходим через дерево зависимостей 🎄. В конце процесса мы восстанавливаем все уязвимости путем итерации spec за spec в рамках метода стратегии hydratePayloadDependencies.
const {
hydratePayloadDependencies,
strategy
} = await vulnera.setStrategy(
userStrategyName // SNYK for example
);
await hydratePayloadDependencies(dependencies, {
useStandardFormat: true,
path: location
});
payload.vulnerabilityStrategy = strategy;
Следующая диаграмма объясняет общее поведение и взаимодействие между Scanner и Vulnera.
Если вы хотите узнать больше о Payload, вы можете ознакомиться с интерфейсом TypeScript здесь.
Что дальше? 🚀
Некоторые источники сложнее эксплуатировать, чем другие (для NPM мы используем Arborist, который упрощает нам жизнь).
const { vulnerabilities } = (await arborist.audit()).toJSON();
Тем не менее, нам приходится думать и создавать механики для эксплуатации таких источников, как Sonatype 😨. Это необходимо для API типа getVulnerabilities()
.
Среди основных тем и идей, над которыми мы работаем:
- Создание частной базы данных для сравнения источников между собой (см. #29).
- Объединение нескольких источников в один (см. #25).
- Поиск уязвимостей заданного удаленного пакета (с поддержкой частного реестра типа verdaccio). На данный момент мы поддерживаем только анализ локального манифеста или полезной нагрузки сканера.
Кредиты 🙇
Этот проект во многом обязан нашему основному сотруднику Antoine COULON, который вложил много энергии в его улучшение 💪.
Забавный факт: его первый вклад 🐤 в NodeSecure был также на старой версии кода Scanner, который управлял уязвимостями.
Но я не забываю и об индивидуальных вкладах 👏.
- Mathieu Kahlaoui за добавление API getVulnerabilities()
- Олега Сыча за добавление стратегии Snyk
- Медхи за работу над логотипом
NodeSecure / vulnera
Программный поиск уязвимостей безопасности с помощью одной или многих стратегий (NPM Audit, Sonatype, Snyk, Node.js DB).
Эра вульна началась! Программный поиск уязвимостей безопасности с помощью одной или многих стратегий. Первоначально разработанный для запуска и анализа зависимостей Scanner, теперь он также запускается независимо от npm Manifest.
Требования
- Node.js v16 или выше
Начало работы
Этот пакет доступен в репозитории пакетов Node и может быть легко установлен с помощью npm или yarn.
$ npm i @nodesecure/vulnera # or $ yarn add @nodesecure/vulnera
Пример использования
import * as vulnera from "@nodesecure/vulnera"; // Default strategy is currently "none". await vulnera.setStrategy(vulnera.strategies.NPM_AUDIT); const definition = await vulnera.getStrategy(); console.log(definition.strategy); const vulnerabilities = await definition.getVulnerabilities(process.cwd(), { useStandardFormat: true }); console.log(vulnerabilities);
Доступная стратегия
По умолчанию используется стратегия NONE, что означает…
Спасибо 🙏 за то, что читаете меня и до скорой встречи в новой статье!