Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/bybravehq/ip2
General Purpose UtilitiesStatic AnalysisVulnerability AnalysisConfiguration AuditingWeb SecurityNetwork Security
GitHubbybravehq/ip2

ip2

node-ip의 유지 관리 포크로, 패치되지 않은 SSRF 권고(CVE-2024-29415)가 수정되었습니다.

저장소 보기
1개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
웹사이트

@bybrave/ip2

CI npm

Node.js용 IP 주소 유틸리티인 ip의 관리되는 포크입니다. 패치되지 않은 SSRF 권고를 수정했습니다.

원본 패키지는 월 약 3800만 회 다운로드, 2024년 2월 이후 릴리스가 없으며, 모든 게시된 버전에 영향을 미치는 HIGH 심각도 권고(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()은 원시 입력 문자열에 대해 정규식을 실행했습니다. 정규식이 예상하지 못한 주소 표기법(8진수 또는 16진수 옥텟, 축약된 IPv4, 압축되지 않은 IPv6)은 자동으로 공개로 분류되었습니다:

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와 동일한 문법, IPv6 영역 ID 포함)로 주소를 바이트로 구문 분석합니다. 분류는 문자열이 아닌 바이트 단위로 수행됩니다.
  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, 벤치마킹, 멀티캐스트, 예약, ULA, 문서 범위 등이 추가됩니다 — 아래 표를 참조하세요.
  4. 전환 주소를 포함된 IPv4에 따라 분류합니다. ::ffff:a.b.c.d(v4-mapped), 64:ff9b::a.b.c.d(NAT64) 및 (6to4)는 내부 IPv4 주소에 따라 private/public으로 분류됩니다.
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]에 대한 모든 수정 사항

ip에서 마이그레이션

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

API 표면은 동일합니다. 동작 차이는 보안 및 정확성 수정입니다 — 업그레이드 전에 아래의 주요 변경 사항을 확인하세요.

주요 변경 사항 (v3)

버전 3.0.0인 이유는 엄격함이 수정이기 때문입니다. 이 라이브러리에 비정식 문자열을 전달했다면 v2는 호환 가능한 답변이 아닌 잘못된 답변을 제공했을 것입니다:

  • isPrivate / isPublic / isLoopback / toBuffer / toLong이 잘못되거나 비정식 입력(8진수/16진수 옥텟, 127.1, 정수 문자열)에 대해 오류를 발생시킵니다. 레거시 표기법을 허용해야 하는 경우 먼저 normalizeToLong()을 사용하세요.
  • isLoopback('fe80::1')은 이제 false입니다(링크-로컬 ≠ 루프백; 여전히 isPrivate). isLoopback('::')은 이제 false입니다(지정되지 않음 ≠ 루프백; 여전히 isPrivate).
  • loopback('ipv6')는 'fe80::1' 대신 을 반환합니다.

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 (브로드캐스트 포함).

IPv6: ::/96 (지정되지 않음, 루프백, 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 제작) 기반.

도구 다운로드
2002:xxxx:xxxx::
수정 사항원본 이슈
CVE-2024-29415 / GHSA-2p57-rm9w-gvfp — 비정식 주소를 통한 SSRF#136, #150, #153, #158
isPrivate()가 CGNAT, TEST-NET, 벤치마킹, 멀티캐스트, 예약, 문서 범위를 누락—
cidrSubnet(...).contains()가 IPv4-mapped IPv6 주소에 대해 false 반환#104
isV6Format()이 IPv4 주소에 대해 true 반환#67
isV4Format()이 256 이상의 옥텟 허용#105
address('public')이 private 주소를 반환하고 그 반대(필터가 반전됨)—
loopback('ipv6')이 fe80::1 반환 (링크-로컬, loopback 아님) → 이제 ::1—
cidr()/cidrSubnet()이 유효하지 않은 접두사 길이(/33, /x)에 대해 자동으로 쓰레기 생성 → 이제 오류 발생—
address(name)이 알 수 없는 인터페이스 이름에 대해 TypeError로 충돌 → 이제 undefined 반환—
TypeScript 타입 내장(@types/ip 불필요), ESM named exports—
'::1'
  • isPrivate()이 더 많은 범위(CGNAT, TEST-NET, 멀티캐스트, …)에 대해 true를 반환합니다 — 이제 "전역적으로 도달 가능하지 않음"을 의미합니다.
  • address('public')은 이제 실제로 공개 주소를 반환합니다. LAN 주소를 얻기 위해 반전된 동작에 의존했다면 address('private')를 사용하세요 — 그것이 이전에 제공하던 것입니다.
  • Node.js ≥ 18.