Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
ip2 — Fork mantido do node-ip com o aviso SSRF (CVE-2024-29415) corrigido. | Kitploit
Ferramentas/GitHubGitHub/bybravehq/ip2
Utilitários de Propósito GeralAnálise EstáticaAnálise de VulnerabilidadesAuditoria de ConfiguraçãoSegurança WebSegurança de Rede
GitHubbybravehq/ip2

ip2

Fork mantido do node-ip com o aviso SSRF (CVE-2024-29415) corrigido.

Ver Repositório
há 1 mêsAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
Site

@bybrave/ip2

CI npm

Fork mantido do ip — utilitários de endereço IP para Node.js — com o aviso de SSRF não corrigido corrigido.

O pacote original tem ~38 milhões de downloads/mês, nenhum lançamento desde fevereiro de 2024, e um aviso de gravidade ALTA (CVE-2024-29415 / GHSA-2p57-rm9w-gvfp) que afeta todas as versões publicadas e faz o npm audit falhar em cada instalação. Este fork corrige a causa raiz em vez de aplicar patches nas regexes.

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

A vulnerabilidade e como ela é corrigida

As funções originais isPrivate() / isPublic() / isLoopback() executavam expressões regulares sobre a string de entrada bruta. Qualquer grafia de um endereço que as regexes não antecipavam — octetos octais ou hexadecimais, IPv4 abreviado, IPv6 não comprimido — era silenciosamente classificada como público:

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)

Se essas respostas protegem solicitações de saída, isso é uma brecha de SSRF (CVE-2024-29415, correção incompleta do CVE-2023-42282).

Este fork:

  1. Analisa primeiro, classifica depois. Cada função de classificação analisa o endereço em bytes com um parser rigoroso (mesma gramática do net.isIP, mais IDs de zona IPv6). A classificação opera sobre bytes, nunca sobre strings.
  2. Rejeita entrada ambígua. Grafias não canônicas (127.1, 0x7f.1, 0177.0.0.1, 2130706433) lançam exceção em vez de serem adivinhadas. Falha fechada, não aberta. Se precisar aceitar notações legadas, normalize explicitamente primeiro: ip.fromLong(ip.normalizeToLong(addr)).
  3. Cobre todos os registros de propósito especial da IANA (IPv4, IPv6), não apenas quatro regexes. isPrivate() agora significa "não globalmente alcançável" — a mesma convenção do ipaddress do Python. Isso adiciona CGNAT (100.64/10), TEST-NETs, benchmarking, multicast, reservado, ULA, faixas de documentação e mais — veja a tabela abaixo.
  4. Classifica endereços de transição pelo IPv4 embutido. (mapeado IPv4), (NAT64) e (6to4) são privados/públicos de acordo com o endereço IPv4 contido neles.
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)

Todas as correções em relação ao [email protected]

Migrando do ip

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

A superfície da API é a mesma; as diferenças comportamentais são as correções de segurança e exatidão — veja as mudanças críticas abaixo antes de atualizar.

Mudanças críticas (v3)

Versão 3.0.0 porque o rigor é a correção — se você forneceu a esta biblioteca strings não canônicas, a v2 estava lhe dando respostas erradas, não compatíveis:

  • isPrivate / isPublic / isLoopback / toBuffer / toLong lançam exceção em entrada malformada ou não canônica (octetos octal/hex, 127.1, strings inteiras). Use normalizeToLong() primeiro se precisar aceitar notações legadas.
  • isLoopback('fe80::1') agora é false (link-local ≠ loopback; ainda é isPrivate). isLoopback('::') agora é false (não especificado ≠ loopback; ainda é isPrivate).
  • loopback('ipv6') retorna em vez de .

API

Tudo o que o original exporta, mais 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)

Faixas tratadas como privadas (não globalmente alcançáveis)

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 (incluindo broadcast).

IPv6: ::/96 (não especificado, loopback, v4-compatível), 64:ff9b:1::/48, 100::/64, 2001::/23, 2001:db8::/32, 3fff::/20, 5f00::/16, fc00::/7, fe80::/10, fec0::/10, ff00::/8. Faixas de transição ::ffff:0:0/96, 64:ff9b::/96 e 2002::/16 seguem seu endereço IPv4 embutido.

Suporte

Se este pacote lhe economizar tempo, você pode apoiar a manutenção:

Ko-fi Bitcoin

Bitcoin (BTC): bc1q37557q5jpeaxqydzwvf3jgj7zhnfpn2td3q40q

Créditos e licença

MIT. Baseado em node-ip por Fedor Indutny.

Baixar ferramenta
::ffff:a.b.c.d
64:ff9b::a.b.c.d
2002:xxxx:xxxx::
CorrigidoProblema original
CVE-2024-29415 / GHSA-2p57-rm9w-gvfp — SSRF via endereços não canônicos#136, #150, #153, #158
isPrivate() não considera CGNAT, TEST-NETs, benchmarking, multicast, reservado, faixas de documentação—
cidrSubnet(...).contains() retorna false para endereços IPv6 mapeados em IPv4#104
isV6Format() retorna true para endereços IPv4#67
isV4Format() aceita octetos ≥ 256#105
address('public') retornava endereços privados e vice-versa (filtro estava invertido)—
loopback('ipv6') retornava fe80::1, que é link-local, não loopback → agora ::1—
cidr()/cidrSubnet() produzia silenciosamente lixo para comprimentos de prefixo inválidos (/33, /x) → agora lançam exceção—
address(name) travava com TypeError para nomes de interface desconhecidos → agora retorna undefined—
Tipos TypeScript embutidos (sem necessidade de @types/ip), exportações nomeadas ESM—
'::1'
'fe80::1'
  • isPrivate() retorna true para mais faixas (CGNAT, TEST-NETs, multicast, …) — agora significa "não globalmente alcançável".
  • address('public') agora retorna endereços públicos de fato. Se você dependia do comportamento invertido para obter um endereço LAN, use address('private') — era isso que ele estava lhe dando.
  • Node.js ≥ 18.