Анонс NodeSecure Vulnera


😍 Логотип и обложка от нашего любимого medhi bouchard ❤️

Привет 👋,

Вернулся к небольшой статье о ребрендинге одного из инструментов NodeSecure: Vulnera (ранее vuln, началась vuln-эра!).

Это возможность для меня также написать об этом замечательном проекте, который родился с редизайном бэк-энда менее года назад ⌚. Если вы не помните, я писал статью:

Не ждите и погрузитесь 🌊 вместе со мной, чтобы открыть для себя этот инструмент 💃.

Что такое 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, что означает…

Посмотреть на GitHub

Спасибо 🙏 за то, что читаете меня и до скорой встречи в новой статье!

Оцените статью
devanswers.ru
Добавить комментарий