]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Merge pull request #2207 in SNORT/snort3 from ~SHRARANG/snort3:avc_http2 to master
authorShravan Rangarajuvenkata (shrarang) <shrarang@cisco.com>
Wed, 20 May 2020 18:29:25 +0000 (18:29 +0000)
committerShravan Rangarajuvenkata (shrarang) <shrarang@cisco.com>
Wed, 20 May 2020 18:29:25 +0000 (18:29 +0000)
Squashed commit of the following:

commit 48e8c835b254ee3a0b3bb8bd986e204d4b6a1534
Author: Shravan Rangaraju <shrarang@cisco.com>
Date:   Tue May 12 00:51:08 2020 -0400

    appid: add api to check if appid needs inspection

12 files changed:
src/framework/inspector.h
src/network_inspectors/appid/appid_api.cc
src/network_inspectors/appid/appid_api.h
src/network_inspectors/appid/appid_config.h
src/network_inspectors/appid/test/appid_api_test.cc
src/network_inspectors/appid/test/appid_detector_test.cc
src/network_inspectors/appid/test/appid_expected_flags_test.cc
src/network_inspectors/appid/test/appid_http_event_test.cc
src/network_inspectors/appid/test/appid_http_session_test.cc
src/network_inspectors/appid/test/appid_mock_definitions.h
src/network_inspectors/appid/test/appid_mock_inspector.h
src/network_inspectors/appid/test/appid_session_api_test.cc

index 1ff8e6d248faf096613ff242f80395d0094787da..0e64f9534cb7327395030be4df2fc6cc37e2af83 100644 (file)
@@ -104,7 +104,7 @@ public:
     void set_service(SnortProtocolId snort_protocol_id_param)
     { snort_protocol_id = snort_protocol_id_param; }
 
-    SnortProtocolId get_service() { return snort_protocol_id; }
+    SnortProtocolId get_service() const { return snort_protocol_id; }
 
     // for well known buffers
     // well known buffers may be included among generic below,
@@ -132,7 +132,7 @@ public:
     const InspectApi* get_api()
     { return api; }
 
-    const char* get_name();
+    const char* get_name() const;
 
     virtual bool is_control_channel() const
     { return false; }
@@ -197,7 +197,7 @@ struct InspectApi
     InspectFunc reset;     // clear stats
 };
 
-inline const char* Inspector::get_name()
+inline const char* Inspector::get_name() const
 { return api->base.name; }
 }
 
index aada456bce19b3b9cb634e45a8540f78fd4da9f8..13b51a12b80fab1517dfd6d5cf20f2e2f34f531b 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "appid_api.h"
 
+#include "framework/inspector.h"
 #include "managers/inspector_manager.h"
 #include "utils/util.h"
 
@@ -309,3 +310,15 @@ void AppIdApi::free_appid_session_api(AppIdSessionApi* api)
 {
     delete api;
 }
+
+bool AppIdApi::is_inspection_needed(const Inspector& inspector) const
+{
+    AppIdInspector* appid_inspector = (AppIdInspector*) InspectorManager::get_inspector(MOD_NAME,
+        true);
+
+    if (appid_inspector and
+        (inspector.get_service() == appid_inspector->get_ctxt().config.snortId_for_http2))
+        return true;
+
+    return false;
+}
index fd5e175db9eee4e4ab3e949b3567a157b6df02fe..f0850af2657937ae529ba86baa56d849760ff0cb 100644 (file)
@@ -63,6 +63,7 @@ public:
         AppId& client_id, AppId& payload_id, const char* org_unit = nullptr);
     AppIdSessionApi* create_appid_session_api(const Flow& flow);
     void free_appid_session_api(AppIdSessionApi* api);
+    bool is_inspection_needed(const Inspector& g) const;
 };
 
 SO_PUBLIC extern AppIdApi appid_api;
index c6a1e4354e2912b2c98797ae1ea41bceda64e8d7..8617fbcfb6f5d9cb5fe14b2df413a9e9318f0dfb 100644 (file)
 #define MIN_MAX_PKTS_BEFORE_SERVICE_FAIL 5
 #define MIN_MAX_PKT_BEFORE_SERVICE_FAIL_IGNORE_BYTES 15
 
-extern SnortProtocolId snortId_for_unsynchronized;
-extern SnortProtocolId snortId_for_ftp_data;
-extern SnortProtocolId snortId_for_http2;
-
 class PatternClientDetector;
 class PatternServiceDetector;
 
index 89791988b7e882b83ae5f723d654371bc11051c1..f6aac46e2f7e8f30797021957086c0f73883fa80 100644 (file)
 
 using namespace snort;
 
+static SnortProtocolId dummy_http2_protocol_id = 1;
+
 namespace snort
 {
 
-class Inspector* InspectorManager::get_inspector(char const*, bool, const SnortConfig*)
-{ return nullptr; }
+class Inspector* InspectorManager::get_inspector(const char*, bool, const SnortConfig*)
+{ return &dummy_appid_inspector; }
+
 }
 
