Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/bybravehq/ip2
Утилиты общего назначенияСтатический анализАнализ уязвимостейАудит конфигурацииВеб-безопасностьСетевая безопасность
GitHubbybravehq/ip2

ip2

Поддерживаемый форк node-ip, в котором исправлена непатченная уязвимость SSRF (CVE-2024-29415)

Репозиторий
42 месяцев назадЕщё не проверено
Сайт

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

@bybrave/ip2

CI npm

Поддерживаемый форк ip — утилиты для работы с IP-адресами для Node.js, — в котором исправлена непатченная SSRF-уязвимость из бюллетеня безопасности.

Оригинальный пакет имеет ~38 млн загрузок в месяц, без релизов с февраля 2024 года, и бюллетень безопасности с высоким уровнем серьезности (CVE-2024-29415 / GHSA-2p57-rm9w-gvfp), который затрагивает каждую опубликованную версию и приводит к сбою npm audit при каждой установке. Этот форк исправляет первопричину, а не пропатчивает регулярные выражения.

root@kitploit:~
npm install @bybrave/ip2
root@kitploit:~
// CommonJS — drop-in
const ip = require('@bybrave/ip2');

// ESM — named imports
import { isPrivate, isPublic, cidrSubnet } from '@bybrave/ip2';

// TypeScript types built in

Уязвимость и как она исправлена

Оригинальные isPrivate() / isPublic() / isLoopback() выполняли регулярные выражения над исходной входной строкой. Любое представление адреса, которое регулярные выражения не предусматривали, — восьмеричные или шестнадцатеричные октеты, сокращённый IPv4, несжатый IPv6 — молча классифицировалось как public:

root@kitploit:~
// original [email protected] — all of these are loopback/private, all reported PUBLIC:
ip.isPublic('127.1')            // true 💥
ip.isPublic('012.1.2.3')        // true 💥  (octal 10.1.2.3)
ip.isPublic('01200034567')      // true 💥  (integer 10.0.14.119)
ip.isPublic('000:0:0000::01')   // true 💥  (that's ::1)

Если эти ответы используются для защиты исходящих запросов, это дыра SSRF (CVE-2024-29415, неполное исправление CVE-2023-42282).

Этот форк:

  1. Сначала разбор, затем классификация. Каждая классифицирующая функция разбирает адрес в байты с помощью строгого парсера (та же грамматика, что и у net.isIP, плюс zone ID для IPv6). Классификация выполняется по байтам, а не по строкам.
  2. Отклоняет неоднозначный ввод. Некканонические представления (127.1, 0x7f.1, 0177.0.0.1, 2130706433) выбрасывают исключение, а не угадываются. Отказ происходит в безопасную сторону, а не в пропуск. Если вам нужно принимать устаревшие обозначения, сначала явно нормализуйте: ip.fromLong(ip.normalizeToLong(addr)).
  3. Покрывает полные реестры специальных назначений IANA (IPv4, IPv6), а не четыре регулярных выражения. isPrivate() теперь означает «не доступен глобально» — та же конвенция, что и в Python ipaddress. Это добавляет CGNAT (100.64/10), TEST-NET, benchmarking, multicast, зарезервированные диапазоны, ULA, документационные диапазоны и другое — см. таблицу ниже.
  4. Классифицирует транзитные адреса по встроенному в них IPv4. ::ffff:a.b.c.d (v4-mapped), 64:ff9b::a.b.c.d (NAT64) и 2002:xxxx:xxxx:: (6to4) считаются private/public в зависимости от IPv4-адреса внутри них.
root@kitploit:~
// @bybrave/ip2
ip.isPublic('127.1')             // throws Error: Invalid ip address: 127.1
ip.isPrivate('000:0:0000::01')   // true (parsed as ::1)
ip.isLoopback('::fFFf:127.0.0.1')// true
ip.isPublic('64:ff9b::8.8.8.8')  // true  (NAT64 of a public address)
ip.isPrivate('100.64.0.1')       // true  (CGNAT — original said public)

Все исправления относительно [email protected]

ИсправлениеПроблема в оригинале
CVE-2024-29415 / GHSA-2p57-rm9w-gvfp — SSRF через неканонические адреса#136, #150, #153, #158
isPrivate() не учитывает CGNAT, TEST-NET, benchmarking, multicast, зарезервированные и документационные диапазоны—
cidrSubnet(...).contains() возвращает false для IPv4-mapped IPv6-адресов#104
isV6Format() возвращает true для IPv4-адресов#67
isV4Format() принимает октеты ≥ 256#105
address('public') возвращал private-адреса и наоборот (фильтр был инвертирован)—
loopback('ipv6') возвращал fe80::1, что является link-local, а не loopback → теперь ::1—
cidr()/cidrSubnet() молча возвращали мусор при недопустимых длинах префикса (/33, /x) → теперь выбрасывают ошибку—
address(name) падал с TypeError для неизвестных имён интерфейсов → теперь возвращает undefined—
Встроенные типы TypeScript (не нужен @types/ip), именованные ESM-экспорты—

