suricata
app-layer-protos.h
Go to the documentation of this file.
1 /* Copyright (C) 2007-2021 Open Information Security Foundation
2  *
3  * You can copy, redistribute or modify this Program under the terms of
4  * the GNU General Public License version 2 as published by the Free
5  * Software Foundation.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * version 2 along with this program; if not, write to the Free Software
14  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15  * 02110-1301, USA.
16  */
17 
18 /**
19  * \file
20  *
21  * \author Victor Julien <victor@inliniac.net>
22  * \author Anoop Saldanha <anoopsaldanha@gmail.com>
23  */
24 
25 #ifndef SURICATA_APP_LAYER_PROTOS_H
26 #define SURICATA_APP_LAYER_PROTOS_H
27 
30  /* used by the probing parser when alproto detection fails
31  * permanently for that particular stream */
32  // Update of this value should be reflected in rust, where we also define it
34 
35  // Beginning of real/normal protocols
39  ALPROTO_TLS, /* SSLv2, SSLv3 & TLSv1 */
46 
74 
75  // signature-only (ie not seen in flow)
76  // HTTP for any version (ALPROTO_HTTP1 (version 1) or ALPROTO_HTTP2)
78 
79  /* keep last */
81  // After this ALPROTO_MAX_STATIC can come dynamic alproto ids
82  // For example, ALPROTO_SNMP is now dynamic
83 };
84 // NOTE: if ALPROTO's get >= 256, update SignatureNonPrefilterStore
85 
86 /* not using the enum as that is a unsigned int, so 4 bytes */
87 typedef uint16_t AppProto;
88 extern AppProto g_alproto_max;
89 
90 static inline bool AppProtoIsValid(AppProto a)
91 {
92  return ((a > ALPROTO_FAILED && a < g_alproto_max));
93 }
94 
95 // whether a signature AppProto matches a flow (or signature) AppProto
96 static inline bool AppProtoEquals(AppProto sigproto, AppProto alproto)
97 {
98  if (sigproto == alproto) {
99  return true;
100  }
101  switch (sigproto) {
102  case ALPROTO_DNS:
103  // a DNS signature matches on either DNS or DOH2 flows
104  return (alproto == ALPROTO_DOH2) || (alproto == ALPROTO_DNS);
105  case ALPROTO_HTTP2:
106  // a HTTP2 signature matches on either HTTP2 or DOH2 flows
107  return (alproto == ALPROTO_DOH2) || (alproto == ALPROTO_HTTP2);
108  case ALPROTO_DOH2:
109  // a DOH2 signature accepts dns, http2 or http generic keywords
110  return (alproto == ALPROTO_DOH2) || (alproto == ALPROTO_HTTP2) ||
111  (alproto == ALPROTO_DNS) || (alproto == ALPROTO_HTTP);
112  case ALPROTO_HTTP:
113  return (alproto == ALPROTO_HTTP1) || (alproto == ALPROTO_HTTP2);
114  case ALPROTO_DCERPC:
115  return (alproto == ALPROTO_SMB);
116  }
117  return false;
118 }
119 
120 // whether a signature AppProto matches a flow (or signature) AppProto
121 static inline AppProto AppProtoCommon(AppProto sigproto, AppProto alproto)
122 {
123  switch (sigproto) {
124  case ALPROTO_SMB:
125  if (alproto == ALPROTO_DCERPC) {
126  // ok to have dcerpc keywords in smb sig
127  return ALPROTO_SMB;
128  }
129  break;
130  case ALPROTO_HTTP:
131  // we had a generic http sig, now version specific
132  if (alproto == ALPROTO_HTTP1) {
133  return ALPROTO_HTTP1;
134  } else if (alproto == ALPROTO_HTTP2) {
135  return ALPROTO_HTTP2;
136  }
137  break;
138  case ALPROTO_HTTP1:
139  // version-specific sig with a generic keyword
140  if (alproto == ALPROTO_HTTP) {
141  return ALPROTO_HTTP1;
142  }
143  break;
144  case ALPROTO_HTTP2:
145  if (alproto == ALPROTO_HTTP) {
146  return ALPROTO_HTTP2;
147  }
148  break;
149  case ALPROTO_DOH2:
150  // DOH2 accepts different protocol keywords
151  if (alproto == ALPROTO_HTTP || alproto == ALPROTO_HTTP2 || alproto == ALPROTO_DNS) {
152  return ALPROTO_DOH2;
153  }
154  break;
155  }
156  if (sigproto != alproto) {
157  return ALPROTO_FAILED;
158  }
159  return alproto;
160 }
161 
162 /**
163  * \brief Maps the ALPROTO_*, to its string equivalent.
164  *
165  * \param alproto App layer protocol id.
166  *
167  * \retval String equivalent for the alproto.
168  */
169 const char *AppProtoToString(AppProto alproto);
170 
171 /**
172  * \brief Maps a string to its ALPROTO_* equivalent.
173  *
174  * \param String equivalent for the alproto.
175  *
176  * \retval alproto App layer protocol id, or ALPROTO_UNKNOWN.
177  */
178 AppProto StringToAppProto(const char *proto_name);
179 
180 AppProto AppProtoNewProtoFromString(const char *proto_name);
181 
182 void AppProtoRegisterProtoString(AppProto alproto, const char *proto_name);
183 
184 #endif /* SURICATA_APP_LAYER_PROTOS_H */
ALPROTO_IKE
@ ALPROTO_IKE
Definition: app-layer-protos.h:55
ALPROTO_DCERPC
@ ALPROTO_DCERPC
Definition: app-layer-protos.h:44
ALPROTO_DNS
@ ALPROTO_DNS
Definition: app-layer-protos.h:47
ALPROTO_ENIP
@ ALPROTO_ENIP
Definition: app-layer-protos.h:49
ALPROTO_TLS
@ ALPROTO_TLS
Definition: app-layer-protos.h:39
ALPROTO_MODBUS
@ ALPROTO_MODBUS
Definition: app-layer-protos.h:48
AppProto
uint16_t AppProto
Definition: app-layer-protos.h:87
ALPROTO_QUIC
@ ALPROTO_QUIC
Definition: app-layer-protos.h:57
ALPROTO_POP3
@ ALPROTO_POP3
Definition: app-layer-protos.h:71
ALPROTO_JABBER
@ ALPROTO_JABBER
Definition: app-layer-protos.h:42
ALPROTO_IRC
@ ALPROTO_IRC
Definition: app-layer-protos.h:45
ALPROTO_SIP
@ ALPROTO_SIP
Definition: app-layer-protos.h:59
ALPROTO_LDAP
@ ALPROTO_LDAP
Definition: app-layer-protos.h:65
ALPROTO_FTP
@ ALPROTO_FTP
Definition: app-layer-protos.h:37
g_alproto_max
AppProto g_alproto_max
Definition: app-layer-protos.c:30
ALPROTO_SSH
@ ALPROTO_SSH
Definition: app-layer-protos.h:40
ALPROTO_DHCP
@ ALPROTO_DHCP
Definition: app-layer-protos.h:58
ALPROTO_KRB5
@ ALPROTO_KRB5
Definition: app-layer-protos.h:56
ALPROTO_MAX_STATIC
@ ALPROTO_MAX_STATIC
Definition: app-layer-protos.h:80
ALPROTO_DNP3
@ ALPROTO_DNP3
Definition: app-layer-protos.h:50
ALPROTO_SMTP
@ ALPROTO_SMTP
Definition: app-layer-protos.h:38
StringToAppProto
AppProto StringToAppProto(const char *proto_name)
Maps a string to its ALPROTO_* equivalent.
Definition: app-layer-protos.c:61
ALPROTO_IMAP
@ ALPROTO_IMAP
Definition: app-layer-protos.h:41
ALPROTO_RDP
@ ALPROTO_RDP
Definition: app-layer-protos.h:68
ALPROTO_TELNET
@ ALPROTO_TELNET
Definition: app-layer-protos.h:63
ALPROTO_DOH2
@ ALPROTO_DOH2
Definition: app-layer-protos.h:66
AppProtoRegisterProtoString
void AppProtoRegisterProtoString(AppProto alproto, const char *proto_name)
Definition: app-layer-protos.c:81
ALPROTO_TFTP
@ ALPROTO_TFTP
Definition: app-layer-protos.h:54
ALPROTO_HTTP2
@ ALPROTO_HTTP2
Definition: app-layer-protos.h:69
ALPROTO_LLMNR
@ ALPROTO_LLMNR
Definition: app-layer-protos.h:73
ALPROTO_HTTP1
@ ALPROTO_HTTP1
Definition: app-layer-protos.h:36
ALPROTO_PGSQL
@ ALPROTO_PGSQL
Definition: app-layer-protos.h:62
ALPROTO_FTPDATA
@ ALPROTO_FTPDATA
Definition: app-layer-protos.h:53
ALPROTO_WEBSOCKET
@ ALPROTO_WEBSOCKET
Definition: app-layer-protos.h:64
AppProtoToString
const char * AppProtoToString(AppProto alproto)
Maps the ALPROTO_*, to its string equivalent.
Definition: app-layer-protos.c:41
ALPROTO_MDNS
@ ALPROTO_MDNS
Definition: app-layer-protos.h:72
ALPROTO_MQTT
@ ALPROTO_MQTT
Definition: app-layer-protos.h:61
ALPROTO_HTTP
@ ALPROTO_HTTP
Definition: app-layer-protos.h:77
ALPROTO_UNKNOWN
@ ALPROTO_UNKNOWN
Definition: app-layer-protos.h:29
ALPROTO_FAILED
@ ALPROTO_FAILED
Definition: app-layer-protos.h:33
ALPROTO_TEMPLATE
@ ALPROTO_TEMPLATE
Definition: app-layer-protos.h:67
AppProtoNewProtoFromString
AppProto AppProtoNewProtoFromString(const char *proto_name)
Definition: app-layer-protos.c:75
ALPROTO_RFB
@ ALPROTO_RFB
Definition: app-layer-protos.h:60
ALPROTO_BITTORRENT_DHT
@ ALPROTO_BITTORRENT_DHT
Definition: app-layer-protos.h:70
ALPROTO_NTP
@ ALPROTO_NTP
Definition: app-layer-protos.h:52
ALPROTO_SMB
@ ALPROTO_SMB
Definition: app-layer-protos.h:43
AppProtoEnum
AppProtoEnum
Definition: app-layer-protos.h:28
ALPROTO_NFS
@ ALPROTO_NFS
Definition: app-layer-protos.h:51