+class DummyInspector : public snort::Inspector
+{
+public:
+    void eval(Packet*) override {};
+};
+
 void DataBus::publish(const char*, DataEvent& event, Flow*)
 {
     AppidEvent* appid_event = (AppidEvent*)&event;
@@ -175,8 +184,7 @@ TEST(appid_api, produce_ha_state)
     ip.pton(AF_INET, "192.168.1.222");
     val = appid_api.consume_ha_state(*flow, (uint8_t*)&appHA, 0, IpProtocol::TCP, &ip, 1066);
     CHECK_TRUE(val == sizeof(appHA));
-    // FIXIT-E refactor below code to test AppId consume functionality
-    /*
+
     AppIdSession* session = (AppIdSession*)flow->get_flow_data(AppIdSession::inspector_id);
     CHECK_TRUE(session);
     CHECK_TRUE(session->get_tp_app_id() == appHA.appId[0]);
@@ -184,21 +192,19 @@ TEST(appid_api, produce_ha_state)
     CHECK_TRUE(session->client_inferred_service_id == appHA.appId[2]);
     CHECK_TRUE(session->service.get_port_service_id() == appHA.appId[3]);
     CHECK_TRUE(session->payload.get_id() == appHA.appId[4]);
-    CHECK_TRUE(session->tp_payload_app_id == appHA.appId[5]);
+    CHECK_TRUE(session->get_tp_payload_app_id() == appHA.appId[5]);
     CHECK_TRUE(session->client.get_id() == appHA.appId[6]);
     CHECK_TRUE(session->misc_app_id == appHA.appId[7]);
     CHECK_TRUE(session->service_disco_state == APPID_DISCO_STATE_FINISHED);
     CHECK_TRUE(session->client_disco_state == APPID_DISCO_STATE_FINISHED);
     delete session;
-    */
 
     // test logic when service app is ftp control
     appHA.appId[1] = APP_ID_FTP_CONTROL;
     mock_flow_data= nullptr;
     val = appid_api.consume_ha_state(*flow, (uint8_t*)&appHA, 0, IpProtocol::TCP, &ip, 1066);
     CHECK_TRUE(val == sizeof(appHA));
-    // FIXIT-E refactor below code to test AppId consume functionality
-    /*
+
     session = (AppIdSession*)flow->get_flow_data(AppIdSession::inspector_id);
     CHECK_TRUE(session);
     uint64_t flags = session->get_session_flags(APPID_SESSION_CLIENT_DETECTED |
@@ -209,7 +215,6 @@ TEST(appid_api, produce_ha_state)
     CHECK_TRUE(session->service_disco_state == APPID_DISCO_STATE_STATEFUL);
     CHECK_TRUE(session->client_disco_state == APPID_DISCO_STATE_FINISHED);
     delete session;
-    */
 }
 
 TEST(appid_api, ssl_app_group_id_lookup)
@@ -283,7 +288,7 @@ TEST(appid_api, create_appid_session_api)
     appid_session_api = appid_api.create_appid_session_api(*flow);
     CHECK_FALSE(appid_session_api);
 
-    AppIdSession ignore_asd(IpProtocol::TCP, nullptr, 1492, appid_inspector);
+    AppIdSession ignore_asd(IpProtocol::TCP, nullptr, 1492, dummy_appid_inspector);
     ignore_asd.common.flow_type = APPID_FLOW_TYPE_IGNORE;
     flow->set_flow_data(&ignore_asd);
     appid_session_api = appid_api.create_appid_session_api(*flow);
@@ -293,10 +298,21 @@ TEST(appid_api, create_appid_session_api)
     flow = old_flow;
 }
 
