summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta-oe/recipes-security/nmap/files/0003-Fix-off-by-one-overflow-in-the-IP-protocol-table.patch165
-rw-r--r--meta-oe/recipes-security/nmap/nmap_7.95.bb1
2 files changed, 166 insertions, 0 deletions
diff --git a/meta-oe/recipes-security/nmap/files/0003-Fix-off-by-one-overflow-in-the-IP-protocol-table.patch b/meta-oe/recipes-security/nmap/files/0003-Fix-off-by-one-overflow-in-the-IP-protocol-table.patch
new file mode 100644
index 0000000000..bcb04250bb
--- /dev/null
+++ b/meta-oe/recipes-security/nmap/files/0003-Fix-off-by-one-overflow-in-the-IP-protocol-table.patch
@@ -0,0 +1,165 @@
1From 364d089250d1acf459e9e8580161e7bb06268106 Mon Sep 17 00:00:00 2001
2From: Wang Mingyu <wangmy@fujitsu.com>
3Date: Tue, 15 Oct 2024 02:47:38 +0000
4Subject: [PATCH] Fix off-by-one overflow in the IP protocol table.
5
6Fixes #2896, closes #2897, closes #2900
7
8Upstream-Status: Backport [https://github.com/nmap/nmap/commit/efa0dc36f2ecade6ba8d2ed25dd4d5fbffdea308]
9
10Signed-off-by: Wang Mingyu <wangmy@fujitsu.com>
11---
12 CHANGELOG | 3 +++
13 portlist.cc | 8 ++++----
14 protocols.cc | 6 +++---
15 protocols.h | 2 ++
16 scan_lists.cc | 10 +++++-----
17 5 files changed, 17 insertions(+), 12 deletions(-)
18
19diff --git a/CHANGELOG b/CHANGELOG
20index f01262c..5b204bd 100644
21--- a/CHANGELOG
22+++ b/CHANGELOG
23@@ -1,5 +1,8 @@
24 #Nmap Changelog ($Id: CHANGELOG 38849 2024-04-18 17:16:42Z dmiller $); -*-text-*-
25
26+o [GH#2900, GH#2896, GH#2897] Nmap is now able to scan IP protocol 255.
27+ [nnposter]
28+
29 Nmap 7.95 [2024-04-19]
30
31 o [Windows] Upgraded Npcap (our Windows raw packet capturing and
32diff --git a/portlist.cc b/portlist.cc
33index 8258853..cd08437 100644
34--- a/portlist.cc
35+++ b/portlist.cc
36@@ -480,7 +480,7 @@ void PortList::setPortState(u16 portno, u8 protocol, int state, int *oldstate) {
37 state != PORT_CLOSEDFILTERED)
38 fatal("%s: attempt to add port number %d with illegal state %d\n", __func__, portno, state);
39
40- assert(protocol!=IPPROTO_IP || portno<256);
41+ assert(protocol!=IPPROTO_IP || portno<=MAX_IPPROTONUM);
42
43 bool created = false;
44 current = createPort(portno, protocol, &created);
45@@ -566,7 +566,7 @@ Port *PortList::nextPort(const Port *cur, Port *next,
46 if (cur) {
47 proto = INPROTO2PORTLISTPROTO(cur->proto);
48 assert(port_map[proto]!=NULL); // Hmm, it's not possible to handle port that doesn't have anything in map
49- assert(cur->proto!=IPPROTO_IP || cur->portno<256);
50+ assert(cur->proto!=IPPROTO_IP || cur->portno<=MAX_IPPROTONUM);
51 mapped_pno = port_map[proto][cur->portno];
52 mapped_pno++; // we're interested in next port after current
53 } else { // running for the first time
54@@ -615,7 +615,7 @@ void PortList::mapPort(u16 *portno, u8 *protocol) const {
55 mapped_protocol = INPROTO2PORTLISTPROTO(*protocol);
56
57 if (*protocol == IPPROTO_IP)
58- assert(*portno < 256);
59+ assert(*portno <= MAX_IPPROTONUM);
60 if(port_map[mapped_protocol]==NULL || port_list[mapped_protocol]==NULL) {
61 fatal("%s(%i,%i): you're trying to access uninitialized protocol", __func__, *portno, *protocol);
62 }
63@@ -713,7 +713,7 @@ int PortList::port_list_count[PORTLIST_PROTO_MAX];
64 * should be sorted. */
65 void PortList::initializePortMap(int protocol, u16 *ports, int portcount) {
66 int i;
67- int ports_max = (protocol == IPPROTO_IP) ? 256 : 65536;
68+ int ports_max = (protocol == IPPROTO_IP) ? MAX_IPPROTONUM + 1 : 65536;
69 int proto = INPROTO2PORTLISTPROTO(protocol);
70
71 if (port_map[proto] != NULL || port_map_rev[proto] != NULL)
72diff --git a/protocols.cc b/protocols.cc
73index 76e42c7..85e55e4 100644
74--- a/protocols.cc
75+++ b/protocols.cc
76@@ -79,7 +79,7 @@ struct strcmp_comparator {
77
78 // IP Protocol number is 8 bits wide
79 // protocol_table[IPPROTO_TCP] == {"tcp", 6}
80-static struct nprotoent *protocol_table[UCHAR_MAX];
81+static struct nprotoent *protocol_table[MAX_IPPROTONUM + 1];
82 // proto_map["tcp"] = {"tcp", 6}
83 typedef std::map<const char *, struct nprotoent, strcmp_comparator> ProtoMap;
84 static ProtoMap proto_map;
85@@ -119,7 +119,7 @@ static int nmap_protocols_init() {
86 if (*p == '#' || *p == '\0')
87 continue;
88 res = sscanf(line, "%127s %hu", protocolname, &protno);
89- if (res !=2 || protno > UCHAR_MAX) {
90+ if (res !=2 || protno > MAX_IPPROTONUM) {
91 error("Parse error in protocols file %s line %d", filename, lineno);
92 continue;
93 }
94@@ -191,7 +191,7 @@ const struct nprotoent *nmap_getprotbynum(int num) {
95 if (nmap_protocols_init() == -1)
96 return NULL;
97
98- assert(num >= 0 && num < UCHAR_MAX);
99+ assert(num >= 0 && num <= MAX_IPPROTONUM);
100 return protocol_table[num];
101 }
102
103diff --git a/protocols.h b/protocols.h
104index 8934284..2de0aa4 100644
105--- a/protocols.h
106+++ b/protocols.h
107@@ -79,6 +79,8 @@ int addprotocolsfromservmask(char *mask, u8 *porttbl);
108 const struct nprotoent *nmap_getprotbynum(int num);
109 const struct nprotoent *nmap_getprotbyname(const char *name);
110
111+#define MAX_IPPROTONUM 255
112+
113 #define MAX_IPPROTOSTRLEN 4
114 #define IPPROTO2STR(p) \
115 ((p)==IPPROTO_TCP ? "tcp" : \
116diff --git a/scan_lists.cc b/scan_lists.cc
117index f02e279..ebe1357 100644
118--- a/scan_lists.cc
119+++ b/scan_lists.cc
120@@ -165,7 +165,7 @@ void getpts(const char *origexpr, struct scan_lists *ports) {
121 ports->udp_count++;
122 if (porttbl[i] & SCAN_SCTP_PORT)
123 ports->sctp_count++;
124- if (porttbl[i] & SCAN_PROTOCOLS && i < 256)
125+ if (porttbl[i] & SCAN_PROTOCOLS && i <= MAX_IPPROTONUM)
126 ports->prot_count++;
127 }
128
129@@ -192,7 +192,7 @@ void getpts(const char *origexpr, struct scan_lists *ports) {
130 ports->udp_ports[udpi++] = i;
131 if (porttbl[i] & SCAN_SCTP_PORT)
132 ports->sctp_ports[sctpi++] = i;
133- if (porttbl[i] & SCAN_PROTOCOLS && i < 256)
134+ if (porttbl[i] & SCAN_PROTOCOLS && i <= MAX_IPPROTONUM)
135 ports->prots[proti++] = i;
136 }
137
138@@ -388,7 +388,7 @@ static void getpts_aux(const char *origexpr, int nested, u8 *porttbl, int range_
139 } else if (isdigit((int) (unsigned char) *current_range)) {
140 rangestart = strtol(current_range, &endptr, 10);
141 if (range_type & SCAN_PROTOCOLS) {
142- if (rangestart < 0 || rangestart > 255)
143+ if (rangestart < 0 || rangestart > MAX_IPPROTONUM)
144 fatal("Protocols specified must be between 0 and 255 inclusive");
145 } else {
146 if (rangestart < 0 || rangestart > 65535)
147@@ -429,13 +429,13 @@ static void getpts_aux(const char *origexpr, int nested, u8 *porttbl, int range_
148 if (!*current_range || *current_range == ',' || *current_range == ']') {
149 /* Ended with a -, meaning up until the last possible port */
150 if (range_type & SCAN_PROTOCOLS)
151- rangeend = 255;
152+ rangeend = MAX_IPPROTONUM;
153 else
154 rangeend = 65535;
155 } else if (isdigit((int) (unsigned char) *current_range)) {
156 rangeend = strtol(current_range, &endptr, 10);
157 if (range_type & SCAN_PROTOCOLS) {
158- if (rangeend < 0 || rangeend > 255)
159+ if (rangeend < 0 || rangeend > MAX_IPPROTONUM)
160 fatal("Protocols specified must be between 0 and 255 inclusive");
161 } else {
162 if (rangeend < 0 || rangeend > 65535)
163--
1642.34.1
165
diff --git a/meta-oe/recipes-security/nmap/nmap_7.95.bb b/meta-oe/recipes-security/nmap/nmap_7.95.bb
index 79c28e71f0..a319be4fb0 100644
--- a/meta-oe/recipes-security/nmap/nmap_7.95.bb
+++ b/meta-oe/recipes-security/nmap/nmap_7.95.bb
@@ -10,6 +10,7 @@ SRC_URI = "http://nmap.org/dist/${BP}.tar.bz2 \
10 file://nmap-replace-shtool-mkdir-with-coreutils-mkdir-command.patch \ 10 file://nmap-replace-shtool-mkdir-with-coreutils-mkdir-command.patch \
11 file://0001-Include-time.h-header-to-pass-clang-compilation.patch \ 11 file://0001-Include-time.h-header-to-pass-clang-compilation.patch \
12 file://0002-Fix-building-with-libc.patch \ 12 file://0002-Fix-building-with-libc.patch \
13 file://0003-Fix-off-by-one-overflow-in-the-IP-protocol-table.patch \
13 " 14 "
14SRC_URI[sha256sum] = "e14ab530e47b5afd88f1c8a2bac7f89cd8fe6b478e22d255c5b9bddb7a1c5778" 15SRC_URI[sha256sum] = "e14ab530e47b5afd88f1c8a2bac7f89cd8fe6b478e22d255c5b9bddb7a1c5778"
15inherit autotools-brokensep pkgconfig python3native 16inherit autotools-brokensep pkgconfig python3native