Переход с ip

root@kitploit:~
- const ip = require('ip');
+ const ip = require('@bybrave/ip2');

Поверхность API та же; поведенческие отличия — это исправления безопасности и корректности — ознакомьтесь с ломающими изменениями ниже перед обновлением.

Ломающие изменения (v3)

Версия 3.0.0, потому что строгость и есть исправление — если вы подавали этой библиотеке неканонические строки, v2 давала вам несовместимые ответы, а просто неправильные:

  • isPrivate / isPublic / isLoopback / toBuffer / toLong выбрасывают исключение при некорректном или неканоническом вводе (восьмеричные/шестнадцатеричные октеты, 127.1, целочисленные строки). При необходимости принимать устаревшие обозначения сначала используйте normalizeToLong().
  • isLoopback('fe80::1') теперь возвращает false (link-local ≠ loopback; по-прежнему isPrivate). isLoopback('::') теперь возвращает false (unspecified ≠ loopback; по-прежнему isPrivate).
  • loopback('ipv6') возвращает '::1' вместо 'fe80::1'.
  • isPrivate() возвращает true для большего числа диапазонов (CGNAT, TEST-NET, multicast, …) — теперь это означает «не доступен глобально».
  • address('public') теперь действительно возвращает публичные адреса. Если вы полагались на инвертированное поведение для получения LAN-адреса, используйте address('private') — именно его она вам и возвращала.
  • Node.js ≥ 18.

API

Всё, что экспортирует оригинал, плюс isValid():

root@kitploit:~
ip.address('public', 'ipv6')          // address of a network interface
ip.isPrivate('10.0.0.1')              // true — not globally reachable
ip.isPublic('8.8.8.8')                // true
ip.isLoopback('127.8.8.8')            // true
ip.isValid('300.1.2.3')               // false (never throws)
ip.isV4Format('192.168.0.1')          // true
ip.isV6Format('2001:db8::1')          // true
ip.isEqual('::ffff:7f00:1', '127.0.0.1') // true

ip.toBuffer('127.0.0.1')              // Buffer([127, 0, 0, 1])
ip.toString(buf, offset, length)      // '127.0.0.1'
ip.toLong('127.0.0.1')                // 2130706433
ip.fromLong(2130706433)               // '127.0.0.1'
ip.normalizeToLong('127.1')           // 2130706433 (lenient, -1 on error)

ip.fromPrefixLen(24)                  // '255.255.255.0'
ip.mask('192.168.1.134', '255.255.255.0') // '192.168.1.0'
ip.cidr('192.168.1.134/26')           // '192.168.1.128'
ip.not('255.255.255.0')               // '0.0.0.255'
ip.or('0.0.0.255', '192.168.1.10')    // '192.168.1.255'

const s = ip.cidrSubnet('192.168.1.134/26')
s.networkAddress                      // '192.168.1.128'
s.firstAddress                        // '192.168.1.129'
s.lastAddress                         // '192.168.1.190'
s.broadcastAddress                    // '192.168.1.191'
s.subnetMaskLength                    // 26
s.numHosts                            // 62
s.contains('::ffff:192.168.1.180')    // true (v4-mapped handled)

Диапазоны, считающиеся private (не доступными глобально)

IPv4: 0.0.0.0/8, 10.0.0.0/8, 100.64.0.0/10 (CGNAT), 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.0.0.0/24, 192.0.2.0/24, 192.88.99.0/24, 192.168.0.0/16, 198.18.0.0/15, 198.51.100.0/24, 203.0.113.0/24, 224.0.0.0/4, 240.0.0.0/4 (вкл. broadcast).

IPv6: ::/96 (unspecified, loopback, v4-compatible), 64:ff9b:1::/48, 100::/64, 2001::/23, 2001:db8::/32, 3fff::/20, 5f00::/16, fc00::/7, fe80::/10, fec0::/10, ff00::/8. Транзитные диапазоны ::ffff:0:0/96, 64:ff9b::/96 и 2002::/16 следуют своему встроенному IPv4-адресу.

Поддержка

Если этот пакет экономит ваше время, вы можете поддержать разработку:

Ko-fi Bitcoin

Bitcoin (BTC): bc1q37557q5jpeaxqydzwvf3jgj7zhnfpn2td3q40q

Авторы и лицензия

MIT. Основано на node-ip от Fedor Indutny.

Скачать инструмент