+TEST(appid_api, is_inspection_needed)
+{
+    DummyInspector inspector;
+    inspector.set_service(dummy_http2_protocol_id);
+    dummy_appid_inspector.get_ctxt().config.snortId_for_http2 = dummy_http2_protocol_id;
+    CHECK_TRUE(appid_api.is_inspection_needed(inspector));
+
+    inspector.set_service(dummy_http2_protocol_id + 1);
+    CHECK_FALSE(appid_api.is_inspection_needed(inspector));
+}
+
 int main(int argc, char** argv)
 {
     mock_init_appid_pegs();
-    mock_session = new AppIdSession(IpProtocol::TCP, nullptr, 1492, appid_inspector);
+    mock_session = new AppIdSession(IpProtocol::TCP, nullptr, 1492, dummy_appid_inspector);
     int rc = CommandLineTestRunner::RunAllTests(argc, argv);
     mock_cleanup_appid_pegs();
     return rc;
index 923a5b944c1dc6e731d25a436b28e48cab0a11ad..1bd157065685fb6d6cbf61364db6f7d774caff9c 100644 (file)
@@ -62,7 +62,7 @@ TEST_GROUP(appid_detector_tests)
     void setup() override
     {
         MemoryLeakWarningPlugin::turnOffNewDeleteOverloads();
-        mock_session = new AppIdSession(IpProtocol::TCP, nullptr, 1492, appid_inspector);
+        mock_session = new AppIdSession(IpProtocol::TCP, nullptr, 1492, dummy_appid_inspector);
         mock_session->get_http_session();
         flow = new Flow;
         flow->set_flow_data(mock_session);
index 175c69215982b1c00d3fb3e7d01608dd6eba1242..5cfcfedb8fa8f3549a213f76196281324ad9316b 100644 (file)
@@ -62,8 +62,8 @@ TEST_GROUP(appid_expected_flags)
     void setup() override
     {
         MemoryLeakWarningPlugin::turnOffNewDeleteOverloads();
-        parent = new AppIdSession(IpProtocol::TCP, nullptr, 1492, appid_inspector);
-        expected = new AppIdSession(IpProtocol::TCP, nullptr, 1492, appid_inspector);
+        parent = new AppIdSession(IpProtocol::TCP, nullptr, 1492, dummy_appid_inspector);
+        expected = new AppIdSession(IpProtocol::TCP, nullptr, 1492, dummy_appid_inspector);
     }
 
     void teardown() override
index 3b2dd62abff54550974a032f99d578e5000da948..80186dfb26222cca6e08e84856bb2efbc954c87f 100644 (file)
@@ -215,7 +215,7 @@ TEST_GROUP(appid_http_event)
     {
         MemoryLeakWarningPlugin::turnOffNewDeleteOverloads();
         flow = new Flow;
-        mock_session = new AppIdSession(IpProtocol::TCP, nullptr, 1492, appid_inspector);
+        mock_session = new AppIdSession(IpProtocol::TCP, nullptr, 1492, dummy_appid_inspector);
         mock_session->create_http_session();
         flow->set_flow_data(mock_session);
         appidDebug = new AppIdDebug();
index f6fd78cc0e7ffb243ca72dbb5368f0d454d1eef3..156648dd7c1a2ad55ebd4dd5ae4bec4c0c556ec3 100644 (file)
@@ -162,7 +162,7 @@ unsigned AppIdSession::inspector_id = 0;
 THREAD_LOCAL AppIdDebug* appidDebug = nullptr;
 
 const SfIp* sfip = nullptr;
-AppIdSession session(IpProtocol::IP, sfip, 0, appid_inspector);
+AppIdSession session(IpProtocol::IP, sfip, 0, dummy_appid_inspector);
 AppIdHttpSession mock_hsession(session, 0);
 
 TEST_GROUP(appid_http_session)
index d41b20ed8e0337747d7169af64903829b6dc48f9..2e343a153cdb44663388004de7ee718868b2e267 100644 (file)
@@ -27,7 +27,6 @@
 #include "service_inspectors/http_inspect/http_msg_header.h"
 #include "utils/stats.h"
 
-class Inspector;
 class ThirdPartyAppIdContext;
 
 ThirdPartyAppIdContext* tp_appid_ctxt = nullptr;
index 66eb7a794aa69bc9dc4a618f1ec360711ce04cc6..9a9aeea9d2dbedaaac48beb3844c8007d417de1d 100644 (file)
@@ -60,7 +60,6 @@ snort::ProfileStats* AppIdModule::get_profile() const { return nullptr; }
 void AppIdModule::set_trace(const Trace*) const { }
 const TraceOption* AppIdModule::get_trace_options() const { return nullptr; }
 
-AppIdInspector::AppIdInspector(AppIdModule& ) { }
 AppIdInspector::~AppIdInspector() { }
 void AppIdInspector::eval(snort::Packet*) { }
 bool AppIdInspector::configure(snort::SnortConfig*) { return true; }
@@ -70,6 +69,10 @@ void AppIdInspector::tterm() { }
 AppIdContext& AppIdInspector::get_ctxt() const { return *ctxt; }
 
 AppIdModule appid_mod;
-AppIdInspector appid_inspector( appid_mod );
+AppIdInspector dummy_appid_inspector( appid_mod );
+AppIdConfig appid_config;
+AppIdContext appid_ctxt(appid_config);
+
+AppIdInspector::AppIdInspector(AppIdModule& ) { ctxt = &appid_ctxt; }
 
 #endif
index d331199464b4389948c849ae2e5d84e772c3196c..1a2fee5066a1a0038c9bf30045511b6c452ff5cb 100644 (file)
@@ -57,7 +57,7 @@ TEST_GROUP(appid_session_api)
     void setup() override
     {
         MemoryLeakWarningPlugin::turnOffNewDeleteOverloads();
-        mock_session = new AppIdSession(IpProtocol::TCP, nullptr, 1492, appid_inspector);
+        mock_session = new AppIdSession(IpProtocol::TCP, nullptr, 1492, dummy_appid_inspector);
         appid_session_api = new AppIdSessionApi(mock_session);
     }